Ist es möglich, nur eine einzelne Datei oder bestimmte Änderungen in einer Datei beim Festschreiben mehrerer Dateien zurückzusetzen?
Ganze Geschichte Ich habe eine Reihe von Dateien festgeschrieben. Eine Reihe von Commits später hat jemand, der namenlos bleibt (JACK !!!), eine Datei in sein Repository kopiert und mehrere Dateien festgeschrieben, wobei einige der von mir vorgenommenen Änderungen überschrieben wurden. Ich möchte die eine Datei zurücksetzen, die überlastet wurde oder noch besser, gehen Sie hinein und setzen Sie zwei Änderungen in dieser Datei zurück. Dies muss ein separates Revert-Commit sein, da es gezogen und gedrückt wurde.
--3way
zu Zusammenführungskonflikten führt, anstatt Patches nicht anzuwenden.Antworten:
Sie können das Commit zurücksetzen, ohne ein neues zu erstellen, indem Sie die Option '--no-commit' hinzufügen. Dadurch bleiben alle zurückgesetzten Dateien im Staging-Bereich. Von dort aus würde ich einen Soft-Reset durchführen und die Änderungen hinzufügen, die ich wirklich wollte. Ein Beispiel für einen Workflow:
quelle
git add -p
eine interaktive Sitzung starten, in der Sie selektiv Dateiblöcke anstelle ganzer Dateien hinzufügen können. (Es gibt auchgit reset -p
selektiv Änderungen auf der Bühne zu entfernen. Gut zu wissen, aber wahrscheinlich nicht, was Sie in diesem Szenario wollen.)revert
,reset
,stash -p
(Stash „bricht , dass ich will nicht zu actualy make“),add
der Rest,commit
Mit dem
checkout
Befehl können Sie die alte Version einer Datei interaktiv anwenden .Wenn Sie beispielsweise wissen,
COMMIT
wo der wieder hinzuzufügende Code entfernt wurde, können Sie den folgenden Befehl ausführen:Git fordert Sie auf, die in der aktuellen Version der Datei fehlenden Hunks wieder hinzuzufügen. Sie können
e
einen Patch der Änderung erstellen, bevor Sie ihn erneut anwenden.quelle
git checkout -p path/to/file
Sie können den alten, guten Inhalt der Dateien, mit denen Sie zurückkehren möchten, einfach manuell auschecken
git checkout
. Wenn Sie beispielsweisemy-important-file
zu der Version zurückkehren möchten, die in der Version enthalten warabc123
, können Sie dies tunJetzt haben Sie den alten Inhalt von
my-important-file
back und können ihn sogar bearbeiten, wenn Sie möchten, und wie gewohnt ein Commit durchführen, um ein Commit durchzuführen, das die von ihm vorgenommenen Änderungen rückgängig macht. Wenn es nur einige Teile seines Commits gibt, die Sie zurücksetzen möchten,git add -p
wählen Sie mit nur einige Hunks aus dem Patch aus, den Sie festschreiben.quelle
revert
, Sie nehmen nur eine alte Version der Datei zurück. Ein ordnungsgemäßerrevert
Befehl entfernt die fehlerhaften Festschreibungsänderungen in der Datei, auch wenn sie seit diesem fehlerhaften Festschreiben mehrmals geändert wurden, und Sie möchten diese Änderungen nicht verlieren .git checkout -p
.Ich habe einen Weg gefunden, dies auf der Git-Mailingliste zu tun:
Quelle: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
Variationen
Dieser Befehl schlägt fehl (verursacht keine Änderungen), wenn der Patch nicht sauber
--3way
angewendet wird , sondern stattdessen Konflikte auftreten, die Sie dann manuell lösen können (in diesem Fall ist Caseys Antwort möglicherweise praktischer):Sie können dies auch verwenden, um mehrere Commits teilweise zurückzusetzen, z.
um Dateien mit Änderungen zurückzusetzen, die
<string>
in einem Commit übereinstimmen . Dies ist genau das, was ich in meinem Anwendungsfall brauchte (einige separate Commits führten ähnliche Änderungen an verschiedenen Dateien ein, zusammen mit Änderungen anderer Dateien auf nicht verwandte Weise, die ich nicht zurücksetzen wollte).Wenn Sie in festgelegt haben
diff.noprefix=true
,~/.gitconfig
müssen Sie-p0
demgit apply
Befehl hinzufügen , zquelle
git show ... > foo.txt
(2) bearbeitetfoo.txt
, um die Unterschiede zu entfernen, die ich nicht zurücksetzen wollte (3)git apply --reverse foo.txt
, um die noch aufgelisteten Unterschiede zurückzusetzenfoo.txt
.