Der ultimative Leitfaden für Git Merge und Git Rebase

Willkommen zu unserer ultimativen Anleitung zu den git mergeund git rebaseBefehlen. In diesem Tutorial erfahren Sie alles, was Sie über das Kombinieren mehrerer Zweige mit Git wissen müssen.

Git Merge

Der git mergeBefehl führt alle Änderungen, die an der Codebasis in einem separaten Zweig vorgenommen wurden, als neuen Commit zu Ihrem aktuellen Zweig zusammen.

Die Befehlssyntax lautet wie folgt:

git merge BRANCH-NAME

Wenn Sie beispielsweise derzeit in einem Zweig mit dem Namen arbeiten devund alle neuen Änderungen, die in einem Zweig mit dem Namen vorgenommen wurden new-features, zusammenführen möchten, geben Sie den folgenden Befehl aus:

git merge new-features

Hinweis: Wenn in Ihrem aktuellen Zweig nicht festgeschriebene Änderungen vorhanden sind, können Sie mit Git erst dann zusammenführen, wenn alle Änderungen in Ihrem aktuellen Zweig festgeschrieben wurden. Um diese Änderungen zu handhaben, können Sie entweder:

Erstellen Sie einen neuen Zweig und übernehmen Sie die Änderungen

git checkout -b new-branch-name git add . git commit -m ""

Verstecke sie

git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree

Geben Sie alle Änderungen auf

git reset --hard # removes all pending changes

Git Rebase

Durch erneutes Basieren eines Zweigs in Git können Sie den gesamten Zweig an einen anderen Punkt im Baum verschieben. Das einfachste Beispiel ist das Verschieben eines Zweigs weiter oben im Baum. Angenommen, wir haben einen Zweig, der an Punkt A vom Hauptzweig abweicht:

 /o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master

Wenn Sie neu aufbauen, können Sie es folgendermaßen verschieben:

 /o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master

Stellen Sie zum erneuten Basieren sicher, dass Sie alle gewünschten Commits in der Rebase in Ihrem Hauptzweig haben. Überprüfen Sie den Zweig, den Sie neu aufbauen möchten, und geben Sie ihn ein git rebase master(wobei master der Zweig ist, auf dem Sie neu aufbauen möchten).

Es ist auch möglich, auf einem anderen Zweig neu zu basieren, so dass beispielsweise ein Zweig, der auf einem anderen Zweig basiert (nennen wir es Feature), auf dem Master neu basiert:

 /---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master

Nach git rebase master branchoder nach dem git rebase masterAuschecken der Filiale erhalten Sie:

 /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch

Git Rebase interaktiv in der Konsole

Zur Verwendung git rebasein der Konsole mit einer Liste von Commits können Sie die Rebase auswählen, bearbeiten oder ablegen:

  • Geben Sie ein, git rebase -i HEAD~5wobei die letzte Zahl eine beliebige Anzahl von Commits von der letzten Rückwärts ist, die Sie überprüfen möchten.
  • Drücken Sie in vim und escdann i, um den Test zu bearbeiten.
  • Auf der linken Seite können Sie das pickmit einem der folgenden Befehle überschreiben . Wenn Sie ein Commit in ein vorheriges quetschen und die Commit-Nachricht verwerfen möchten, geben Sie fan die Stelle des pickCommits ein.
  • Speichern Sie Ihren Texteditor und beenden Sie ihn.
  • Wenn die Rebase gestoppt ist, nehmen Sie die erforderlichen Anpassungen vor und verwenden Sie sie, git rebase --continuebis die Rebase erfolgreich ist.
  • Wenn es erfolgreich neu basiert, müssen Sie Ihre Änderungen erzwingen, git push -fum die neu basierte Version zu Ihrem Remote-Repository hinzuzufügen.
  • Wenn es zu einem Zusammenführungskonflikt kommt, gibt es verschiedene Möglichkeiten, dies zu beheben, einschließlich der Befolgung der Vorschläge in diesem Handbuch. Eine Möglichkeit besteht darin, die Dateien in einem Texteditor zu öffnen und die Teile des Codes zu löschen, die Sie nicht möchten. Dann verwenden, git add gefolgt von git rebase --continue. Sie können das in Konflikt stehende Commit überspringen, indem Sie es git rebase --skipeingeben, und die Neubasierung beenden, indem Sie es git rebase --abortin Ihrer Konsole ausführen .
pick 452b159  pick 7fd4192  pick c1af3e5  pick 5f5e8d3  pick 5186a9f  # Rebase 0617e63..5186a9f onto 0617e63 (30 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but stop to edit the commit message. # e, edit = use commit, but stop to amend or add commit. # s, squash = use commit, meld into previous commit and stop to edit the commit message. # f, fixup = like "squash", but discard this commit's log message thus doesn't stop. # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Konflikte zusammenführen

Ein Zusammenführungskonflikt liegt vor, wenn Sie Commits für separate Zweige vornehmen, die dieselbe Zeile auf widersprüchliche Weise ändern. In diesem Fall weiß Git nicht, welche Version der Datei in einer Fehlermeldung ähnlich der folgenden gespeichert werden soll:

CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.

Wenn Sie sich die resumé.txtDatei in Ihrem Code-Editor ansehen , können Sie sehen, wo der Konflikt stattgefunden hat:

<<<<<<>>>>>> updated_address

Git hat der Datei einige zusätzliche Zeilen hinzugefügt:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> updated_address

Stellen Sie sich   =======die Trennlinie des Konflikts vor. Alles zwischen <<<<<<< HEADund =======ist der Inhalt des aktuellen Zweigs, auf den der HEAD-Verweis verweist. Auf der anderen Seite ist alles zwischen   =======und >>>>>>> updated_addressist der Inhalt in dem Zweig, der zusammengeführt wird updated_address.

Git Merge vs Git Rebase

Beide git mergeund git rebasesind sehr nützliche Befehle, und einer ist nicht besser als der andere. Es gibt jedoch einige sehr wichtige Unterschiede zwischen den beiden Befehlen, die Sie und Ihr Team berücksichtigen sollten.

Bei jeder git mergeAusführung wird ein zusätzliches Merge-Commit erstellt. Wenn Sie in Ihrem lokalen Repository arbeiten und zu viele Zusammenführungs-Commits haben, kann der Commit-Verlauf verwirrend aussehen. Eine Möglichkeit, das Zusammenführungs-Commit zu vermeiden, besteht darin, git rebasestattdessen zu verwenden .

git rebase is a very powerful feature. That being said, it is risky as well if it is not used in the right way. git rebase alters the commit history, so use it with care. If rebasing is done in the remote repository, then it can create a lot of issues when other developers try to pull the latest code changes from the remote repository. Remember to only run git rebase in a local repository.

That's all you need to know to merge and rebase with the best of 'em.