Jak przywrócić plik git do wersji z obszaru przemieszczania?

80

Powiedzmy, że mam plik o nazwie a.txt. Dodaję go do obszaru przemieszczania, a następnie modyfikuję. Jak mogłem przywrócić go do stanu, w jakim go dodałem?

Geo
źródło

Odpowiedzi:

77
  • Przed Git 2.23: git checkout a.txt
  • Począwszy od Git 2.23: git restore a.txt

Git powie ci to, jeśli wpiszesz git status.

Przed Git 2.23:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   a
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified:   a
#

Począwszy od Git 2.23:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   a

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   a
otchłań
źródło
3
@Daenyth Sprawdziłem to przed wysłaniem i widzisz, że dane wyjściowe pokazują różne sposoby resetowania plików w różnych stanach (
staged
1
@Daenyth - myślisz o `` ścieżce nazwy oddziału git checkout '' lub `` ścieżce git checkout HEAD ''
William Pursell
@William: Dzięki! Ma teraz znacznie więcej sensu.
Daenyth
Nie działa dla nowych plików, więc tak naprawdę nie jest wyewidencjonowywany z przemieszczania, ponieważ wymaga obiektu. Jak zrezygnować z wystawienia? edit Działa z --podobnymi statusami.
Rudie
30

git checkout -- a.txt

Inna odpowiedź na tej stronie nie zawiera --i spowodowała pewne zamieszanie.

Oto, co powie Ci Git, kiedy wpiszesz git status:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   a
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified:   a
#
nieprostokątny
źródło
4
Lepiej było powiedzieć nam różnicę, zamiast publikować to, co było wcześniej cytowane.
Bachsau
2

Unstaging a Staged File

Następne dwie sekcje pokazują, jak pracować z obszarem przemieszczania i zmianami w katalogu roboczym. Fajne jest to, że polecenie, którego używasz do określenia stanu tych dwóch obszarów, przypomina również, jak cofnąć zmiany w nich. Na przykład, powiedzmy, że zmieniłeś dwa pliki i chcesz zatwierdzić je jako dwie osobne zmiany, ale przypadkowo wpisujesz git add * i umieszczasz oba na scenie. Jak możesz zdjąć scenę z jednego z dwóch? Polecenie git status przypomina:

$ git add *
$ git status

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

renamed:    README.md -> README
modified:   CONTRIBUTING.md

Tuż pod tekstem „Zmiany do zatwierdzenia” jest napisane, że użyj git reset HEAD ... do unstage. Skorzystajmy więc z tej rady, aby usunąć z sceny plik CONTRIBUTING.md:

$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M   CONTRIBUTING.md

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

renamed:    README.md -> README

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:   CONTRIBUTING.md

Polecenie jest trochę dziwne, ale działa. Plik CONTRIBUTING.md jest modyfikowany, ale ponownie nie znajduje się na scenie.

Girish Rathi
źródło