it-swarm.com.de

Änderungen 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, 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?

1411
hasen

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
1963
Brian Campbell
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
123
neoneye

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.

115
nimrodm

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>
62
thanikkal

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.

16
sykora

Ich habe durch git bash gemacht:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. Git-Status. [Wir haben gesehen, dass eine Datei geändert wurde.]
  2. git checkout - index.html [Ich habe die index.html-Datei geändert:
  3. git status [jetzt wurden diese Änderungen entfernt]

 enter image description here

11
Shivanandam

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.

7
sdaau

Ich stelle meine Dateien mit der ID SHA wieder her. Was ich mache, ist git checkout <sha hash id> <file name>

5
Beto

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.

4
Nirmal

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
2
Jesse Glick

Bei mir funktionierte nur dieser

git checkout -p filename

 enter image description here

1
Ramesh Bhupathi

Ich weiß nicht warum, aber wenn ich versuche, meinen Code einzugeben, erscheint er als Bild. 

 enter image description here

0
Gene

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.

0
Gina