In früheren Antworten wurde die Verwendung von git rebase -i
zum Bearbeiten des Commits, das Sie teilen möchten, und zum Festschreiben in Teilen behandelt.
Dies funktioniert gut, wenn Sie die Dateien in verschiedene Commits aufteilen. Wenn Sie jedoch Änderungen an den einzelnen Dateien aufteilen möchten, müssen Sie mehr wissen.
Nachdem Sie das Commit erreicht haben, für das Sie es teilen, verwenden rebase -i
und markieren möchten edit
, haben Sie zwei Möglichkeiten.
Nach der Verwendung git reset HEAD~
, gehen Sie durch die Patches einzeln über git add -p
diejenigen auszuwählen , die Sie in jeder wollen begehen
Bearbeiten Sie die Arbeitskopie, um die nicht gewünschten Änderungen zu entfernen. diesen Zwischenstaat begehen; und dann das volle Commit für die nächste Runde zurückziehen.
Option 2 ist nützlich, wenn Sie ein großes Commit aufteilen, da Sie überprüfen können, ob die Zwischenversionen im Rahmen der Zusammenführung ordnungsgemäß erstellt und ausgeführt werden. Dies läuft wie folgt ab.
Verwenden Sie nach dem Verwenden rebase -i
und edit
Festlegen des Commits
git reset --soft HEAD~
Um das Festschreiben rückgängig zu machen, belassen Sie die festgeschriebenen Dateien jedoch im Index. Sie können auch einen gemischten Reset durchführen, indem Sie --soft weglassen, je nachdem, wie nahe das endgültige Ergebnis Ihres anfänglichen Commits sein wird. Der einzige Unterschied besteht darin, ob Sie mit allen bereitgestellten Änderungen beginnen oder mit allen nicht bereitgestellten Änderungen.
Gehen Sie jetzt hinein und bearbeiten Sie den Code. Sie können Änderungen entfernen, hinzugefügte Dateien löschen und alles tun, um das erste Commit der gesuchten Serie zu erstellen. Sie können es auch erstellen, ausführen und bestätigen, dass Sie über einen konsistenten Quellensatz verfügen.
Wenn Sie zufrieden sind, stellen Sie die Dateien nach Bedarf bereit (ich verwende sie gerne git gui
dafür) und übernehmen Sie die Änderungen über die Benutzeroberfläche oder die Befehlszeile
git commit
Das ist das erste Commit. Jetzt möchten Sie Ihre Arbeitskopie in dem Zustand wiederherstellen, den sie nach dem Festschreiben hatte, das Sie aufteilen, damit Sie mehr Änderungen für Ihr nächstes Festschreiben vornehmen können. Verwenden Sie, um den sha1 des Commits zu finden, den Sie bearbeiten git status
. In den ersten Zeilen des Status sehen Sie den aktuell ausgeführten Rebase-Befehl, in dem Sie den sha1 Ihres ursprünglichen Commits finden:
$ git status
interactive rebase in progress; onto be83b41
Last commands done (3 commands done):
pick 4847406 US135756: add debugging to the file download code
e 65dfb6a US135756: write data and download from remote
(see more in file .git/rebase-merge/done)
...
In diesem Fall hat das Commit, das ich bearbeite, sha1 65dfb6a
. Wenn ich das weiß, kann ich den Inhalt dieses Commits über mein Arbeitsverzeichnis überprüfen, wobei die Form git checkout
sowohl ein Commit als auch einen Dateispeicherort annimmt. Hier verwende ich .
als Dateispeicherort, um die gesamte Arbeitskopie zu ersetzen:
git checkout 65dfb6a .
Verpassen Sie nicht den Punkt am Ende!
Dadurch werden die Dateien so überprüft und bereitgestellt, wie sie nach dem von Ihnen bearbeiteten Commit waren, jedoch relativ zum vorherigen Commit, sodass alle bereits festgeschriebenen Änderungen nicht Teil des Commits sind.
Sie können entweder jetzt fortfahren und es unverändert festschreiben, um die Aufteilung zu beenden, oder es erneut ausführen und einige Teile des Festschreibens löschen, bevor Sie ein weiteres vorläufiges Festschreiben durchführen.
Wenn Sie die ursprüngliche Festschreibungsnachricht für eine oder mehrere Festschreibungen wiederverwenden möchten, können Sie sie direkt aus den Arbeitsdateien der Rebase verwenden:
git commit --file .git/rebase-merge/message
Sobald Sie alle Änderungen vorgenommen haben,
git rebase --continue
wird den Rebase-Vorgang fortsetzen und abschließen.