Willkommen zu unserer ultimativen Anleitung zu den git merge
und git rebase
Befehlen. In diesem Tutorial erfahren Sie alles, was Sie über das Kombinieren mehrerer Zweige mit Git wissen müssen.
Git Merge
Der git merge
Befehl 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 dev
und 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 branch
oder nach dem git rebase master
Auschecken 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 rebase
in der Konsole mit einer Liste von Commits können Sie die Rebase auswählen, bearbeiten oder ablegen:
- Geben Sie ein,
git rebase -i HEAD~5
wobei 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
esc
danni
, um den Test zu bearbeiten. - Auf der linken Seite können Sie das
pick
mit einem der folgenden Befehle überschreiben . Wenn Sie ein Commit in ein vorheriges quetschen und die Commit-Nachricht verwerfen möchten, geben Sief
an die Stelle despick
Commits 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 --continue
bis die Rebase erfolgreich ist. - Wenn es erfolgreich neu basiert, müssen Sie Ihre Änderungen erzwingen,
git push -f
um 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 vongit rebase --continue
. Sie können das in Konflikt stehende Commit überspringen, indem Sie esgit rebase --skip
eingeben, und die Neubasierung beenden, indem Sie esgit rebase --abort
in 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é.txt
Datei 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 <<<<<<< HEAD
und =======
ist der Inhalt des aktuellen Zweigs, auf den der HEAD-Verweis verweist. Auf der anderen Seite ist alles zwischen =======
und >>>>>>> updated_address
ist der Inhalt in dem Zweig, der zusammengeführt wird updated_address
.
Git Merge vs Git Rebase
Beide git merge
und git rebase
sind 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 merge
Ausfü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 rebase
stattdessen 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.