Frage Ä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 ich sie auf den gleichen Status wie das letzte Commit zurückstelle.

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

Wie mache ich das?


1294
2018-03-28 05:09


Ursprung


Antworten:


Sie können verwenden

git checkout -- file

Sie können es ohne die tun -- (wie von Nimrodm vorgeschlagen), aber wenn der Dateiname wie eine Verzweigung oder ein Tag (oder eine andere Revisions-ID) aussieht, kann es verwirrend sein, also zu 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

1786
2018-03-28 06:12



git checkout <commit> <filename>

Ich habe das heute benutzt, weil ich merkte, dass mein Favicon vor ein paar Commits überschrieben wurde, als ich auf Drupal 6.10 upgrated, also musste ich es zurückbekommen. Hier ist, was ich getan habe:

git checkout 088ecd favicon.ico

115
2018-03-28 10:25



Benutz einfach

git checkout filename

Dadurch wird Dateiname durch die aktuelle Version aus dem aktuellen Zweig ersetzt.

ACHTUNG: Ihre Änderungen werden verworfen - es wird kein Backup erstellt.


101
2018-03-28 05:55



Wenn Ihre Datei bereits inszeniert ist (passiert, wenn Sie nach der Bearbeitung der Datei ein Git hinzufügen usw.), um Ihre Änderungen zu deaktivieren.

Benutzen

git reset HEAD <file>

Dann

git checkout <file>

Wenn nicht bereits inszeniert, einfach verwenden

git checkout <file>

51
2017-07-03 05:46



Wenn Sie nur die Änderungen des vorherigen Commits für diese eine 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 du noch ein paar Commits zurückgehen willst, benutze die branchname~n Notation.


15
2018-03-28 05:25



Ich bin immer verwirrt, also hier ist eine Erinnerung Testfall; Sagen wir, wir haben das 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 wird die Änderung nicht im Cache gespeichert 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")

Von diesem Punkt an tun wir es git checkoutDas Ergebnis ist folgendes:

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

Wenn wir es stattdessen tun git reset, Das Ergebnis ist:

$ 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 inszeniert sind, git reset macht keinen Unterschied, während git checkout überschreibt die Änderungen.


Lassen Sie uns nun sagen, dass die letzte Änderung aus dem obigen Skript inszeniert / zwischengespeichert wurde, das heißt wir auch getan haben git add b.txt 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

Von diesem Punkt an tun wir es git checkoutDas Ergebnis ist folgendes:

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

Wenn wir es stattdessen tun git reset, Das Ergebnis ist:

$ 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 inszeniert sind, git reset wird im Wesentlichen abgestufte Änderungen in ungeschnittenen Änderungen machen - während git checkout Überschreibt die Änderungen vollständig.


7
2018-02-09 08:56



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


5
2018-05-22 20:39