ITK/Git/TipsAndTricks

From KitwarePublic
< ITK‎ | Git
Jump to: navigation, search

Tips

Editor support

Emacs users: if you put this line in your .emacs file:

(setq auto-mode-alist (cons '("COMMIT_EDITMSG$" . auto-fill-mode) auto-mode-alist))

Git will automatically wrap your commit messages, which is what good git etiquette requires.

Shell customization

Bash completion

Bash users: git comes with a set of completion options that are very useful. The location of the file varies depending on your system:

 source /opt/local/share/doc/git-core/contrib/completion/git-completion.bash  # Mac with git installed by Mac Ports
 source /usr/share/bash-completion/git       # Linux
 source /etc/bash_completion.d/git           # Linux debian/gentoo

Bash prompt

If you are using the bash shell, you can customize the prompt to show which git branch is active. Here are the commands for your ~/.bashrc file:

source /etc/bash_completion.d/git   # or one of the appropriate paths from the above section
export GIT_PS1_SHOWDIRTYSTATE=1  
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="verbose" 
export PS1="[\[\e[01;34m\]\W\[\e[31m\]\$(__git_ps1 " (%s)")\[\e[00m\]]\[\e[00m\]
  1. For more information on the options, see the comments in the top of the bash completion script.

Renaming

Git does not explicitly track renames. The command

$ git mv old new

is equivalent to

$ mv old new
$ git add new
$ git rm old

Neither approach records the rename outright. However, Git's philosophy is "dumb add, smart view". It uses heuristics to detect renames when viewing history after-the-fact. It even works when the content of a renamed file changes slightly.

In order to help Git efficiently detect the rename, it is important to remove the old file and add the new one in one commit, perhaps by using git mv or the above 3-step procedure. If the new file were added in one commit and the old file removed in the next, Git would report this as a copy followed by a removal. It's copy-detection heuristics are more computationally intensive and must be explicitly enabled with the -C option to relevant operations (such as git blame).