So verwenden Sie Git-Merge
Veröffentlicht: 2023-01-03Git verwendet Branches, um Entwicklungsstreams zu isolieren und zu verhindern, dass der Stable-Release-Branch verschmutzt wird. Arbeiten in einem Zweig in den Hauptstrom zu bringen bedeutet, Zweige zusammenzuführen. Hier ist, wie Sie es tun.
Was ist eine Zusammenführung in Git?
Vorbereiten der Zusammenführung eines Zweigs in Git
Durchführen einer Zusammenführung
Durchführen einer Fast-Forward-Merge in Git
So lösen Sie Merge-Konflikte in Git
Alles fügt sich schließlich zusammen
Was ist eine Zusammenführung in Git?
Git wurde entwickelt, um das Verzweigen einfach und schnell zu machen. Im Gegensatz zu anderen Versionskontrollsystemen ist das Branching auf Git eine triviale Angelegenheit. Insbesondere bei Multi-Entwickler-Projekten ist Verzweigung eines der zentralen Organisationswerkzeuge von Git.
Verzweigt neue Entwicklungsbemühungen in einer Sandbox, sodass Code geändert oder hinzugefügt werden kann, ohne den Code in anderen Zweigen, insbesondere dem Haupt- oder Hauptzweig, zu beeinträchtigen. Diese enthält normalerweise die stabile Version Ihrer Codebasis.
Es ist absolut sinnvoll, diese Änderungen von Ihrer stabilen Codeversion zu isolieren. Aber früher oder später wird der neue Code getestet, überprüft und abgesegnet, um in den Master-Zweig gerollt zu werden. An diesem Punkt müssen Sie Ihren Branch mit dem Master-Branch zusammenführen.
Tatsächlich können Zweige Unterzweige haben, sodass Sie Ihren Zweig möglicherweise mit einem anderen Zweig anstelle des Hauptzweigs zusammenführen. Denken Sie nur daran, dass Merges immer einen Branch nehmen und ihn mit einem Ziel- Branch zusammenführen, was auch immer dieser Branch sein mag. Wenn Sie Ihren Master-Branch mit einem anderen Branch zusammenführen möchten, können Sie das sogar tun.
Wie die meisten Aktionen in Git führen Sie Zusammenführungen in Ihrem lokalen Repository durch und pushen 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 einen Branch namens „bugfix14“ aus dem „master“-Branch erstellt und an einer Lösung für einen Fehler gearbeitet.
Diese Arbeit ist abgeschlossen und wir haben unseren Code getestet. Es funktioniert alles wie erwartet. Wir wollen diese Änderungen in den Master-Zweig rollen, damit unser Fix Teil der nächsten Version der Software ist.
Bevor wir die Zusammenführung durchführen, müssen einige Vorbereitungen getroffen werden. Wir müssen sicherstellen, dass sowohl der Ziel-Branch – in diesem Fall der „Master“-Branch – als auch der Branch, den wir mit ihm zusammenführen werden, auf dem neuesten Stand sind.
Dazu verwenden wir den Befehl git status
.
Git-Status
- Auf 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 festzuschreiben Es gibt keine Änderungen im Bereitstellungsbereich, die noch nicht festgeschrieben wurden.
- Working Tree clean : Es gibt keine unstagierten Änderungen im Arbeitsverzeichnis.
All dies weist darauf hin, dass der Zweig auf dem neuesten Stand ist, und wir können fortfahren. Wenn eine davon darauf hindeutet, dass Änderungen vorhanden sind, müssen wir sie inszenieren, festschreiben und auf die Fernbedienung übertragen. Wenn jemand anderes an diesen Dateien gearbeitet hat, müssen wir möglicherweise seine Änderungen aus dem Remote-Repository abrufen.
Das Auschecken des Zweigs, in den wir zusammenführen werden, vereinfacht den Zusammenführungsprozess. Es ermöglicht uns auch, die Aktualität zu überprüfen. Werfen wir einen Blick auf den Master-Zweig.
git Checkout-Master
Git-Status
Wir erhalten die gleichen Bestätigungen, dass der „Master“-Zweig auf dem neuesten Stand ist.
VERWANDT: So wählen Sie das Git-Workflow- und Branching-Modell aus, das für Ihr Team geeignet ist
Durchführen einer Zusammenführung
Vor dem Zusammenführen sehen unsere Commits so aus.
Der Zweig „bugfix14“ wurde vom Zweig „master“ abgezweigt. Es gab ein Commit für den Zweig „master“, nachdem der Zweig „bugfix14“ erstellt wurde. Es gab einige Commits für den „bugfix14“-Zweig.
Wir haben sichergestellt, dass unsere beiden Zweige auf dem neuesten Stand sind, und wir haben den „Master“-Zweig überprüft. Wir können den Befehl zum Zusammenführen des „bugfix14“-Zweigs mit dem „master“-Zweig ausgeben.
git zusammenführen bugfix14
Die Zusammenführung erfolgt. Der Zweig „bugfix14“ existiert noch, aber jetzt wurden die Änderungen, die in diesem Zweig vorgenommen wurden, in den Zweig „master“ zusammengeführt.
In diesem Fall führt der Merge-Befehl eine Drei-Wege-Merge durch . Es gibt nur zwei Branches, aber es sind drei Commits beteiligt. Sie sind der Kopf eines jeden Zweigs und ein drittes Commit, das die Merge-Aktion selbst darstellt.
Um unser Remote-Repository zu aktualisieren, können wir den Befehl git push verwenden.
git push
Einige Leute ziehen es vor, Seitenzweige zu löschen, nachdem sie sie zusammengeführt haben. Andere achten darauf, sie als Aufzeichnung der wahren Entwicklungsgeschichte des Projekts zu bewahren.
Wenn Sie den Zweig löschen möchten, können Sie dies mit dem Befehl git branch
mit der Option -d
(Löschen) tun.
git branch -d bugfix14
Verwenden Sie diesen Befehl, um den Zweig im Remote-Repository zu löschen:
git push origin --delete bugfix14
Sie haben einen linearen Commit-Verlauf, aber es wird nicht der wahre Verlauf sein.
VERWANDT: So löschen Sie Git-Zweige in lokalen und Remote-Repositories
Durchführen einer Fast-Forward-Merge in Git
Wenn Sie keine Commits zum „master“-Zweig vorgenommen haben, sieht Ihr Verlauf so aus. Es sieht auch so aus, wenn Sie Ihren Entwicklungs-Zweig rebasiert haben, sodass 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“-Zweigs lediglich den „master“-Kopfzeiger auf den letzten Commit des „bugfix15“-Zweigs zeigen.
Wir können den üblichen git merge
Befehl verwenden:
git zusammenführen bugfix15
Das gibt uns dieses Ergebnis.
Was das gleiche ist:
Was genau dasselbe ist:
Git führt wann immer möglich eine Fast-Forward-Merge durch . Wenn Commits zum „master“-Zweig bedeuten, dass ein Fast-Forward-Merge nicht möglich ist, verwendet Git einen Drei-Wege-Merge .
Sie können eine Fast-Forward-Merge nicht erzwingen – es könnte schließlich nicht möglich sein – aber Sie können deklarieren, dass es eine Fast-Forward-Merge oder nichts sein wird. Es gibt eine Option, die Git anweist, eine Fast-Forward-Merge zu verwenden, wenn es möglich ist, aber keine Drei-Wege-Merge durchzuführen, wenn dies nicht möglich ist. Die Option ist --ff-only
(nur Fast-Forward-Merge).
Dadurch wird der „bugfix15“-Zweig in den „master“-Zweig gemergt, aber nur, wenn ein Fast-Forward-Merge möglich ist.
git merge --ff-only bugfix15
Git wird sich beschweren und beenden, wenn dies nicht möglich ist.
git merge --ff-only bugfix16
In diesem Fall gab es Commits in den „Master“-Zweig, daher ist ein Fast-Forward-Merge nicht möglich.
So lösen Sie Merge-Konflikte in Git
Wenn dieselben Teile derselben Datei in beiden Zweigen geändert wurden, können die Zweige nicht zusammengeführt werden. Menschliche Interaktion ist erforderlich, um die widersprüchlichen Bearbeitungen zu lösen.
Hier haben wir Änderungen an einer Datei namens „rot.c“ in einem Zweig namens „bugfix17“ vorgenommen, den wir mit dem Zweig „master“ zusammenführen möchten. Aber auch im „master“-Zweig wurde „rot.c“ geändert.
git zusammenführen bugfix17
Wenn wir versuchen, es zusammenzuführen, erhalten wir eine Warnung, dass es Konflikte gibt. Git listet die widersprüchlichen Dateien auf und teilt uns mit, dass die Zusammenführung fehlgeschlagen ist. Wir könnten mit der Option --abort
vollständig zurücktreten:
git merge --abort
Aber das Auflösen von Zusammenführungen ist nicht so beängstigend, wie es sich anhört. Git hat einige Arbeit 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 für uns 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 von der Verzweigung, in die 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, welche Gruppe von Änderungen Sie behalten möchten. Sie müssen den Code, den Sie ablehnen, und die von Git hinzugefügten siebenstelligen Zeilen bearbeiten.
Wir behalten den Code aus dem „bugfix17“-Zweig bei. Nach der Bearbeitung sieht unsere Datei so aus.
Wir können jetzt mit der Zusammenführung fortfahren. Beachten Sie jedoch, dass wir dazu den commit
Befehl verwenden, nicht den merge
Befehl.
Wir schreiben die Änderung fest, indem wir die Datei bereitstellen und wie gewohnt festschreiben. Wir überprüfen den Status, bevor wir die endgültige Zusage machen.
git füge rot.c hinzu
Git-Status
git commit -m "Zusammengeführter Bugfix17"
Die Zusammenführung ist abgeschlossen. Wir können dies jetzt in unser Remote-Repository verschieben.
VERWANDT: Wie man Git-Commits repariert, bearbeitet oder rückgängig macht (Ändern des Git-Verlaufs)
Alles fügt sich schließlich zusammen
Alle Zweige müssen schließlich zusammengeführt werden, damit die Änderungen in ihnen nicht verwaist und vergessen werden.
Das Zusammenführen von Branches ist einfach, aber der Umgang mit Konflikten kann in geschäftigen, größeren Teams kompliziert werden. Das Lösen von Konflikten erfordert möglicherweise Eingaben von jedem Entwickler, nur um zu erklären, was sein Code tut und warum er seine Änderungen vorgenommen hat. Sie müssen das verstehen, bevor Sie eine fundierte Entscheidung darüber treffen können, welche Änderungen Sie behalten möchten.
Leider kann Git dabei nicht helfen.
VERWANDT: Sollten Sie einen GUI-Git-Client verwenden?