- Git rebase
- Vor dem Rebasing
- Reguläre Rebase
- Interaktive Rebase
- Force-push
- Merge conflicts
Dieses Handbuch hilft Ihnen, mit Rebasing zu beginnen, gewalttätige Auseinandersetzungen vor Ort.
Bevor Sie in dieses Dokument eintauchen, stellen Sie sicher, dass Sie mit der Verwendung vertraut sindgit über die Befehlszeile.
Git rebase
Rebase ist eine sehr häufige operation inGit., Es gibt die folgenden Rebase-Optionen:
- Reguläre Rebase.
- Interaktive rebase.
Vor dem Rebasing
git rebase
schreibt den Commit-Verlauf neu. Es kann schädlich sein, es ingetrennte Zweige. Es kann komplexe und schwer zu lösende Zusammenführungskonflikte verursachen. inDiese Fälle,anstatt Ihren Zweig gegen den Standardzweig neu zu starten, ziehen Sie ihn stattdessen in Betracht (git pull origin master
). Es hat einen Ähnlicheneffekt, ohne die Arbeit Ihrer Mitwirkenden zu beeinträchtigen.,Es ist sicherer, Ihren Zweig vor dem Rebasing zu sichern, um sicherzustellen, dass Sie nicht verlierenviele Änderungen. Betrachten Sie beispielsweise einen Feature-Verzweigungsname my-feature-branch
:
-
Öffnen Sie Ihren Feature-Zweig im Terminal:
git checkout my-feature-branch
Kasse einen neuen Zweig aus:
git checkout -b my-feature-branch-backup
Gehen Sie zurück zu Ihrem ursprünglichen Zweig:
git checkout my-feature-branch
Jetzt können Sie es sicher rebase., Wenn etwas schief geht, können Sie Ihre wiederherstellenänderungen durch Zurücksetzen von
my-feature-branch
aufmy-feature-branch-backup
:Beachten Sie,dass Sie beim Hinzufügen von Änderungen an
my-feature-branch
nach dem Erstellen des Sicherungszweigs diese beim Zurücksetzen verlieren.Reguläre Rebase
Mit einer regulären Rebase können Sie Ihren Feature-Zweig mit dem defaultbranch (oder einem anderen Zweig) aktualisieren.Dies ist ein wichtiger Schritt für Git-basierte Entwicklungsstrategien., Sie können sicherstellen, dass die Änderungen, die Sie der Codebasis hinzufügen, keine vorhandenen Änderungen unterbrechen, die dem Zielzweig hinzugefügt wurden, nachdem Sie Ihren featurebranch erstellt haben.,
For example, to update your branch
my-feature-branch
withmaster
:-
Fetch the latest changes from
master
:git fetch origin master
-
Checkout your feature branch:
git checkout my-feature-branch
-
Rebase it against
master
:git rebase origin/master
-
Force-push to your branch.,
Wenn Sie rebase:
- Git importiert alle Commits, die an
master
gesendet wurden, nachdem Sie Ihren Feature-Zweig bis zum heutigen Zeitpunkt erstellt haben. - Git setzt die Commits, die Sie in Ihrem Feature-Zweig haben, über alledie Commits, die aus
master
importiert wurden
Sie können
master
durch einen anderen Zweig ersetzen, gegen den Sie beispielsweiserelease-10-3
., Sie können auchorigin
durch andere Remotepositories ersetzen, z. B.upstream
. Um zu überprüfen, welche Fernbedienungen Sie mit Ihrem localrepository verknüpft haben, können Siegit remote -v
.Wenn es Zusammenführungskonflikte gibt, fordert Git Sie auf, dies zu beheben, bevor Sie die Rebase fortsetzen.
Weitere Informationen finden Sie in der Dokumentation von Git zu Rebasing-und Rebasing-Strategien.
Interaktive Rebase
Sie können interaktive Rebase verwenden, um Commits zu ändern. Ändern Sie beispielsweise Commitmessage, Squash (verbinden Sie mehrere Commits zu einem), edit oder Deletecommits., Verwenden Sie eine Rebase zum Ändern vergangener Commit-Nachrichten und zum Organisieren des Commit-Verlaufs Ihres Zweigs,um ihn sauber zu halten.
Noteiwenn Sie den Standard-Branch-Commit-Verlauf sauber halten möchten, müssen Sie nicht alle Ihre Commits vor dem Zusammenführen jeder Merge-Anforderung quetschen.Mit Squash und Merge erledigt GitLab dies automatisch.Wenn Sie in den letzten Commits etwas ändern möchten, verwenden Sie interactiverebase, indem Sie das Flag
--interactive
(oder-i
) an den Befehl rebase übergeben.,Wenn Sie beispielsweise die letzten drei Commits in Ihrem Zweig bearbeiten möchten (
HEAD~3
), führen Sie Folgendes aus:git rebase -i HEAD~3
Git öffnet die letzten drei Commits in Ihrem Terminaltexteditor und beschreibt alle interaktiven Rebase-Optionen, die Sie verwenden können. Die Standardoption ist
pick
,wodurch das Commit unverändert bleibt. Ersetzen Sie das Schlüsselwortpick
entsprechend der Operation, die Sie bei jedem Commit ausführen möchten. Dazu müssen Sie bearbeitendie Commits im Texteditor Ihres Terminals.,Wenn Sie beispielsweise Vim als Texteditor in der
ZSH
– Shell von macOS verwenden und alle drei Commits komprimieren möchten(verbinden Sie sie zu einem):- Drücken Sie auf Ihrer Tastatur, um in den Bearbeitungsmodus von Vim zu wechseln.
- Navigieren Sie mit den Pfeiltasten der Tastatur, um das zweite Commit-keywordvon
pick
zusquash
(oders
) zu bearbeiten. Machen Sie dasselbe mit dem dritten Commit.Das erste Commit sollte unverändert bleiben (pick
), da wir das zweite und dritte in das erste quetschen möchten., - Drücken Sie Escape, um den Bearbeitungsmodus zu verlassen.
- Geben Sie
:wq
in „write“ (Speichern) und „quit“ein. - Git gibt die Commit-Nachricht aus, damit Sie sie bearbeiten können:
- Alle Zeilen, die mit
#
beginnen, werden ignoriert und nicht in der commitmessage enthalten. Alles andere ist enthalten. - Um es so zu lassen, wie es ist, geben Sie
:wq
ein. So bearbeiten Sie die Commit-Nachricht: Wechseln Sie in den Editing-Modus, bearbeiten Sie die Commit-Nachricht und speichern Sie sie so, wie Sie es gerade getan haben.,
- Alle Zeilen, die mit
- Wenn Sie Ihre Commits vor dem Rebasing nicht in den Remote-Zweig verschoben haben, drücken Sie Ihre Änderungen normal. Wenn Sie diese Commits bereits gedrückt haben, erzwingen Sie stattdessen Force-push.
Beachten Sie, dass die Schritte zum Bearbeiten über die Befehlszeile je nach Betriebssystem und verwendeter Shell geringfügig sein können.
Siehe zahlreiche Undo-Möglichkeiten in Gitfor einen tieferen Blick in interaktive Rebase.,
Force-push
Wenn Sie komplexere Vorgänge ausführen, z. B. Commits kürzen, zurücksetzen oderrebase Ihren Zweig, müssen Sie eine Aktualisierung des Remote-Zweigs erzwingen.Diese Operationen implizieren das Umschreiben des Commit-Verlaufs des branch.To erzwingen Sie ein Update, übergeben Sie das Flag
--force
oder-f
an den Befehlpush
. Forexample:git push --force origin my-feature-branch
Das Erzwingen eines Updates wird nicht empfohlen, wenn Sie an sharedbranches arbeiten.
Alternativ können Sie stattdessen das Flag
--force-with-lease
übergeben., Es ist sicherer, da es keine Arbeit im Remotebranch überschreibt,wenn dem Remote-Zweig von jemand anderem mehr Commits hinzugefügt wurden:git push --force-with-lease origin my-feature-branch
Wenn der Zweig, den Sie erzwingen möchten, geschützt ist, können Sie ihn nur dann erzwingen, wenn Sie ihn zuerst schützen. Dann können Sie es erneut drücken und erneut schützen.,
Merge conflicts
Da Git auf dem Vergleich von Versionen eines Fileline-by-line basiert, wenn eine in Ihrem Zweig geänderte Zeile mit der im Zielzweig geänderten übereinstimmt (nach dem Moment, in dem Sie Ihren Feature-Zweig daraus erstellt haben), Identifiziert Gitid diese Änderungen als Mergekonflikt. Um es zu beheben, müssen Sie wählendie Version dieser Zeile, die Sie behalten möchten.
Die meisten Konflikte können über die GitLab-Benutzeroberfläche gelöst werden.
Für komplexere Fälle gibt es verschiedene Methoden, um sie zu lösen. Es gibt auch Git GUI-Apps, die helfen können, indem Sie die Unterschiede visualisieren.,
Um Konflikte lokal zu beheben, können Sie die folgende Methode verwenden:
-
Öffnen Sie das Terminal und überprüfen Sie Ihren Feature-Zweig, z. B.
my-feature-branch
:git checkout my-feature-branch
-
Rebase Ihren Zweig gegen den Zielzweig, damit Gitprompts Sie mit den Konflikten:
git rebase origin/master
- Öffnen Sie die widersprüchliche Datei in einem Code-Editor Ihrer Wahl.
- Suchen Sie nach dem Konfliktblock:
- Er beginnt mit der Markierung:
<<<<<<< HEAD
., - Unten finden Sie den Inhalt Ihrer Änderungen.
- Die Markierung:
=======
gibt das Ende Ihrer Änderungen an. - Unten finden Sie den Inhalt der letzten Änderungen im Zielzweig.
- Die Markierung
>>>>>>>
gibt das Ende des Konflikts an.
- Er beginnt mit der Markierung:
- Bearbeiten Sie die Datei: Wählen Sie aus, welche Version (vor oder nach
=======
) Sie behalten möchten, und löschen Sie dann den Teil des Inhalts, den Sie nicht in der Datei haben möchten. - Markierungen löschen.
- Speichern Sie die Datei.,
- Wiederholen Sie den Vorgang, wenn andere widersprüchliche Dateien vorhanden sind.
-
Stage your changes:
git add .
-
Commit your changes:
git commit -m "Fix merge conflicts"
- Force-push, um Ihre remote-Zweig.
Continue rebasing:
git rebase --continue
Warnungbis zu diesem Punkt können Siegit rebase --abort
ausführen, um den Prozess zu stoppen.Git bricht die Rebase ab und rollt den Zweig in den Zustand zurück, den Sie vor der Ausführung hattengit rebase
.,Nachdem Siegit rebase --continue
Die Rebase kann nicht abgebrochen werden.
Leave a Reply