Table of Contents
Merging ist das anwenden der Änderungen von einem Branch auf einen anderen. In der oben gezeigten Visualisierung ist zu sehen, dass die 2 unterschiedlichen Abzweigungen des Repositories am Ende wieder zusammenführen.
Befehl
git merge <branch-name>
D.h. der aktuelle Branch ist der „empfangene“ Branch der die Änderungen vom angegeben Branch übernehmen soll.
Am dem beschriebenen Beispiel von „Branches“ kann folgender Befehl durchgeführt werden um die Änderungen vom Branch „small-feature“ auf den master Branch anzuwenden. (Vorausgesetzt es ist der master Branch aktuell ausgecheckt)
git merge small-feature
Folgender Output wird angezeigt:
Aktualisiere 4bcd766..4d7056f
Fast-forward
source.txt | 1 +
1 file changed, 1 insertion(+)
Damit wird die 1 Zeile, die im small-feature Branch hinzugefügt wurde, auch am master Branch in diese Datei hinzugefügt.
Merge Conflict
Wenn möglich versucht GIT so gut wie es möglich ist die unterschiedlichen Source-Code Zustände beim mergen zu vereinigen.
Jedoch kann es vorkommen, dass GIT nicht weiß, wie der Code zusammengefasst werden soll. Dies ist dann ein sogenannter „Merge Conflict“.
Wann entsteht ein Merge Conflict?
Ein Merge Conflict tritt auf, wenn auf 2 unterschiedlichen Branches in der selben Datei in der selben Zeile etwas geändert bzw. gelöscht wurde.
Wie sieht ein Merge Conflict aus?
Bleiben wir beim Beispiel von „Branches“ nur mit folgenden zusätzlichen Anpassungen:
- Am master-Branch wurde der Inhalt von source.txt von „master“ auf „master-old“ geändert.
- Am small-feature-Branch wurde der Inhalt von source.txt von „master“ auf „master-new“ geändert.
Nun führen wir ein git merge small-feature am master-Branch durch und erhalten folgenden Output am Terminal:
automatischer Merge von source.txt
KONFLIKT (Inhalt): Merge-Konflikt in source.txt
Automatischer Merge fehlgeschlagen; beheben Sie die Konflikte und committen Sie dann das Ergebnis.
Der Inhalt des source.txt sieht nun wie folgt aus:
<<<<<<< HEAD
master-old
=======
master-new
small-feature
>>>>>>> small-feature
Wie zu sehen ist trennt GIT die Stelle mit folgenden Zeichen ab:
- <<<<<<<
- Kennzeichnet den Start des Merge-Conflicts
- =======
- Kennzeichnet die Unterschiede zwischen den 2 Branches
- >>>>>>>
- Kennzeichnet das Ende des Merge-Conflicts
Wie löst man einen merge conflict auf?
Im Prinzip muss nun händisch der Source-Code „aufgeräumt“ werden und jegliche von GIT automatisch hinzugefügten Elemente wieder entfernt werden.
Wir wollen hier die Änderungen vom master-Branch beibehalten aber die „neue“ Zeile vom small-feature Branch auch behalten, d.h. der neue Inhalt der source.txt sieht wie folgt aus:
master-old
small-feature
Bei betrachten des git status sieht man nun folgenden Output:
Auf Branch master
Sie haben nicht zusammengeführte Pfade.
(beheben Sie die Konflikte und führen Sie "git commit" aus)
(benutzen Sie "git merge --abort", um den Merge abzubrechen)
Nicht zusammengeführte Pfade:
(benutzen Sie "git add/rm <Datei>...", um die Auflösung zu markieren)
von beiden geändert: source.txt
keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")
D.h. da wir nun die Datei wieder geändert haben müssen wir die „gemergte“ Datei neu zum Repository hinzufügen und commit.
git add source.txt
git commit -m "merged"
D.h. final sieht unsere git log wie folgt aus:
commit f9997203d5f7887ca30b4e69752291706d81755d (HEAD -> master)
Merge: dc50e32 2d79e70
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date: Sat Jun 22 21:09:31 2019 +0200
merged
commit dc50e3242da6cc17d822e3adf04ae4ca9edd62b1
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date: Sat Jun 22 20:53:35 2019 +0200
changed master to master-old
commit 2d79e708b4f7aa2dd4898a990bfd464b8a6080f4 (small-feature)
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date: Sat Jun 22 20:53:14 2019 +0200
changes master to master-new
commit b71b422594ecaf924909cd7477ee73b45a2c9685
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date: Sat Jun 22 20:52:32 2019 +0200
added small-feature
commit 3958f0b2f8f3f0473a6ef6194df4077ac4e45dc5
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date: Sat Jun 22 20:52:21 2019 +0200
master file created