Arbeitskopieänderungen einer Datei in Git rückgängig machen?
-
22-08-2019 - |
Frage
Nach dem letzten Commit habe ich eine Reihe von Dateien in meiner Arbeitskopie geändert, aber ich möchte die Änderungen an einer dieser Dateien rückgängig machen, indem ich sie auf den gleichen Status wie beim letzten Commit zurücksetze.
Ich möchte jedoch nur die Änderungen an der Arbeitskopie nur dieser einen Datei rückgängig machen, sonst nichts.
Wie mache ich das?
Lösung
Sie können verwenden
git checkout -- file
Sie können es auch ohne tun --
(wie von nimrodm vorgeschlagen), aber wenn der Dateiname wie ein Zweig oder Tag (oder eine andere Revisionskennung) aussieht, kann es zu Verwirrung kommen, also verwenden --
ist das Beste.
Sie können auch eine bestimmte Version einer Datei auschecken:
git checkout v1.2.3 -- file # tag v1.2.3
git checkout stable -- file # stable branch
git checkout origin/master -- file # upstream master
git checkout HEAD -- file # the version from the most recent commit
git checkout HEAD^ -- file # the version before the most recent commit
Andere Tipps
Verwenden Sie einfach
git checkout filename
Dies wird Dateinamen mit der neuesten Version aus dem aktuellen Zweig ersetzen.
ACHTUNG:. Ihre Änderungen werden verworfen - keine Sicherung gehalten wird
git checkout <commit> <filename>
habe ich diese heute, weil ich erkennen, dass mein Favicon vor ein paar Commits überschrieben worden ist, als ich upgrated 6.10 Drupal, also musste ich es wieder bekommen. Hier ist, was ich getan habe:
git checkout 088ecd favicon.ico
Wenn die Datei bereits inszeniert (passiert, wenn Sie ein Git tun hinzufügen usw., nachdem die Datei bearbeitet wird), um die Änderungen unstage.
Mit
git reset HEAD <file>
Dann
git checkout <file>
Wenn nicht bereits inszeniert, nur verwenden
git checkout <file>
Wenn Sie möchten, rückgängig zu machen nur die Änderungen der vorherigen verpflichten, dass eine Datei, können Sie dies versuchen:
git checkout branchname^ filename
Dadurch wird die Datei Kasse, wie es war, bevor der letzte begehen. Wenn Sie ein paar mehr hinwollen Commits zurück, verwenden Sie die branchname~n
Notation.
Ich bekomme immer verwirrt mit diesem, so ist hier eine Erinnerung Testfall; Lassen Sie uns sagen, dass wir dieses bash
Skript git
zu testen:
set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt
An diesem Punkt wird die Änderung nicht im Cache statt, so git status
ist:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
Wenn von diesem Punkt, wir git checkout
tun, ist das Ergebnis so aus:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Wenn wir stattdessen git reset
tun, ist das Ergebnis:
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
Also, in diesem Fall - wenn die Änderungen nicht in Szene gesetzt werden, macht git reset
keinen Unterschied, während git checkout
die Änderungen überschreibt
Nun lassen Sie uns sagen, dass die letzte Änderung aus dem Skript oben inszenierten / zwischengespeichert wird, das heißt, wir haben git add b.txt
auch am Ende.
In diesem Fall git status
an diesem Punkt ist:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
Wenn von diesem Punkt, wir git checkout
tun, ist das Ergebnis so aus:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Wenn wir stattdessen git reset
tun, ist das Ergebnis:
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
in diesem Fall also - wenn die Änderungen in Szene gesetzt werden, wird git reset
grundsätzlich Änderungen in unstaged Änderungen vornehmen inszeniert -. Während git checkout
die Änderungen überschreiben vollständig
Diese Antworten ist für den Befehl erforderlich für lokale Änderungen rückgängig gemacht, die in mehreren spezifischen Dateien in gleichen oder mehrere Ordner (oder Verzeichnisse) sind. Dies beantwortet befasst sich speziell mit Fragen, wo ein Benutzer mehr als eine Datei hat, aber der Benutzer nicht will, alle lokalen Änderungen rückgängig zu machen:
Wenn Sie eine oder mehr Dateien haben können Sie den gleichen Befehl (
git checkout -- file
) gelten jede dieser Dateien, die von jedem ihrer Position getrennt Auflistung von Raum wie in:
git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
dagegen den Raum oberhalb zwischen name1 / name2 / fileOne.ext namea / Unterordner / fileTwo.ext
Für mehrere Dateien im selben Ordner:
Wenn Sie zufällig Änderungen für alle Dateien in einem verwerfen bestimmte Verzeichnis, verwenden Sie die git checkout wie folgt:
git checkout -- name1/name2/*
Der Stern in der obigen funktioniert der Trick von Verhängnis alle Dateien an dieser Stelle unter name1 / name2.
Und in ähnlicher Weise können die folgenden Änderungen rückgängig machen in allen Dateien für mehrere Ordner:
git checkout -- name1/name2/* nameA/subFolder/*
wieder in den Raum zwischen name1 Geist / name2 / * namea / Unterordner / * in der oben.
. Hinweis: name1, name2, namea, SubFolder - all dieser Beispiel Ordnernamen angeben, den Ordner oder Paket, in dem die Datei (en) in Frage aufhalten kann
ich meine Dateien mit der SHA-ID wiederherstellen, was ich tue, ist git checkout <sha hash id> <file name>
Wenn Sie noch nicht gedrückt oder andersweitig Ihre commit:
git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend
Wenn es sich bereits verpflichtet, können Sie die Änderung für die Datei zurückkehren und wieder begehen, dann neue Squash begehen mit letzten begehen.