User Tools

Site Tools


development:vc:git:start

Git

Overview

Articles

Commands

Commits

  • 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>

Branches

  • 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:

        git_branch_name()
        {
            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.

Log

  • 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

Tags

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

Diff

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

Patch

  • 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 <user1@dummy.com>" --cc="user2 <user2@dummy.com>" mboxdir/mboxfile/
  • apply a patchfile with patch:
    patch -p1 < patchfile

Repo

  • show tracked remote repos:
    git remote -v
  • change origin URL:
    git config remote.origin.url ssh://<user>@<server>:<port>/<repo>
NOTES:
  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).

Troubleshooting

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

Files

  • /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 <ralf@dfcgen.de>
    #
    [user]
    	name = Ralf Hoppe
    	email = ralf.hoppe@ieee.org
     
    [core]
    	editor = emacs
    	excludesfile = ~/.gitignore
     
    [pager]
    	branch = false
     
    [color]
    	diff = auto
    	status = auto
    	branch = auto
    	interactive = auto
    	status = auto
    	diff = auto
     
    [credential]
    	helper = cache
     
    [commit]
    	template = ~/.gitmessage.txt
     
    [log]
    	abbrevCommit = true
     
    [sendemail]
    #	smtpserver = ???
    	from = Ralf Hoppe <ralf.hoppe@ieee.org>
    	envelopesender = ralf.hoppe@ieee.org
    	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)
    [pull]
    #	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
    [diff]
    	tool = ediff
    	guitool = ediff
     
    [difftool]
    	prompt = false # do not prompt before launch
     
    [difftool.ediff]
    	cmd = ediff.sh $LOCAL $REMOTE
     
    [merge]
    	tool = ediff
     
    [mergetool]
    	keepBackup = false
     
    [mergetool.ediff]
    	cmd = ediff.sh $LOCAL $REMOTE $MERGED $BASE
    	keepBackup = false
    	trustExitCode = true
     
    [push]
    	# "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
     
    [format]
    	signoff = true # add Signed-off-by: line to the commit message
    	thread = shallow # do threading in git-format-patch
1)
See also option pull.rebase in .gitconfig
2)
Conforming to Linux kernel submit guideline.
3)
There is no need for option --no-prefix if applied with git apply.
4)
Send as shallowed thread according to configuration option format.thread in file ~/.gitconfig.
5)
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