Merging

Damit ist unser Feature abgeschlossen. Wir mergen es nun nach master. Vor jedem Merge in eine öffentliche Branch (meistens master) muss geprüft werden, ob von anderen Entwicklern Änderungen dorthin gepusht wurden - sonst kann es zu Konflikten kommen.

$ git checkout master
$ git pull
Already up to date.

Gut - es wurde noch nichts verändert. Dann können wir direkt unsere neuesten Entwicklungen zu master hinzufügen.

$ git merge --no-ff feature/simple-build-system

Es öffnet sich ein Editor mit vorkonfigurierter Commit Message. Diese einfach akzeptieren ("Speichern", "Schließen").

Das Flag --no-ff verhindert, dass Git ein sogenanntes Fast-Forward-Merge macht, und die zu mergenden Commits einfach in die aktuelle Branch kopiert. Durch das Flag wird in jedem Fall ein Merge-Commit generiert (welchen wir gerade eben erstellt haben). Das macht die Historie leichter nachvollziehbar.

Merges nach master werden bei uns immer mit --no-ff erstellt.

Die Wirkung des Merge-Commits wird am besten sichtbar, wenn man sich das Log als Graph darstellen lässt. Am einfachsten geht das, wenn folgende Zeilen in ~/.gitconfig eingefügt werden:

[alias]
nice-log = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all

Log mit Merge-Commit

$ git nice-log
* d2492c6 - Mon, 25 Nov 2019 14:49:40 +0100 (16 minutes ago) (HEAD -> master)
|\ Merge branch 'feature/simple-build-system' - Some One
| * 0ba41bd - Mon, 25 Nov 2019 14:44:17 +0100 (21 minutes ago) (feature/simple-build-system)
| | Ignore .class files - Some One
| * d1fe500 - Mon, 25 Nov 2019 13:43:34 +0100 (82 minutes ago)
| | Add Makefile for compiling and running - Some One
| * 062eda1 - Mon, 25 Nov 2019 13:26:17 +0100 (2 hours ago)
|/ Add a source file for testing compilation - Some One
* ad65f62 - Mon, 25 Nov 2019 11:45:51 +0100 (3 hours ago) (origin/master)
Initial commit, add .gitignore and empty README - Some One

Log ohne Merge-Commit

$ git nice-log
* 0ba41bd - Mon, 25 Nov 2019 14:44:17 +0100 (28 minutes ago) (HEAD -> master, feature/simple-build-system)
| Ignore .class files - Some One
* d1fe500 - Mon, 25 Nov 2019 13:43:34 +0100 (88 minutes ago)
| Add Makefile for compiling and running - Some One
* 062eda1 - Mon, 25 Nov 2019 13:26:17 +0100 (2 hours ago)
| Add a source file for testing compilation - Some One
* ad65f62 - Mon, 25 Nov 2019 11:45:51 +0100 (3 hours ago) (origin/master)
Initial commit, add .gitignore and empty README - Some One

Wir können unsere Änderungen nun wieder veröffentlichen:

$ git push
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 8 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (10/10), 1.33 KiB | 1.33 MiB/s, done.
Total 10 (delta 2), reused 0 (delta 0)
To git.honico.com:personal/sone/git-schulung.git
ad65f62..e87d25f master -> master