- 1 Tips
- 1.1 frequently used
- 1.2 git pull autostash
- 1.3 rebasing using git gui
- 1.4 git diff N last commits
- 1.5 Generate diff with no context
- 1.6 show modified files in the current directory only
- 1.7 time zone of the committer
- 1.8 number of commits
- 1.9 multiple repositories
- 1.10 Diff word by word
- 1.11 delete branches
- 1.12 Migrate from sourceforge to github
- 1.13 git and vimdiff
- 1.14 viewing diffs
- 1.15 merge a development branch into master
- 1.16 gitlab
- 1.17 pruning
- 1.18 check commits where a file has changed
- 1.19 what files changed between two branches
- 1.20 Change last commit message
- 1.21 Add a file to the last commit
- 1.22 Remove a file that was accidentally committed
- 1.23 external links
- 2 git commands usage
- 3 branches related
- 4 Configuration related
- 5 workflow
- 6 dummy
git pull --rebase --autostash -v origin
git pull autostash
git pull --rebase --autostash
The --autostash works only with --rebase. It was introduced in git 2.6 (2015-09-28).
- Explained very well in https://cscheng.info/2017/01/26/git-tip-autostash-with-git-pull-rebase.html
- documentation - https://git-scm.com/docs/git-pull#git-pull---autostash
rebasing using git gui
Q. How to do git pull --rebase using git gui?
A. The trick is to add a custom command in git gui:
Tools -> Add Name: Pull with Rebase Command: git pull --rebase origin Add globally -> check Add
The new command will appear under Tools menu.
git diff N last commits
git diff HEAD~N
Generate diff with no context
git diff -U0
In general, to generate a diff with <n> lines of context, use
git diff -U<n>
git diff --unified=<n>
The default is 3 lines of context.
show modified files in the current directory only
git status .
or more generally
git status /path/to/dir
works from git 1.7 onwards. Does not work with git 1.6.
time zone of the committer
git cat-file -p <commit-id>
Will show the entire commit object. It will contain two lines like this:
author Foo Bar <email@example.com> 1398017575 -0400 committer Foo Bar <firstname.lastname@example.org> 1398017575 -0400
As you can see, the timezone info follows the Unix-epoch timestamps.
Note that the timezone is something set by the user himself on the client. So it can be easily spoofed by the user if he desires to.
number of commits
To get a commit count for a revision (HEAD, master, a commit hash):
git rev-list --count <revision>
To get the commit count across all branches:
git rev-list --count --all
Author of myrepos - Joey Hess. His contact info is at https://joeyh.name/contact/
Diff word by word
To diff word by word
git diff --color-words
To set up an alias for it
git config --global alias.wdiff "diff --color-words"
which will add the following lines to ~/.gitconfig
[alias] wdiff = diff --color-words
Once done, "git wdiff" will do the same thing as "git diff --color-words"
To delete a remote branch
git push <remote_name> -d <branch_name>
To delete a local branch
git branch -d <branch_name>
Migrate from sourceforge to github
The instructions to move a git repository from sourceforge to github are clearly laid out in https://help.github.com/articles/importing-a-git-repository-using-the-command-line/ .
Login into github website create a new repository called sampleusage: https://github.com/KamarajuKusumanchi/sampleusage git clone --bare ssh://email@example.com/p/sampleusage/git sampleusage-git cd sampleusage-git git push --mirror https://github.com/KamarajuKusumanchi/sampleusage.git cd .. rm -rf sampleusage-git
To get a local copy
git clone firstname.lastname@example.org:KamarajuKusumanchi/sampleusage.git cd sampleusage git config user.name "KamarajuKusumanchi" git config user.email "email@example.com"
Sample work flow once it is all done
git add dummy_file git commit -m "dummy commit message" git push -u origin master
After making sure that everything on github is working properly, I submitted a ticket to delete the original sourceforge project.
git and vimdiff
- http://usevim.com/2012/03/21/git-and-vimdiff/ - contains tips on how to effectively use git, vimdiff and vim together.
- http://365git.tumblr.com/post/474079664/whats-the-difference-part-1 - explains how to diff between HEAD, Index and Working tree
merge a development branch into master
- pricing - https://about.gitlab.com/gitlab-com/
- explore project - https://gitlab.com/explore
- compare terminology across different platforms - https://about.gitlab.com/2016/01/27/comparing-terms-gitlab-github-bitbucket/
To list the branches that are merged into master
git branch --merged master
To list the branches that are merged into HEAD (i.e. tip of the current branch)
git branch --merged
To list the branches that were not merged
git branch --no-merged
By default this only applies to local branches. Use -a to show both local and remote branches; -r to show only remote branches.
To delete all local branches that have been merged into master
git branch --merged | grep -v '\* master' | xargs -n1 git branch -d
To delete all local branches that have been merged into the current branch
git branch --merged | grep -v '^\*' | xargs -n1 git branch -d
check commits where a file has changed
tags | show commits on a single file
To list the last 3 commits that changed a file
git log -n3 --follow -- filename
what files changed between two branches
To compare the current branch against master
$ git diff --name-status master
To compare any pair of branches
$ git diff --name-status firstbranch..secondbranch
Change last commit message
git commit --amend
Add a file to the last commit
git add missed-file.txt git commit --amend
Remove a file that was accidentally committed
- See point (3) in https://about.gitlab.com/2018/08/08/git-happens/ which uses "git reset" to do this.
-  - Explains how to work with git submodules. Easy to read, contains example.
- A few git tips you didn't know about
-  - The section on commit message templates is pretty interesting.
git commands usage
git stash drop - Remove a single stash.
git stash clear - Remove all the stash entries.
Documentation - https://git-scm.com/docs/git-stash
git cherry-pick <Commit1> <Commit2> <...>
- https://learngitbranching.js.org/ -> Moving Work Around -> 1: Cherry-pick Intro
Check commits between two branches
git log branch1..branch2
tags | show commits between two branches
rename a local branch
To rename the current branch
git branch -m <newname>
To rename a branch while in another branch
git branch -m <oldname> <newname>
By default when you push the new branch to the remote, it will add it as a new branch and will not delete the old branch. See https://stackoverflow.com/questions/6591213/how-do-i-rename-a-local-git-branch if you want to rename the branch on the remote while doing the push.
Configure http proxy
git config --global http.proxy http://login:firstname.lastname@example.org:port
git config settings
To check which config comes from which file
git config --list --show-origin
git config --system -l
cache username and passwords
for HTTPS authentication
git config --global credential.helper wincred
This works. But how is it different from
git config --global credential.helper manager
where to put git ignore file
- https://help.github.com/articles/ignoring-files/ - very well explained, brief and to the point.
bring feature branch up to date with development branch
- User 1 raised a merge request to merge feature1 to development branch
- Before the merge request is accepted, development branch is updated by User 2
- Bring the feature1 branch up to date with the latest changes in development branch
git checkout feature1 git merge development git push
Note:- The "git merge development" command works even if you have local changes not committed to feature1.
rebase to another branch
To take BranchB and rebase it on top of BranchA
1) Update BranchA to the latest version if needed
git checkout BranchA git pull --rebase --autostash -v origin
2) Merge changes from BranchA into BranchB
git checkout BranchB git rebase --autostash -v BranchA
This effectively makes BranchB look as if it was branched off of BranchA.
You can also use 'git merge' instead of rebase but that will create a merge commit.
git checkout BranchB git merge BranchA
"Git for Windows" used to be developed using the development environment called "msysGit", but roughly coinciding with Git 2.1, msysGit was superseded by a new development environment.
Ref:- https://github.com/git-for-windows/git/wiki/FAQ -> "What is the relationship between Git for Windows and msysGit?"
Detaching HEAD just means attaching it to a commit instead of a branch. Say we have this beforehand:
HEAD -> master -> C1
git checkout C1
and now it is
HEAD -> C1
- Move upwards one commit at a time with ^
- Move upwards a number of times with ~<num>
git branch -f master HEAD~3
moves (by force) the master branch to three parents behind HEAD.
Two primary ways: git reset, git revert.
Sample command using reset
git reset HEAD~1
Since git reset "rewrites history", you can use it for local branches but not for remote branches.
To reverse changes and share those reversed changes with others, use git revert. For example
git revert HEAD
All interactive rabse means is using the rebase command with the -i option. Sample command
git rebase -i HEAD~4