Przywróć plik ze starego zatwierdzenia w git

Odpowiedzi:

222
git checkout 'master@{7 days ago}' -- path/to/file.txt

Nie zmieni to HEAD, po prostu nadpisze lokalny plik path/to/file.txt

Zobacz man git-rev-parse, aby zapoznać się z możliwymi specyfikacjami wersji (oczywiście prosty skrót (jak dd9bacb) dobrze się sprawdzi)

Nie zapomnij zatwierdzić zmiany (po sprawdzeniu ...)

sehe
źródło
15
Wow, @heneryville i sehe, tak naprawdę pomyślałem, że „7 dni temu” to meta, żebyś zorientował się, co popełnia. ty!
AnneTheAgile,
7
Część 2 Jeśli chcesz wybrać konkretny zatwierdzenie, powyższy format nie działa. Zamiast tego użyj tego, co pokazał Urs poniżej, git checkout commitShaNumber - ścieżka / do / file.txt na stackoverflow.com/questions/215718/…
AnneTheAgile
2
@AnneTheAgile w rzeczywistości jest to wciąż ta sama składnia, tak się złożyło, że podałem „złożony” przykład tego, o revision-specificationco OP poprosił :)
patrz
1
Jeśli twoje zatwierdzenie zostało użyte do usunięcia pliku, który próbujesz odzyskać, po prostu użyj shacommit~1(np .:), git checkout 0f4bbdcd~1 -- path/to/file.txtaby uzyskać zatwierdzenie bezpośrednio przed.
sdlins
90
  1. Sprawdź plik ze starego zatwierdzenia przez git checkout [Revision_Key] -- path/to/file.
  2. Dodawaj, zatwierdzaj, wypychaj odpowiednio.
Urs Reupke
źródło
3
git checkoutradzi sobie z pojedynczymi plikami (patrz odpowiedź sehe), nie trzeba kopiować i wklejać.
Koraktor
1
Czy klucze rewizji są zawsze SHA1 dla zatwierdzenia?
IslandCow,
1
Są, ale zwykle pierwsze 6 do 8 znaków SHA1 są wystarczające do zidentyfikowania wersji.
Urs Reupke
2
@IslandCow nie mogą być sha1 ale również oddział, tag, lub jakakolwiek inna rzecz, która wskazuje na popełnienia, na przykład HEAD, ORIG_HEADczy którykolwiek z tych, w połączeniu z ^/ ~/ @-Style notacji.
Alois Mahdal
2
Wskazujesz, że należy później „dodać” plik. Ale to nieprawda. Plik nie jest umieszczony w obszarze testowym. Jest już dodane.
xApple
9

Musiałem przywrócić najnowszy plik zapisany w git. Aby więc powtórzyć i podać inną perspektywę, musisz to zrobić, wykonując następujące dwa kroki:

  1. git log -3
    Pokazuje trzy ostatnie zatwierdzenia. Przeczytaj komentarze i nazwisko autora, aby zawęzić zakres konkretnej wersji. Zapisz długi identyfikator zatwierdzenia (tj. B6b94f2c19c456336d60b9409fb1e373036d3d71) dla żądanej wersji zatwierdzenia.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - mój_plik.java
    Przekaż identyfikator zatwierdzenia ORAZ nazwę pliku, który chcesz przywrócić. Upewnij się, że masz spację przed i po podwójnym łączniku.

Można to zrobić na wiele innych sposobów. Ale ten jest najprostszy, jaki pamiętam. Mam nadzieję, że to pomaga.

UWAGA: Jeśli znajdujesz się w ścieżce / folderze projektu, nie jest konieczne wpisywanie pełnej ścieżki pliku w poleceniu pobierania.

Salvador Valencia
źródło
Najlepszy komentarz w historii. Ponieważ ta, która jest zaakceptowaną odpowiedzią, zakłada, że ​​plik, który należy pobrać, jest wypychany w górę, jednak to polecenie pobiera / przywraca plik, który istnieje tylko lokalnie.
ot0
1
Właśnie wypróbowałem to w folderze głównym mojego lokalnego repozytorium git. Nadal potrzebowałem podać względną ścieżkę do pliku. Samo podanie - [nazwa pliku] nie działało.
user2784627
@ ot0 Nie, nie zakłada się tego. Są dokładnie taką samą odpowiedzią.
mat
4

Wszystkie odpowiedzi wspominają git checkout <tree-ish> -- <pathspec>. Od wersji git 2.23.0 wprowadzono nową metodę przywracania git , która powinna git checkoutobejmować część tego, za co była odpowiedzialna. Zobacz najważniejsze zmiany na blogu github .

Domyślne zachowanie tego polecenia polega na przywróceniu stanu drzewa roboczego z zawartością pochodzącą z sourceparametru (który w twoim przypadku będzie skrótem zatwierdzenia).

Zakładając, że skrótem zatwierdzenia jest abcdefpolecenie, wyglądałoby to tak:

git restore --source=abcdef file_name

co (domyślnie) umieszcza je w działającym drzewie. Jeśli chcesz umieścić zmianę bezpośrednio w indeksie, aby można było ją od razu zatwierdzić:

git restore --source=abcdef --worktree --staged file_name

lub z krótkimi nazwami opcji:

git restore -s=abcdef -W -S file_name
mjarosie
źródło