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 sie auf den gleichen Status wie der letzte Commit zurückgesetzt werden.
Ich möchte jedoch nur die Arbeitskopienänderungen nur dieser einen Datei rückgängig machen, sonst nichts.
Wie mache ich das?
Sie können verwenden
git checkout -- file
Sie können dies auch ohne --
tun (wie von nimrodm vorgeschlagen). Wenn der Dateiname jedoch wie ein Zweig oder ein Tag (oder ein anderer Revisions-Bezeichner) aussieht, kann es zu Verwirrungen kommen. Verwenden Sie --
am besten.
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
git checkout <commit> <filename>
Ich habe dies heute verwendet, weil mir klar wurde, dass mein Favicon vor ein paar Commits überschrieben wurde, als ich auf Drupal 6.10 upgrated war. Ich musste es also zurückbekommen. Folgendes habe ich getan:
git checkout 088ecd favicon.ico
Benutz einfach
git checkout filename
Dadurch wird Dateiname durch die neueste Version aus dem aktuellen Zweig ersetzt.
WARNUNG: Ihre Änderungen werden verworfen - keine Sicherung wird aufbewahrt.
Wenn Ihre Datei bereits bereitgestellt ist (dies geschieht, wenn Sie nach dem Bearbeiten der Datei ein Git-Element usw. hinzufügen), um die Änderungen zu deaktivieren.
Benutzen
git reset HEAD <file>
Dann
git checkout <file>
Wenn nicht bereits inszeniert, einfach verwenden
git checkout <file>
Wenn Sie nur die Änderungen des vorherigen Commits an dieser einen Datei rückgängig machen möchten, können Sie Folgendes versuchen:
git checkout branchname^ filename
Dadurch wird die Datei wie vor dem letzten Commit ausgecheckt. Wenn Sie weitere Commits ausführen möchten, verwenden Sie die branchname~n
-Notation.
Ich werde immer damit verwechselt, daher hier ein Erinnerungstestfall; Nehmen wir an, wir haben dieses bash
-Skript zum Testen von git
:
set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email [email protected]
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
Zu diesem Zeitpunkt wird die Änderung nicht im Cache bereitgestellt. git status
lautet daher:
$ 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 ab diesem Punkt git checkout
ausgeführt wird, lautet das Ergebnis Folgendes:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Wenn wir stattdessen git reset
machen, lautet 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 - wenn die Änderungen nicht inszeniert werden, macht git reset
keinen Unterschied, während git checkout
die Änderungen überschreibt.
Nehmen wir jetzt an, dass die letzte Änderung aus dem oben genannten Skript in den Cache gestellt wurde, d. H. Wir haben am Ende auch git add b.txt
ausgeführt.
In diesem Fall lautet git status
an dieser Stelle:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
Wenn ab diesem Punkt git checkout
ausgeführt wird, lautet das Ergebnis Folgendes:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Wenn wir stattdessen git reset
machen, lautet 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 werden also - wenn die Änderungen inszeniert werden - git reset
im Wesentlichen inszenierte Änderungen vorgenommen, während git checkout
die Änderungen vollständig überschreibt.
Ich stelle meine Dateien mit der ID SHA wieder her. Was ich mache, ist git checkout <sha hash id> <file name>
Diese Antworten sind für den Befehl erforderlich, um lokale Änderungen rückgängig zu machen, die sich in mehreren spezifischen Dateien in demselben oder mehreren Ordnern (oder Verzeichnissen) befinden. Hiermit wird speziell die Frage beantwortet, bei der ein Benutzer über mehr als eine Datei verfügt, der Benutzer jedoch nicht alle lokalen Änderungen rückgängig machen möchte:
wenn Sie über eine oder mehrere Dateien verfügen, können Sie denselben Befehl (
git checkout -- file
) auf .__ anwenden. Jede dieser Dateien wird aufgelistet, indem jeder ihrer Speicherorte durch .__ getrennt angezeigt wird. Raum wie in:
git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
beachten Sie das Leerzeichen zwischen name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
Für mehrere Dateien im selben Ordner:
Wenn Sie Änderungen für alle Dateien in einer .__ verwerfen möchten, Verwenden Sie für ein bestimmtes Verzeichnis die Git-Überprüfung wie folgt:
git checkout -- name1/name2/*
Das Sternchen oben macht den Trick, alle Dateien an diesem Ort unter name1/name2 rückgängig zu machen.
In ähnlicher Weise kann das Folgende Änderungen in allen Dateien für .__ rückgängig machen. mehrere Ordner:
git checkout -- name1/name2/* nameA/subFolder/*
beachten Sie wieder das Leerzeichen zwischen name1/name2/* nameA/subFolder/* in der über.
Hinweis: Name1, Name2, NameA, Unterordner - Alle diese Beispielordnernamen geben den Ordner oder das Paket an, in dem sich die betreffenden Dateien befinden können.
Wenn Sie Ihr Commit noch nicht gepusht oder anderweitig freigegeben haben:
git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend
Wenn der Commit bereits festgeschrieben ist, können Sie die Änderung für die Datei rückgängig machen und erneut ein Commit ausführen.