Mam repozytorium Git z n zatwierdzeniami.
Mam plik, którego potrzebuję i który był kiedyś w repozytorium, i nagle szukam i myślę „Och! Gdzie ten plik poszedł?”
Czy istnieje (szereg) poleceń Git, które powiedzą mi, że „plik naprawdę_needed.txt został usunięty przy zatwierdzeniu n-13”?
Innymi słowy, nie patrząc na poszczególne zatwierdzenia i wiedząc, że moje repozytorium Git ma każdą zmianę każdego pliku, czy mogę szybko znaleźć ostatnie zatwierdzenie, które MA ten plik, aby go odzyskać?
Odpowiedzi:
git log --full-history -- [file path]
pokazuje zmiany pliku, działa, nawet jeśli plik został usunięty.Przykład:
Jeśli chcesz zobaczyć tylko ostatnie zatwierdzenie, które usunęło plik, użyj dodatkowo -1, np.
git log --full-history -1 -- [file path]
Zobacz, które zatwierdzenie usunęło plik
źródło
git log -- */<<filename>>.<<file extension>>
nie znając całej ścieżki pliku.Krótka odpowiedź:
pokaże wszystkie zatwierdzenia w historii twojego repozytorium, w tym zatwierdzenia scalenia, które się dotknęły
your_file
. Ostatni (górny) to ten, który usunął plik.Niektóre wyjaśnienia:
--full-history
Flaga tutaj jest bardzo ważne. Bez tego Git wykonuje „uproszczenie historii”, gdy poprosi go o dziennik pliku. Dokumenty zawierają szczegółowe informacje na temat tego, jak to dokładnie działa, i brakuje mi odwagi i odwagi, aby spróbować to rozgryźć na podstawie kodu źródłowego, ale dokumenty git-log mają tak wiele do powiedzenia:Jest to oczywiście niepokojące, gdy usuwany jest plik, którego historii chcemy , ponieważ najprostszą historią wyjaśniającą końcowy stan usuniętego pliku jest brak historii . Czy istnieje ryzyko, że
git log
bez--full-history
będzie po prostu twierdzić, że plik nigdy nie został utworzony? Niestety tak. Oto demonstracja:Zauważ, jak
git log -- bar
powyższy zrzut terminala spowodował dosłownie brak danych wyjściowych; Git „upraszcza” historię w fikcję, w którejbar
nigdy nie istniał.git log --full-history -- bar
, z drugiej strony, daje nam zatwierdzenie, które utworzyłobar
i zatwierdzenie, które je usunęło.Żeby było jasne: ten problem nie jest jedynie teoretyczny. Przejrzałem tylko dokumenty i odkryłem
--full-history
flagę, ponieważgit log -- some_file
zawiodło mnie w prawdziwym repozytorium, w którym próbowałem wyśledzić usunięty plik. Uproszczenie historii może czasem być pomocne, gdy próbujesz zrozumieć, w jaki sposób obecnie istniejący plik znalazł się w jego obecnym stanie, ale gdy próbujesz wyśledzić usunięcie pliku , bardziej prawdopodobne jest to, że Cię przekręcisz, ukrywając zatwierdzenie, na którym ci zależy. . Zawsze używaj--full-history
flagi dla tego przypadku użycia.źródło
git log
wyniku nie jest wcale oczywiste, że ostatnie zatwierdzenie usunęło plik. Próbowałem równieżgit log --name-status --full-history -- file_name
igit log -p --stat --full-history -- file_name
, ale żaden z nich wyraźnie nie wskazuje, że plik został usunięty w ostatnim zatwierdzeniu. To wygląda na błąd.mkdir somedir && cd somedir && git init && touch foo && git add foo && git commit -m "Added foo" && git checkout -b newbranch && touch bar && git add bar && git commit -m "Added bar" && git checkout master && git rm foo && git commit -m "Deleted foo" && git checkout newbranch && git rm bar && git commit -m "Deleted bar" && git checkout master && git merge newbranch && git log --name-status --full-history -- bar
zawieraD bar
iA bar
dla mnie w danych wyjściowych dziennika z Git 2.12.2. Czy nie widzisz tych wierszy na wyjściu? Jaką masz wersję?git version 2.15.1
Tak, sekwencja poleceń zgłaszaD bar
iA bar
. Być może mój problem dotyczy konkretnie historii mojego pliku..htaccess
Śledziłem historię pliku, który został gitignore'ed i usunięty. W końcu doszedłem do tego i dodałem plik z powrotem. Po dołączeniu--name-status
dogit log
polecenia widzę dwaA .htaccess
wpisy (ponieważ dodałem go ponownie w ostatnim zatwierdzeniu), ale nieD .htaccess
. Wydaje się więc, że w niektórych przypadkach, nawet jeśli plik został usunięty z repozytorium,git log
nie będzie zawierał wyraźnegoD file_name
wpisu..htaccess
dodany został w X zatwierdzenia, ale nie został uwzględniony w zatwierdzeniu przez scalenie, który wprowadził X do mastera? To jedyna rzecz, o której mogę myśleć, że mogłabym argumentować, że powinna wyglądać, jakby plik został dodany i nigdy nie został usunięty, a mimo to nadal nie był obecny. Byłoby ciekawie wypróbować MCVE, a następnie dowiedzieć się, czy to błąd Git, a jeśli nie, czy można poprawić moją odpowiedź, aby załatwić twoją sprawę.Git log, ale musisz poprzedzić ścieżkę
--
Na przykład:
źródło
Właśnie dodałem tutaj rozwiązanie (czy istnieje git, aby wyświetlić listę wszystkich usuniętych plików w repozytorium?) W celu znalezienia zatwierdzeń usuniętych plików za pomocą wyrażenia regularnego:
Zwraca wszystko usunięte w katalogu o nazwie
some_dir
(kaskadowe). Każde wyrażenie regularne tam, gdzie\/some_dir\/
jest zrobi.OSX (dzięki @triplee i @keif)
źródło
sed: 1: "/^commit/h;/\/some_dir\ ...": bad flag in substitute command: '}'
sed
najwyraźniej nie zawsze jest dobry w przypadku średników jako separatorów poleceń. Spróbuj zmienić je na nowe linie lub zmień nased -n -e '/^commit/h' -e '\:/some_dir/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
pracowałem dla mnie na OSX.Ostatni zatwierdzenie, które usunął plik, możesz znaleźć w następujący sposób:
Więcej informacji jest dostępnych tutaj
źródło
Próbować:
źródło