2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
[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
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.
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.
Vor dem Umbasieren:
Nach der Umbasierung:
git rebase
Der Ausführungsprozess:
HEAD
Die gemeinsame Version zwischen dem Zielzweig, auf den die Rebase zeigt (merge-base
);merge-base
, alle fehlenden Versionen im Zielzweig finden;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
Die Konfliktsituation stellt sich wie folgt dar:
Wechseln Sie zu folgendem Inhalt, speichern und schließen Sie:
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...
Der sich öffnende Editor ist in der Abbildung dargestellt:
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
Die Details sind wie folgt:
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:
git rebase --abort
: Als wörtliche Bedeutung: Unterbrechen Sie die Rebase
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:
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
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):
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:
Das Ergebnis ist wie folgt:
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.
Das Diagramm vor und nach der Umbasierung sieht wie folgt aus: