Git - Tips and Tricks


Git Auto Completion

Help - git help command

Cache Git Authentication
git config --global credential.helper 'cache --timeout 72000'
git credential-osxkeychain erase

Git Config
git config --global help.autocorrect 1
git config --get core.editor
git config --global core.editor vi
git config --global user.email your-email
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git log -l

Push to a Remote Branch with a Different Name
git push origin local-name:remote-name

Make an existing Git branch track a remote branch
git branch -u upstream/foo foo

Switch to a different remote branch
git branch --all
git checkout remotes/origin/develop
git checkout -b develop

Disable push to remote branch
git remote set-url --push remote-name DISABLE
git branch --unset-upstream
--set-upstream-to=remote-name/branch-name

List what remote branch your current branch is tracking
git branch -vv or just git status

Show only modified files
git status -uno
git status | grep modified:
git ls-files -m

git fetch --dry-run

git fetch -p 
-p, --prune After fetching, remove any remote-tracking branches which no longer exist on the remote.


git branch -d[D] the_local_branch
Temporarily ignoring files
git update-index --assume-unchanged file-path
git update-index --no-assume-unchanged file-path
Get a list of files marked --assume-unchanged:
git ls-files -v|grep '^h'

Git Diff
git diff --name-only  -- *.java
git diff --cached

Compare files from different branches
git diff branch1:branch2 file-path
git diff ..branch2 file-path

git diff branch2.. file-path

Viewing Unpushed Git Commits
git diff origin/master..HEAD

Change commit message:
git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”
Changing the Last Commit
git commit --amend
Skip commit hooks

git commit --no-verify (-n)

Force push without any change
git commit --allow-empty --amend  && git push -f

git add -A - stages All
git add .    - stages new and modified, without deleted
git add -u  - stages modified and deleted, without new

Unmodifying a Modified File
git checkout -- ..." to discard changes in working directory

Git reset
https://davidzych.com/difference-between-git-reset-soft-mixed-and-hard/
Reset local branch to be same as remote branch
git fetch --all
git reset --hard origin/master

Reset committed file:
git reset file

Undo add
git reset

Undo last commit
git reset --soft HEAD~
git reset --soft HEAD~X(number)

Unstaging a Staged File
use "git reset HEAD ..." to unstage

Reset local repository branch to be same as remote repository
git reset --hard origin/master

Squash Last 2 Git Commits
git reset --soft HEAD~2
git commit -m "New message for the combined commit"

Undo last reset
git reset 'HEAD@{1}'

Replace local file with file from remote another branch
git checkout remote/branch -- a/file (seems we can ignore --)

Delete Local Branch:
git branch -D branch-name
Delete remote branch:
git push origin --delete branch-name

git log
git --no-pager log -n 20 --graph --pretty=format:'%Cred%h%Creset %an: %s - %Creset %C(yellow)%d%Creset %Cgreen(%cr)%Creset' --abbrev-commit --date=relative
Filtering
By amount - show last 3 commits only
git log -3

git log --author=abc
git log -S "search-term"
git log file
git log -Ssearch-term -p - show the diff of each commit
Search for the regex in the diff of each commit
git log -G'regx'


git grep -n something

Show all of the commits that are in branchA, but aren’t the master
git log master..branchA

View unpushed commits
git log origin/master..HEAD
git diff origin/master..HEAD


Checkout file from another branch
git checkout branch2 filePath
Checkout file from remote brnach
git checkout origin/master filePath Create a branch from a tag
git checkout -b newbranch theTag

Patch
git format-patch master --stdout > a.patch
git apply --stat a.patch
git apply --check a.patch
git apply --reject --whitespace=fix a.patch

No one shall rebase a shared branch
stash
- We can stash change and apply it in another branch
git stash
git stash save "a_name_here"
git stash list

git stash drop stash@{0}

Git commands
Merge code from another remote branch to current local branch
git pull origin remote-branch-name

Merge code from a branch from another remote to current local branch
git pull another-remote remote-branch-name

After git remote add, run git fetch --all to fetch remote branch info/

Find who made the change
Find any commit that added or removed the string 
git log -Sthe-query

gitk filePath
Get a file from a specific commit
git show commitHash:/path/to/file - show whole file content in that commit
git show commitHash /path/to/file - show changes only

Track all remote branches
- When there are remote branches on the server that aren't tracked by local branches
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

GUI
sourceTree

Github
Searching - link
in:path, in:file repo:org_name/repo_name
path:sub-project/sub-folder
filename:the-name
extension:yml
repo:org/repo-name
-repo:repo1 -repo:repo2
"extends XYZClass"

Comparing
https://github.com/octo-org/wikimania/compare/master@{2weeks}...master

View/Monitor PRs or issues in one places
https://github.com/pulls
https://github.com/issues

Use split diff view to compare PR and commits
https://github.com/blog/1884-introducing-split-diffs

Compare changes between tags/branches
https://github.com/{username}/{repo}/compare/{older-tag}...{newer-tag}

Ignore Whitespace in pull request
Adding ?w=1 to any diff URL will remove any changes only in whitespace, enabling you to see only that code that has changed.

Shortcuts
press ? to show all shortcuts
Pressing t will bring up a file explorer.
Pressing s will focus the search field for the current repository. Pressing Backspace to delete the “This repository” to search all of GitHub.
Pressing w will bring up the branch selector.

octotree : Chrome extensio to display GitHub code in tree format
https://chrome.google.com/webstore/detail/octotree/bkhaagjahfmjljalopjnoealnfndnagc?hl=en-US

Expand all "outdated diff" comments in a GitHub pull request
Run in chrome dev console:
elements = document.getElementsByClassName("outdated-diff-comment-container");
for (var i=0; i<elements.length; i++) { elements[i].className += " open"; }

Sort user and organization repositories by star count on the repositories tab and org home page
https://github.com/search?q=user:abc&s=stars&type=Repositories

URL to create a pull request between different two branches
/compare/remote:branch...remote:branch

Close pull request without merging
https://help.github.com/articles/closing-a-pull-request/

Revert Pull Request

Resources
https://git-scm.com/book/en/v2

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)