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?

War es hilfreich?

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 habe durch git bash Done:

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

  1. Git-Status. [So haben wir eine Datei wad gesehen geändert.]
  2. git checkout - index.html [i haben in index.html Datei geändert:
  3. git status [jetzt wurde diese Änderungen removed]

 image description hier

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

Für mich nur diese eine gearbeitet

git checkout -p filename

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.

Ich weiß nicht, warum, aber wenn ich versuche, meinen Code eingeben, kommt es als ein Bild auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top