2013 Stimmen

Änderungen an der Arbeitskopie einer Datei in Git rückgängig machen?

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, d.h. sie auf den Stand des letzten Commits zurücksetzen.

Ich möchte jedoch nur die Änderungen an der Arbeitskopie dieser einen Datei rückgängig machen, sonst nichts.

Wie kann ich das tun?

26voto

sykora Punkte 88704

Wenn Sie nur die Änderungen des vorherigen Commits an dieser einen Datei rückgängig machen wollen, können Sie dies versuchen:

git checkout branchname^ filename

Damit wird die Datei so gecheckt, wie sie vor der letzten Übertragung war. Wenn Sie ein paar Commits weiter zurückgehen wollen, verwenden Sie die branchname~n Notation.

23voto

P-Gn Punkte 21083

Mit Git 2.23 wurde eine restore um genau das zu tun, in dem Versuch, wie ich meine, die Antwort auf diese Art von Fragen einfach zu machen.

git restore [--] <pathspec>...

Wie immer ist die -- benötigt werden, wenn der Dateiname mit einem Bindestrich beginnt. (Die Verwechslung mit einem Zweignamen ist hier nicht möglich, da restore umfasst im Gegensatz zu den "Do-all"-Varianten keine Verzweigungen. checkout )

Um vollständig zu sein, restore kann auch ausgelagerte Dateien wiederherstellen mit --staged und die Wiederherstellung von einem anderen Commit als HEAD avec --source=<tree> .

12voto

Nirmal Punkte 1109

Diese Antwort bezieht sich auf einen Befehl, der für das Rückgängigmachen lokaler Änderungen in mehreren bestimmten Dateien im selben oder in mehreren Ordnern (oder Verzeichnissen) benötigt wird. Diese Antwort bezieht sich speziell auf Fragen, bei denen ein Benutzer mehr als eine Datei hat, aber nicht alle lokalen Änderungen rückgängig machen möchte:

wenn Sie eine oder mehrere Dateien haben, können Sie denselben Befehl ( git checkout -- file ) bis jeder dieser Dateien, indem Sie die einzelnen Speicherorte getrennt durch Leerzeichen getrennt wie in:

git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

Beachten Sie die Leerstelle zwischen name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

Für mehrere Dateien im selben Ordner:

Wenn Sie die Änderungen für alle Dateien in einer bestimmten Verzeichnis zu verwerfen, verwenden Sie den Git-Checkout wie folgt:

git checkout -- name1/name2/*

Das Sternchen in der obigen Zeile bewirkt, dass alle Dateien an diesem Ort unter name1/name2 gelöscht werden.

Auf ähnliche Weise können die folgenden Änderungen in allen Dateien für mehreren Ordnern rückgängig machen:

git checkout -- name1/name2/* nameA/subFolder/*

Beachten Sie auch hier das Leerzeichen zwischen name1/name2/* nameA/subFolder/* in der oben.

Hinweis: name1, name2, nameA, subFolder - alle diese Beispiel-Ordnernamen geben den Ordner oder das Paket an, in dem sich die betreffende(n) Datei(en) befinden können.

9voto

sdaau Punkte 34279

Das verwirrt mich immer wieder, deshalb hier ein Testfall zur Erinnerung: Nehmen wir an, wir haben Folgendes bash Skript zum Testen git :

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

Zu diesem Zeitpunkt ist die Änderung noch nicht im Cache gespeichert, so dass 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 wir von diesem Punkt aus git checkout Das Ergebnis ist folgendes:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Wenn wir stattdessen git reset 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 nicht stufenweise erfolgen, git reset macht keinen Unterschied, während git checkout überschreibt die Änderungen.


Nehmen wir nun an, dass die letzte Änderung aus dem obigen Skript staged/cached ist, d.h. wir haben auch git add b.txt am Ende.

In diesem Fall, git status zu diesem Zeitpunkt ist:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

Wenn wir von diesem Punkt aus git checkout Das Ergebnis ist folgendes:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Wenn wir stattdessen git reset 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 schrittweise erfolgen, git reset macht aus abgestuften Änderungen grundsätzlich nicht abgestufte Änderungen - während git checkout werden die Änderungen vollständig überschrieben.

5voto

Beto Punkte 733

Ich stelle meine Dateien unter Verwendung der SHA-ID wieder her. git checkout <sha hash id> <file name>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X