User Tools

Site Tools







  • rebase a branch, w/o flatten merge commits:1)
    git rebase -p
  • interactive edit/re-arrange/squash the last 3 commits (example):
    git rebase -i HEAD~3
  • cherry pick a commit to index:
    git cherry-pick -n -Xpatience <commit>
  • revert all commits (not pushed so far) up to <commit>, and keep all changes in worktree/index:
    git reset --soft <commit>


  • list remote branches:
    git branch -r
  • create (and switch to) branch:
    git checkout -b <branchname>
  • create branch and take over all working tree changes:
    git stash branch <branchname>
  • push local branch to origin (create remote branch on demand):
    git push origin <branchname>
  • change remote tracking branch:
    git branch --set-upstream-to=origin/<any> <branchname>
  • print name of current branch:
    git rev-parse --abbrev-ref HEAD

    or with a Bash alias:

            local name="$(git rev-parse --abbrev-ref HEAD)"
            echo "$name"
        alias gbn=git_branch_name
  • print revision of branch base (gbb):
    git merge-base --fork-point HEAD
After a rebase this command prints the rebase point, not the original fork point.


  • print summary of commits in branch:
    git log --first-parent --pretty=oneline $(gbb)~..HEAD
  • show changed files in branch (local):
    git diff --name-status $(gbb)~ HEAD --
  • show graphical history:
    git log --graph --oneline --all


  • list all tags, incl. comments:
    git tag -n
  • create (annotated) tag:
    git tag -a v0.5 -m "release 0.5"


  • create a (mbox) patchset, to be applied with git am:2)
    git format-patch -s -M --stat --summary --cover-letter -o mboxdir origin/devel..
  • create a patch, to be applied with patch:3)
    git diff [--cached] > patchfile
  • create a patch (using Diff, not Git), to be applied with patch:
    diff -Naur file1 file2 > patchfile

    (-N »treat absent files as empty, -r »recursive, -a »treat all files as text, -u »unified context)

  • Ediff with Emacs:
    git difftool --tool=ediff file
Prefer git format-patch / git am against git diff / git apply, because of it's better conflict resolution capabilities.


  • apply a (mbox) patchset, created with git format-patch:
    git am --reject mboxdir/mboxfile
  • send a (mbox) patchset as e-mail:4)
    git send-email --no-signed-off-cc --to="user1 <>" --cc="user2 <>" mboxdir/mboxfile/
  • apply a patchfile with patch:
    patch -p1 < patchfile


  • show tracked remote repos:
    git remote -v
  • change origin URL:
    git config remote.origin.url ssh://<user>@<server>:<port>/<repo>
  1. Proper working of some commands can be ensured only in conjunction with my Git configuration (see section Files below).
  2. In particular i use Emacs for most development tasks, also in VC or Magit mode (see also the Git difftool script for Ediff).


  • Especially on MinGW the following error message is very common (with transport protocol HTTPS): SSL certificate problem: unable to get local issuer certificate. This problem can be solved by suppressing the issuer certificate validation with:
    git config --global http.sslVerify false
This contradicts the idea of certificates and might be a security issue.


  • /etc/gitconfig: system-wide Git configuration file
  • ~/.gitignore: ignored files (see core.excludesfile in file ~/.gitconfig below)
  • ~/.gitmessage.txt: commit template (see commit.template in file ~/.gitconfig below)
  • ~/.gitconfig: users global Git configuration:
    # -*- mode: conf -*-
    # Copyright (C) 2018 Ralf Hoppe <>
    	name = Ralf Hoppe
    	email =
    	editor = emacs
    	excludesfile = ~/.gitignore
    	branch = false
    	diff = auto
    	status = auto
    	branch = auto
    	interactive = auto
    	status = auto
    	diff = auto
    	helper = cache
    	template = ~/.gitmessage.txt
    	abbrevCommit = true
    #	smtpserver = ???
    	from = Ralf Hoppe <>
    	envelopesender =
    	suppressfrom = true # do not add From: address to the cc: list
    	confirm = auto # confirm before sending on automatic adding of addresses
    	thread = false # no threading by git-send-email (see git-format-patch)
    #	git config --global pull.rebase preserve
    #	use rebase (instead of merge) after fetch and do not flatten local merge commits (Git 1.8.5)
    #	rebase = preserve
    #	use rebase (instead of merge) after fetch (Git 1.7)
    	rebase = true
    	tool = ediff
    	guitool = ediff
    	prompt = false # do not prompt before launch
    	cmd = $LOCAL $REMOTE
    	tool = ediff
    	keepBackup = false
    	keepBackup = false
    	trustExitCode = true
    	# "git push" without any refspec will push the current branch out to
    	# the same name at the remote repository only when it is set to track
    	# the branch with the same name over there
    	default = simple
    	signoff = true # add Signed-off-by: line to the commit message
    	thread = shallow # do threading in git-format-patch
See also option pull.rebase in .gitconfig
Conforming to Linux kernel submit guideline.
There is no need for option --no-prefix if applied with git apply.
Send as shallowed thread according to configuration option format.thread in file ~/.gitconfig.
If after a rebase (or twiddling with refs) it seems that all commits were lost then use git reflog show in conjunction with git reset.
development/vc/git/start.txt · Last modified: 2021/02/15 10:20 by Ralf Hoppe