wake-up-neo.net

Wie kann ich ein in der Geschichte begrabenes Git-Commit aufteilen?

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?

286
Ben

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.

440
Cascabel

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:

 initial log

Drücken Sie dann r, um das Popup-Menü für die Rebase zu öffnen

 rebase popup

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:

 modifying a commit

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:

 log after resetting

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 stage und cermit das, was beim zweiten Commit ausgeführt wird, und wenn Sie fertig sind: Drücken Sie r, um das Rebase-Popup zu öffnen

 rebase popup

und noch ein r, um fortzufahren, und du bist fertig! ll zeigt jetzt:

 all done log

2
unhammer

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:

  1. Bearbeiten Sie den Commit vorher <commit>

    git rebase -i <commit>^^
    

    NB: Vielleicht wird es auch nötig sein, <commit> zu bearbeiten.

  2. Cherry pick <commit> in den Index

    git cherry-pick -n <commit>
    
  3. 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"

  4. 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.

  5. Setzen Sie die Umbasierung fort

    git rebase --continue
    
0
ruvim