Sie können verwenden git checkout -p
, um einzelne Hunks aus dem Unterschied zwischen Ihrer Arbeitskopie und dem Index zum Zurücksetzen auszuwählen. Ebenso git add -p
können Sie Hunks auswählen, die dem Index hinzugefügt werden sollen, und git reset -p
Sie können einzelne Hunks aus dem Unterschied zwischen Index und HEAD auswählen, um aus dem Index auszusteigen.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Wenn Sie Ihr Git-Repository vorab als Snapshot erstellen möchten, um diese Änderungen vor dem Zurücksetzen beizubehalten, gehe ich wie folgt vor:
$ git stash; git stash apply
Wenn Sie das häufig verwenden, möchten Sie es möglicherweise als Alias verwenden:
[alias]
checkpoint = !git stash; git stash apply
Das Zurücksetzen einzelner Hunks oder Zeilen kann noch einfacher sein, wenn Sie einen guten Editor-Modus oder ein Plugin verwenden, das möglicherweise die Auswahl von Zeilen unterstützt, die direkt zurückgesetzt werden sollen, da -p
die Verwendung manchmal etwas umständlich sein kann. Ich benutze Magit , einen Emacs-Modus, der für die Arbeit mit Git sehr hilfreich ist. In Magit können Sie ausführen magit-status
, die Unterschiede für die Änderungen finden, die Sie zurücksetzen möchten, die Zeilen auswählen, die Sie zurücksetzen möchten (oder einfach den Cursor auf Hunks setzen, die Sie zurücksetzen möchten, wenn Sie stattdessen jeweils einen Hunk zurücksetzen möchten jeweils eine Zeile) und drücken Sie k
, um diese bestimmten Zeilen zurückzusetzen. Ich kann Magit nur empfehlen, wenn Sie Emacs verwenden.
git checkout
auch eine-p
Flagge gibt, die genau das tut, wonach Sie in einem einzigen Befehl gefragt haben. Entschuldigung für die vorherigen komplexen Schritte; Sie können nur verwendengit checkout -p
. Was das Speichern von Dingen angeht, bevor ich etwas potenziell Zerstörerisches mache, mache ich oft einengit stash; git stash apply
(oder erstelle einen Alias, der das alsgit checkpoint
oder so macht), um den aktuellen Baum in einem Stash aufzuzeichnen, damit ich darauf zurückgreifen kann, wenn etwas schief geht.git commit -a -m "Backup Commit" --edit; git reset HEAD^
besser wäre, weil es dann meinen Versteckzustand, den ich möglicherweise für etwas anderes verwende, nicht verschmutzen würde. Solange Sie den SHA1 haben, können Sie ihn innerhalb der nächsten 30 Tage pflücken. Mit --edit können Sie der Festschreibungsnachricht Informationen hinzufügen, um die SHA1 später zu finden, wenn Sie dies wünschen. Auf der anderen Seite würde dies das Git-Reflog verschmutzen, also denke ich, dass es ein Kompromiss ist, der auf dem basiert, was Sie tun.git checkout -p
die Patches nicht auf den Index anzuwenden, sondern nur zu inszenieren?Bearbeiten Sie dann die Patchdatei und entfernen Sie die Teile, die Sie nicht rückgängig machen möchten. Dann:
quelle
patchfile
sieht in vim großartig aus und es hilft wirklich!git apply -R
anstelle vonpatch
(nur um im Bereich von Git zu bleiben, oder in dem anderen Fall, derpatch
nicht verfügbar ist)patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
Du könntest es tun
Für jede Datei, die Sie zurücksetzen möchten.
quelle
Wie wäre es mit
git add -p
Sie diese Option, um nur die gewünschten Änderungen zum Index hinzuzufügen.quelle
Wenn ich 'git status' starte, heißt es:
Um die nicht bereitgestellten Änderungen abzubrechen, muss ich Folgendes ausführen:
quelle
Die Antwort von Brian Campbell stürzt mein Git, Version 1.9.2.msysgit.0, aus unbekannten Gründen ab. Mein Ansatz ist es also, Hunks, die ich behalten möchte, zu inszenieren, Änderungen in der Arbeitskopie zu verwerfen und dann die Bühne zu verlassen.
quelle
git stash -p
. Du könntest es tungit stash -p; git reset --hard; git stash pop
. Dies ist praktisch dasselbe wie das, was Sie tun, außer dass Sie keine Festschreibungsnachricht schreiben müssen.Sie können die
git checkout
Namen der Teile, die Sie rückgängig machen möchten, benennen.quelle