DIE ZENTRALEN THESEN
Um einen Entwicklungszweig in den aktuellen Zweig einzufügen, verwenden Sie „git merge dev-branch-name“. Wenn Sie Konfliktwarnungen zu einer Zusammenführung erhalten, verwenden Sie „git merge –abort“, um sie rückgängig zu machen, oder bearbeiten Sie die betroffenen Dateien und committen Sie sie dann.
Es verschmilzt alles zu einem.
Git verwendet Zweige, um Entwicklungsströme zu isolieren und zu verhindern, dass der Zweig der stabilen Version verunreinigt wird. Um die Arbeit in einem Zweig in den Hauptstrom zu bringen, müssen Zweige zusammengeführt werden. So geht das.
Was ist ein Merge in Git?
Git wurde entwickelt, um das Verzweigen einfach und schnell zu machen. Im Gegensatz zu anderen Versionskontrollsystemen ist das Verzweigen bei Git eine triviale Angelegenheit. Insbesondere bei Projekten mit mehreren Entwicklern ist das Verzweigen eines der wichtigsten Organisationstools von Git.
Zweige führen neue Entwicklungsbemühungen in einer Sandbox durch, sodass Code geändert oder hinzugefügt werden kann, ohne den Code in anderen Zweigen, insbesondere dem Haupt- oder Masterzweig, zu beeinträchtigen. Dieser enthält normalerweise die stabile Version Ihrer Codebasis.
Es ist durchaus sinnvoll, diese Änderungen von Ihrer stabilen Codeversion zu isolieren. Aber früher oder später wird der neue Code getestet, überprüft und freigegeben, um in den Master-Zweig übernommen zu werden. An diesem Punkt müssen Sie Ihren Zweig in den Master-Zweig integrieren.
Tatsächlich können Zweige Unterzweige haben, sodass Sie Ihren Zweig möglicherweise in einen anderen Zweig anstatt in den Hauptzweig zusammenführen. Denken Sie daran, dass bei Zusammenführungen immer ein Zweig genommen und in einen Zielzweig zusammengeführt wird, was auch immer dieser Zweig sein mag. Wenn Sie Ihren Hauptzweig in einen anderen Zweig zusammenführen möchten, können Sie das auch tun.
Wie die meisten Aktionen in Git führen Sie Zusammenführungen in Ihrem lokalen Repository durch und übertragen sie in Ihr Remote-Repository.
Vorbereiten der Zusammenführung eines Zweigs in Git
Wir haben ein kleines Entwicklungsprojekt mit einem lokalen Git-Repository und einem Remote-Git-Repository. Wir haben aus dem „Master“-Branch einen Branch namens „bugfix14“ erstellt und an einer Lösung für einen Fehler gearbeitet.
Diese Arbeit ist abgeschlossen und wir haben unseren Code getestet. Er funktioniert wie erwartet. Wir möchten diese Änderungen in den Master-Zweig einbinden, damit unser Fix Teil der nächsten Version der Software ist.
Bevor wir die Zusammenführung durchführen, müssen noch ein paar Vorbereitungen getroffen werden. Wir müssen sicherstellen, dass der Zielzweig – in diesem Fall der „Master“-Zweig – und der Zweig, den wir darin zusammenführen werden, beide auf dem neuesten Stand sind.
Dazu verwenden wir die
Befehl.
- Zum Zweig Bugfix14 : Dies ist unser aktueller Zweig.
- Ihr Zweig ist mit „origin/bugfix“ auf dem neuesten Stand : Der Zweig in unserem lokalen Repository hat denselben Commit-Verlauf wie der Zweig im Remote-Repository. Das heißt, sie sind identisch.
- nichts zum Festschreiben. Es gibt keine Änderungen im Staging-Bereich, die nicht festgeschrieben wurden.
- Arbeitsbaum sauber : Es gibt keine nicht bereitgestellten Änderungen im Arbeitsverzeichnis.
All dies zeigt an, dass der Zweig auf dem neuesten Stand ist und wir fortfahren können. Wenn eines dieser Elemente anzeigt, dass Änderungen vorhanden sind, müssen wir sie bereitstellen, festschreiben und an das Remote-Repository übertragen. Wenn jemand anderes an diesen Dateien gearbeitet hat, müssen wir seine Änderungen möglicherweise aus dem Remote-Repository abrufen.
Das Auschecken des Zweigs, in den wir zusammenführen, vereinfacht den Zusammenführungsprozess. Außerdem können wir so überprüfen, ob er auf dem neuesten Stand ist. Werfen wir einen Blick auf den Master-Zweig.
Wir erhalten die gleichen Bestätigungen, dass der „Master“-Zweig auf dem neuesten Stand ist.
Durchführen einer Zusammenführung
Vor dem Zusammenführen sehen unsere Commits folgendermaßen aus.
Der Zweig „bugfix14“ wurde vom Zweig „master“ abgezweigt. Nachdem der Zweig „bugfix14“ erstellt wurde, gab es ein Commit zum Zweig „master“. Es gab mehrere Commits zum Zweig „bugfix14“.
Wir haben sichergestellt, dass unsere beiden Zweige auf dem neuesten Stand sind, und wir haben den Zweig „Master“ ausgecheckt. Wir können den Befehl ausgeben, um den Zweig „bugfix14“ mit dem Zweig „Master“ zusammenzuführen.
Die Zusammenführung findet statt. Der Zweig „bugfix14“ existiert noch, aber jetzt wurden die in diesem Zweig vorgenommenen Änderungen in den Zweig „master“ zusammengeführt.
In diesem Fall führt der Merge-Befehl einen Drei-Wege-Merge durch. Es gibt nur zwei Zweige, aber drei Commits sind beteiligt. Sie sind der Kopf jedes Zweigs und ein dritter Commit, der die Merge-Aktion selbst darstellt.
Um unser Remote-Repository zu aktualisieren, können wir den Befehl „git push“ verwenden.
Manche Leute ziehen es vor, Seitenzweige nach der Zusammenführung zu löschen. Andere bewahren sie lieber als Aufzeichnung der wahren Entwicklungsgeschichte des Projekts auf.
Wenn Sie den Zweig löschen möchten, können Sie dies mit dem git branchBefehl mit der -dOption (löschen) tun.
Um den Zweig im Remote-Repository zu löschen, verwenden Sie diesen Befehl:
Sie erhalten zwar einen linearen Commit-Verlauf, dieser entspricht jedoch nicht dem wahren Verlauf.
Durchführen einer Fast-Forward-Zusammenführung in Git
Wenn Sie keine Commits zum „Master“-Zweig vorgenommen haben, sieht Ihr Verlauf folgendermaßen aus. Er sieht auch so aus, wenn Sie Ihren Entwicklungszweig so umbasiert haben , dass er an das Ende des „Master“-Zweigs angehängt ist.
Da es im „Master“-Zweig keine Commits gibt, muss Git zum Zusammenführen des „Bugfix15“-Zweiges lediglich den „Master“-Kopfzeiger auf das letzte Commit des „Bugfix15“-Zweiges richten.
Wir können den üblichen Befehl verwenden git merge:
Das gibt uns dieses Ergebnis.
Was dasselbe ist wie das hier:
Das ist genau dasselbe wie das hier:
Git führt, wann immer möglich, einen Fast-Forward-Merge durch. Wenn Commits zum „Master“-Branch bedeuten, dass ein Fast-Forward-Merge nicht möglich ist, verwendet Git einen Drei-Wege-Merge.
Sie können eine Fast-Forward-Zusammenführung nicht erzwingen – vielleicht ist das ja nicht möglich –, aber Sie können festlegen, dass es sich um eine Fast-Forward-Zusammenführung handelt oder nicht. Es gibt eine Option, die Git anweist, eine Fast-Forward-Zusammenführung zu verwenden, wenn dies möglich ist, aber keine Drei-Wege-Zusammenführung durchzuführen, wenn dies nicht möglich ist. Die Option lautet –ff-only(nur Fast-Forward-Zusammenführung).
Dadurch wird der Zweig „bugfix15“ mit dem Zweig „master“ zusammengeführt, allerdings nur, wenn eine Fast-Forward-Zusammenführung möglich ist.
Wenn dies nicht möglich ist, wird Git eine Fehlermeldung ausgeben und beendet.
In diesem Fall gab es Commits zum „Master“-Zweig, sodass ein Fast-Forward-Merge nicht möglich ist.
So lösen Sie Merge-Konflikte in Git
Wenn in beiden Zweigen dieselben Teile derselben Datei geändert wurden, können die Zweige nicht zusammengeführt werden. Um die widersprüchlichen Änderungen zu beheben, ist menschliches Eingreifen erforderlich.
Hier haben wir Änderungen an einer Datei namens „rot.c“ in einem Zweig namens „bugfix17“ vorgenommen, die wir in den Zweig „master“ integrieren möchten. Aber „rot.c“ wurde auch im Zweig „master“ geändert.
Wenn wir versuchen, die Dateien zusammenzuführen, erhalten wir eine Warnung, dass es Konflikte gibt. Git listet die in Konflikt stehenden Dateien auf und teilt uns mit, dass die Zusammenführung fehlgeschlagen ist. Wir könnten den Vorgang mit der folgenden –abortOption komplett abbrechen:
Das Auflösen von Zusammenführungen ist jedoch nicht so schlimm, wie es klingt. Git hat einiges geleistet, um uns zu helfen. Wenn wir eine der widersprüchlichen Dateien bearbeiten – in unserem Fall haben wir nur eine – werden die widersprüchlichen Codeabschnitte hervorgehoben.
<<<<<<<Jeder Konflikt wird durch sieben Kleiner-als-Zeichen “ “ und sieben Größer-als-Zeichen “ “ begrenzt >>>>>>>, mit sieben Gleichheitszeichen “ =======“ dazwischen.
- Der Code über den Gleichheitszeichen stammt aus dem Zweig, in den Sie zusammenführen.
- Der Code unter dem Gleichheitszeichen ist der Code aus dem Zweig, den Sie zusammenführen möchten.
Sie können ganz einfach nach einem der sieben Zeichensätze suchen und sich in Ihrer Datei von Konflikt zu Konflikt bewegen. Für jeden Konflikt müssen Sie auswählen, welchen Bearbeitungssatz Sie behalten möchten. Sie müssen den Code, den Sie ablehnen, und die sieben Zeichen umfassenden Zeilen, die Git hinzugefügt hat, herausnehmen Wake-on-LAN.
Wir behalten den Code aus dem Zweig „bugfix17“. Nach der Bearbeitung sieht unsere Datei so aus.
Wir können nun mit dem Zusammenführen fortfahren. Beachten Sie jedoch, dass wir commithierfür den Befehl verwenden, nicht den mergeBefehl.
Wir committen die Änderung, indem wir die Datei bereitstellen und wie üblich committen. Wir prüfen den Status, bevor wir das endgültige Commit durchführen.
Die Zusammenführung ist abgeschlossen. Wir können dies jetzt in unser Remote-Repository übertragen.
Alles verschmilzt irgendwann
Alle Zweige müssen letztendlich zusammengeführt werden, damit die darin enthaltenen Änderungen nicht verwaist und vergessen werden.
Das Zusammenführen von Zweigen ist einfach, aber der Umgang mit Konflikten kann in vielbeschäftigten, größeren Teams kompliziert werden. Die Lösung von Konflikten kann Input von jedem Entwickler erfordern, nur um zu erklären, was sein Code macht und warum er seine Änderungen vorgenommen hat. Sie müssen das verstehen, bevor Sie eine fundierte Entscheidung darüber treffen können, welche Änderungen beibehalten werden sollen.
Leider kann Git dabei nicht helfen.