Ich habe meine Geschichte aufgepeppt und möchte einige Änderungen daran vornehmen. Das Problem ist, ich habe ein Commit mit zwei nicht zusammenhängenden Änderungen, und dieses Commit ist von einigen anderen Änderungen in meiner lokalen (nicht gestoßenen) Historie umgeben.
Ich möchte dieses Commit aufspalten, bevor ich es rausschiebe, aber die meisten Guides, die ich sehe, haben mit der Aufteilung Ihres letzten Commits oder nicht festgelegten lokalen Änderungen zu tun. Ist es möglich, dies mit einem Commit zu tun, das ein wenig in der Geschichte vergraben ist, ohne dass ich meine Commits seitdem "re-do" machen muss?
Es gibt eine Anleitung zum Aufteilen von Commits in der Rebase-Manpage . Die kurze Zusammenfassung lautet:
Führen Sie eine interaktive Rebase mit dem Ziel-Commit durch (z. B. _git rebase -i <commit-to-split>^ branch
_) und markieren Sie sie zur Bearbeitung.
Wenn der Rebase diesen Commit erreicht, verwenden Sie _git reset HEAD^
_, um vor dem Commit auf zurückzusetzen, aber behalten Sie Ihren Arbeitsbaum bei.
Fügen Sie schrittweise Änderungen hinzu und übernehmen Sie sie. Nehmen Sie dabei so viele Änderungen vor, wie Sie möchten. _add -p
_ kann nützlich sein, um nur einige der Änderungen in einer bestimmten Datei hinzuzufügen. Verwenden Sie commit -c ORIG_HEAD
, wenn Sie die ursprüngliche Festschreibungsnachricht für eine bestimmte Festschreibung wiederverwenden möchten.
Wenn Sie testen möchten, was Sie festschreiben (gute Idee!), Verwenden Sie _git stash
_, um den Teil auszublenden, den Sie nicht festschreiben (oder _stash --keep-index
_, bevor Sie ihn überhaupt festschreiben). Testen Sie dann _git stash pop
_, um den Rest zum Arbeitsbaum zurückzukehren. Machen Sie so lange Commits, bis Sie alle Änderungen festgeschrieben haben, d. H. Einen sauberen Arbeitsbaum.
Führen Sie _git rebase --continue
_ aus, um die Commits nach dem jetzt geteilten Commit anzuwenden.
So machen Sie es mit Magit .
Angenommen, ed417ae ist das, das Sie ändern möchten. Es enthält zwei nicht zusammenhängende Änderungen und ist unter einem oder mehreren Commits verborgen. Drücken Sie ll
, um das Protokoll anzuzeigen, und navigieren Sie zu ed417ae:
Drücken Sie dann r
, um das Popup-Menü für die Rebase zu öffnen
und m
, um das Festschreiben am Punkt zu ändern.
Beachten Sie, wie sich der @
jetzt in dem Commit befindet, das Sie teilen möchten - das bedeutet, dass HEAD jetzt in diesem Commit ist:
Wir möchten HEAD zum übergeordneten Element verschieben, navigieren Sie also zum übergeordneten Element (47e18b3) und drücken Sie x
(magit-reset-quickly
, gebunden an o
, wenn Sie evil-magit
verwenden), und geben Sie Folgendes ein: ja, ich meinte an einem Punkt ". Ihr Log sollte jetzt so aussehen:
Drücken Sie nun q
, um zum regulären Magit-Status zu gelangen, und verwenden Sie dann den regulären unstage-Befehl u
, um zu entstimmen, was beim ersten Commit nicht funktioniert. Geben Sie c
wie gewohnt ein. dann s
tage und c
ermit das, was beim zweiten Commit ausgeführt wird, und wenn Sie fertig sind: Drücken Sie r
, um das Rebase-Popup zu öffnen
und noch ein r
, um fortzufahren, und du bist fertig! ll
zeigt jetzt:
Um ein Commit <commit>
zu teilen und das new commit vor diesem einzufügen , und das Datum des Autors von <commit>
zu speichern, gehen Sie wie folgt vor:
Bearbeiten Sie den Commit vorher <commit>
git rebase -i <commit>^^
NB: Vielleicht wird es auch nötig sein, <commit>
zu bearbeiten.
Cherry pick <commit>
in den Index
git cherry-pick -n <commit>
Nicht benötigte Änderungen aus dem Index interaktiv zurücksetzen und den Arbeitsbaum zurücksetzen
git reset -p && git checkout-index -f -a
Alternativ können Sie nicht mehr benötigte Änderungen interaktiv speichern: git stash Push -p -m "tmp other changes"
Nehmen Sie ggf. weitere Änderungen vor und erstellen Sie den neuen Commit
git commit -m "upd something" .
Wiederholen Sie optional die Punkte 2-4, um weitere Zwischencits hinzuzufügen.
Setzen Sie die Umbasierung fort
git rebase --continue