Przeglądanie usuniętego pliku w Git

105

Usunąłem plik za pomocą Git, a następnie zatwierdziłem, więc plik nie jest już w mojej kopii roboczej. Chcę przejrzeć zawartość tego pliku, ale nie chcę go przywrócić. W jaki sposób mogę to zrobić?

Colin Ramsay
źródło

Odpowiedzi:

145
git show HEAD^:path/to/file

Możesz użyć jawnego identyfikatora zatwierdzenia lub HEAD~nzobaczyć starsze wersje lub jeśli było więcej niż jedno zatwierdzenie od czasu jego usunięcia.

CB Bailey
źródło
6
Zauważ, że path/to/filejest to pełna ścieżka od góry projektu (górny katalog repozytorium).
Jakub Narębski
1
Mam fatal: Invalid object name 'HEAD^'.(muszę wspomnieć, że mam tylko "wstępne zatwierdzenie")
vladkras
1
Jeśli usunięcie jest etapowe, ale nie zostało zatwierdzone, użyj HEAD zamiast HEAD ^ (ponieważ istniało w HEAD). Na przykład pomyślałem, że potrzebuję pliku, więc dodałem go i zobowiązałem się do zapisania mojej pracy, a później usunąłem go, gdy wymyśliłem inne rozwiązanie. Aby zobaczyć oryginalny plik przed ponownym zatwierdzeniem, pokazałem git HEAD: ścieżka / do / plik
Tony Wickham
1
Myślę, że warto również wspomnieć, że działa to tylko wtedy, gdy plik został usunięty w ostatnim zatwierdzeniu. Jeśli plik został usunięty kilka zatwierdzeń temu, musisz użyć jednej z pozostałych odpowiedzi.
jayhendren
50

Jeśli jest to plik, który usunąłeś jakiś czas temu i nie chcesz szukać wersji , możesz użyć (nazwa pliku foow tym przykładzie; możesz użyć pełnej ścieżki):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

Te rev-listspojrzenia inwokacji dla wszystkich korekt fooale tylko jeden list. Ponieważ rev-listlisty są w odwrotnym porządku chronologicznym, to jest to ostatnia zmiana, która uległa zmianie foo, czyli zatwierdzenie, które zostało usunięte foo. (Opiera się to na założeniu, że git nie pozwala na zmianę usuniętego pliku, a mimo to pozostaje usunięty.) Nie możesz po prostu użyć wersji, która rev-listzwraca taką, jaka jest, ponieważ foojuż tam nie istnieje. Trzeba poprosić o jeden tuż przed nią, która zawiera ostatnią wersję pliku, stąd ^in git show.

Louis
źródło
2
Może zajść potrzeba zmiany ostatniego foo na ./foo. A dla nich, którzy nie używają basha, pobierz identyfikator z „git rev-list --max-count = 1 --all - foo”, a następnie wykonaj „git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo” z identyfikatorem (524 .. is the id)
Dror
1
Niezła odpowiedź. Musiałem użyć ~ zamiast ^. Nie pewny dlaczego. I żeby ludzie mieli jasność co do tego, „foo” tutaj musi być pełną ścieżką z katalogu głównego git.
pedorro
Możesz pisać, **/foojeśli nie znasz ścieżki (zadziała to dla polecenia rev-list, ale nie dla polecenia show. Jednak za pomocą zatwierdzenia z polecenia rev-list możesz znaleźć ścieżkę).
Nickolai
10

Ponieważ możesz nie przypomnieć sobie dokładnej ścieżki, możesz zamiast tego pobrać sha1 z dziennika git, a następnie możesz po prostu wydać

 git cat-file -p <sha1>
pdeschen
źródło
5
W imieniu Samuela Slunda : Jednym ze sposobów znalezienia powyższej sumy sha1 jest: git whatchanged --no-abbrevdaje wynik podobny do dziennika git (lub svn).
bezartowy hałas