Git notes

From raju

Tips

frequently used

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).

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>

or

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 <foo@bar.com> 1398017575 -0400
committer Foo Bar <foo@bar.com> 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

Ref :- https://stackoverflow.com/questions/677436/how-to-get-the-git-commit-count

multiple repositories

The mr tool in myrepos is very handy when working with multiple git repositories. See http://myrepos.branchable.com/ for more details.

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"


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/ .

In particular, to migrate the sampleusage project from sourceforge to github, I did

Login into github website
create a new repository called sampleusage: https://github.com/KamarajuKusumanchi/sampleusage
git clone --bare ssh://kamaraju@git.code.sf.net/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 git@github.com:KamarajuKusumanchi/sampleusage.git
cd sampleusage
git config user.name "KamarajuKusumanchi"
git config user.email "kamaraju@gmail.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

viewing diffs

merge a development branch into master

gitlab

pruning

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

To list the last 3 commits that changed a file

git log -n3 --follow -- filename

Ref:- https://stackoverflow.com/questions/3701404/list-all-commits-for-a-specific-file

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

external links

git commands usage

git stash

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

git cherry-pick commit_hash

Ref:- https://stackoverflow.com/questions/9339429/what-does-cherry-picking-a-commit-with-git-mean

branches related

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.

delete a remote branch

git push origin --delete feature/login


Ref:- https://www.git-tower.com/learn/git/faq/delete-remote-branch

Configuration related

Configure http proxy

 git config --global http.proxy http://login:password@your.proxy.server:port

git config settings

To check which config comes from which file

git config --list --show-origin

Related commands

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

?


workflow

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