Technologieaustausch

[Git-Studiennotizen] Kapitel 4 Git-Rebase-Rebase-Vorgang und verwandte Beispiele (Teil 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Kapitel 4 Rebase-Vorgänge und verwandte Fälle

[verwandtes Thema]

  • Wille commit Rebase-Version auf einen anderen Zweig
  • Führen Sie im Falle eines Versionskonflikts ein Rebase durch
  • Führen Sie ein interaktives Rebase für eine angegebene Version durch
  • Verwenden Sie interaktives Rebasing, um Versionen zu aggregieren
  • Committer durch interaktives Rebasing ändern
  • Automatische Aggregationsversion

4.0 Einführung in das Rebasing

Rebase (Rebasing ) ist eine äußerst leistungsstarke Funktion von Git.Rebasing ist eine Art von Operation: wenn acommit A Der früheste basierte aufcommit B von dannA Rebase aufC, das heißt, wird A basieren aufC Betrieb.

Im folgenden Demonstrationsfall werden Sie feststellen, dass das Umbasieren oft nicht so einfach ist, wie es scheint.

4.1 Wille commit Rebase-Version auf einen anderen Zweig

Schauen wir uns zunächst die einfachste Art der Rebase-Operation an. Zugehörige Vorbereitungsarbeiten: Neue Datei einführen, einreichen, den Inhalt ändern und erneut einreichen.Auf diese Weise gibt es doppelt so viele wie vor Ortcommit Ausführung.

Immer noch mit jgit Bibliothek zum Beispiel:

# Clone jgit repo into chapter4
$ git clone https://git.eclipse.org/r/jgit/jgit chapter4
$ cd chapter4
# Checkout a new branch
$ git checkout -b rebaseExample --track origin/stable-3.1
# Create the 1st commit
$ echo "My Fishtank
    
Gravel, water, plants
Fish, pump, skeleton" > fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Create the 2nd commit
$ echo "mosquitos" >> fishtank.txt
$ git add fishtank.txt
$ git commit -m "Feeding my fish"
# Rabase to stable-3.2
$ git rebase origin/stable-3.2
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Vor dem Umbasieren:

Fügen Sie hier eine Bildbeschreibung ein

Nach der Umbasierung:

Fügen Sie hier eine Bildbeschreibung ein

git rebase Der Ausführungsprozess:

  1. auftauchen HEAD Die gemeinsame Version zwischen dem Zielzweig, auf den die Rebase zeigt (merge-base);
  2. bezogen auf merge-base, alle fehlenden Versionen im Zielzweig finden;
  3. Versuchen Sie, die fehlenden Versionen nacheinander auf den Zielzweig anzuwenden.

4.2 Rebasing bei Versionskonflikten durchführen

Wenn ein commit Version oder einebranch Rebasieren Sie einen Zweig auf einen anderenHEAD ist es wahrscheinlich, dass Versionskonflikte auftreten.An diesem Punkt muss der Konflikt gelöst und der Befehl ausgeführt werdengit rebase --continue, der Rebase kann abgeschlossen werden.

Die Beispiele in diesem Abschnitt zeigen, wie eine Neubasierung bei Vorhandensein von Konflikten durchgeführt werden kann.Befolgen Sie diesmal das in Abschnitt 4.1 gezeigte EndergebnisrebaseExample Der Zweig wurde umbenannt instable-3.2 Zweig.Das Beispiel überprüft den neuen Zweig von Stable-3.1 erneut und fügt ein und hinzurebaseExample Textdateien mit demselben Zweignamen, aber inkompatiblen Inhaltenfishtank.txt

# Checkout rebaseExample2
$ git checkout -b rebaseExample2 --track origin/stable-3.1
# Add a new commit
$ echo "My Fishtank
Pirateship, Oister shell
Coconut shell
">fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Rebase conflicting branches
$ git rebase rebaseExample
Auto-merging fishtank.txt
CONFLICT (add/add): Merge conflict in fishtank.txt
error: could not apply 24f9bf1ef... My brand new fishtank2
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 24f9bf1ef... My brand new fishtank2
$ subl fishtank.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Die Konfliktsituation stellt sich wie folgt dar:

Fügen Sie hier eine Bildbeschreibung ein

Wechseln Sie zu folgendem Inhalt, speichern und schließen Sie:

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie die zusammengeführten Dateien hinzu und fahren Sie mit der Neubasierung fort:

$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
  • 1
  • 2
  • 3

Der sich öffnende Editor ist in der Abbildung dargestellt:

Fügen Sie hier eine Bildbeschreibung ein

Bestätigen, speichern und schließen Sie, und Sie werden eine Meldung sehen, dass das Rebase erfolgreich war:

$ git rebase --continue
[detached HEAD 9911772b3] My brand new fishtank2
 1 file changed, 2 insertions(+), 3 deletions(-)
Successfully rebased and updated refs/heads/rebaseExample2.
# Check new status via gitk
$ gitk
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Die Details sind wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Es ist ersichtlich, dass bei diesem Rebase nur die Version rebasiert wird, über die der alte Zweig, der neue Zweig jedoch nicht verfügt (d. h. eine neue Version hinzufügen). commit)。

In den Git-Prompt-Informationen der ersten Rebase-Unterbrechung können Sie auch zwei Alternativen sehen:

  1. git rebase --abort: Als wörtliche Bedeutung: Unterbrechen Sie die Rebase

  2. git rebase --skip: Konflikte überspringen und direkt neu starten, was dazu führt rebaseExample2 Entsorgen Sie das Neuecommit, direkt verschmolzen mit rebaseExample, auf die der Elternteil nach der Umbasierung zeigte, und rebaseExample Konsistent:

    Fügen Sie hier eine Bildbeschreibung ein


4.3 Führen Sie ein interaktives Rebase für eine bestimmte Version durch

In diesem Beispiel verwenden wir die rebaseExample Demonstrieren Sie anhand der Zweige die Verwendung--interactive Mark, rebasiere die beiden in 4.1commit Rebase zum Remote-Tracking-Zweigstable-3.1 Vorgesetzter:

$ git checkout rebaseExample
Switched to branch 'rebaseExample'
Your branch is ahead of 'origin/stable-3.1' by 109 commits.
  (use "git push" to publish your local commits)
$ git rebase origin/stable-3.1
  • 1
  • 2
  • 3
  • 4
  • 5

Zu diesem Zeitpunkt wird im neuen Popup-Editor eine Commit-Liste mit dem Bereich angezeigt rebaseExample Undstable-3.1 dazwischen kann alles umbasiert werdenstable-3.1 voncommit Aufzeichnen.Behalten Sie die beiden neuen im Beispiel beicommit, löschen Sie den gesamten Rest (also den Inhalt in Zeile 89 und davor):

Fügen Sie hier eine Bildbeschreibung ein

Verlassen Sie nach dem Speichern den Editor und Sie sehen die folgende Ausgabe:

$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:
  • 1
  • 2
  • 3

Das Ergebnis ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Beispielerweiterung

Auch in diesem Beispiel können Sie durch einen Befehl schnell den gewünschten Effekt erzielen:

$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2

Das Diagramm vor und nach der Umbasierung sieht wie folgt aus:

Fügen Sie hier eine Bildbeschreibung ein