Ich habe in der letzten Stunde einige Dinge geändert und sie Schritt für Schritt festgeschrieben, aber ich habe gerade festgestellt, dass ich vor einigen Festschreibungen vergessen habe, eine geänderte Datei hinzuzufügen.
Das Protokoll sieht folgendermaßen aus:
GIT TidyUpRequests u:1 d:0> git log
commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce
Author: David Klein <>
Date: Tue Apr 27 09:43:55 2010 +0200
The Main program now tests both Webservices at once
commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463
Author: David Klein <>
Date: Tue Apr 27 09:43:27 2010 +0200
ISBNDBQueryHandler now uses the XPath functions from XPath.fs too
commit 06a504e277fd98d97eed4dad22dfa5933d81451f
Author: David Klein <>
Date: Tue Apr 27 09:30:34 2010 +0200
AmazonQueryHandler now uses the XPath Helper functions defined in XPath.fs
commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- changed file should go here
Author: David Klein <>
Date: Tue Apr 27 09:29:53 2010 +0200
Factored out some common XPath Operations
Irgendwelche Ideen?
Antworten:
Verwenden Sie
git rebase
. Speziell:git stash
Sie diese Option , um die Änderungen zu speichern, die Sie hinzufügen möchten.git rebase -i HEAD~10
(oder wie viele Commits Sie zurück sehen möchten).a0865...
) zum Bearbeiten, indem Sie das Wortpick
am Zeilenanfang in ändernedit
. Löschen Sie die anderen Zeilen nicht, da dies die Commits löschen würde. [^ Vimnote]git stash pop
git add <file>
.git commit --amend --no-edit
.git rebase --continue
die den Rest Ihrer Commits gegen die neue umschreibt.[^ vimnote]: Wenn Sie verwenden
vim
dann werden Sie das getroffen haben , um InsertSchlüssel zu bearbeiten, dann Escund geben Sie in:wq
die Datei zu speichern, verlassen Sie den Editor, und die Änderungen zu übernehmen. Alternativ können Sie einen benutzerfreundlichen Git-Commit-Editor mit konfigurierengit config --global core.editor "nano"
.quelle
git add
.edit
, LÖSCHEN Sie die anderen in der Datei aufgeführten Commits NICHT. In diesem Fall werden die Commits gelöscht und Sie müssen diese Schritte ausführen , um sie zurückzubekommen.git add .
Um „fix“ ein alte mit einer kleinen Änderung zu übernehmen, ohne die Botschaft der alten begehen begehen, wo
OLDCOMMIT
ist so etwas wie091b73a
:Sie können auch
git commit --squash=OLDCOMMIT
die alte Festschreibungsnachricht während der erneuten Basis bearbeiten.git rebase --interactive
ruft einen Texteditor auf (der konfiguriert werden kann ), um die Rebase-Anweisungssequenz zu bestätigen (oder zu bearbeiten) . Die Datei enthält Informationen zu Änderungen der Rebase-Anweisungen . Speichern Sie einfach den Editor und beenden Sie ihn (:wq
invim
), um mit der Rebase fortzufahren.--autosquash
legt automatisch alle--fixup=OLDCOMMIT
Commits in der gewünschten Reihenfolge ab. Beachten Sie, dass dies--autosquash
nur gültig ist, wenn die--interactive
Option verwendet wird.^
inOLDCOMMIT^
bedeutet, dass es sich um einen Verweis auf das Commit kurz zuvor handeltOLDCOMMIT
.Die obigen Schritte eignen sich zur Überprüfung und / oder Änderung der Rebase-Anweisungssequenz. Sie können den interaktiven Rebase-Texteditor jedoch auch überspringen / automatisieren, indem Sie:
GIT_SEQUENCE_EDITOR
zu einem Skript .Siehe git commit und git rebase . Wie immer sollten Sie beim Umschreiben des Git-Verlaufs nur Commits korrigieren oder quetschen, die Sie noch nicht für andere veröffentlicht haben (einschließlich zufälliger Internetbenutzer und Build-Server).
quelle
--autosquash
ist nur gültig, wenn die--interactive
Option verwendet wird .git config --global core.editor "pico"
. Es gibt verschiedene andere Möglichkeiten, um git zu konfigurieren und / oder den Standardeditor usw. Ihres Systems zu ändern .Mit Git 1.7 gibt es eine sehr einfache Möglichkeit
git rebase
:Stellen Sie Ihre Dateien bereit:
Erstellen Sie ein neues Commit und verwenden Sie die Commit-Nachricht Ihres "defekten" Commits erneut
fixup!
in der Betreffzeile voranstellen (odersquash!
wenn Sie das Commit (Nachricht) bearbeiten möchten):Verwenden Sie
git rebase -i --autosquash
diese Option, um Ihr Commit zu korrigierenquelle
You asked me to rebase without telling me which branch you want to rebase against, and 'branch.master.merge'
und wenn ich sie dann verwende , erhaltegit rebase -i --autosquash
ich nur einenoop
Betreffzeile, die das Commit auf sich selbst neu basiert. Irgendeine Idee, was ich falsch mache?git rebase -i --autosquash HEAD~10
Sie können eine
rebase --interactive
Sitzung versuchen , um Ihr altes Commit zu ändern (vorausgesetzt, Sie haben diese Commits noch nicht auf ein anderes Repo übertragen).quelle