Jak znaleźć i przywrócić usunięty plik w repozytorium Git
Powiedzmy, że jestem w repozytorium Git. Usuwam plik i zatwierdzam tę zmianę. Kontynuuję pracę i robię kolejne commity. Potem muszę przywrócić ten plik.
Wiem, że mogę pobrać plik za pomocą git checkout HEAD^ foo.bar
, ale tak naprawdę Nie wiem, kiedy ten plik został usunięty.
- jak najszybciej znaleźć commit, który usunął daną nazwę pliku?
- Jaki byłby najprostszy sposób, aby dostać ten plik z powrotem do mojej kopii roboczej?
Mam nadzieję Nie muszę ręcznie przeglądać moich dzienników, kasować całego projektu dla danego SHA, a następnie ręcznie skopiować ten plik do mojego oryginalnego projektu checkout.
27 answers
Znajdź ostatni commit, który wpłynął na podaną ścieżkę. Ponieważ plik nie znajduje się w zatwierdzeniu głównym, musi on zostać usunięty.
git rev-list -n 1 HEAD -- <file_path>
Następnie sprawdź wersję przed zatwierdzeniem, używając symbolu caret (^
):
git checkout <deleting_commit>^ -- <file_path>
Lub jednym poleceniem, Jeśli $file
jest danym plikiem.
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"
Jeśli używasz zsh i masz włączoną opcję EXTENDED_GLOB, symbol karetki nie będzie działał. Możesz zamiast tego użyć ~1
.
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 17:11:57
- Użyj
git log --diff-filter=D --summary
, aby uzyskać wszystkie commity, które usunęły pliki i pliki usunięte; - Użyj
git checkout $commit~1 path/to/file.ext
, aby przywrócić usunięty plik.
Gdzie $commit
jest wartością commita znalezionego w kroku 1, np. e4cf499627
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-18 17:14:18
Aby przywrócić wszystkie usunięte pliki w folderze, wprowadź następujące polecenie.
git ls-files -d | xargs git checkout --
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:26:24
Zadałem sobie to pytanie, chcąc przywrócić plik, który właśnie usunąłem, ale jeszcze nie wprowadziłem zmiany. Na wypadek, gdybyś znalazł się w tej sytuacji, wszystko, co musisz zrobić, to:
git checkout HEAD -- path/to/file.ext
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-10 00:03:18
Jeśli jesteś szalony, użyj git-bisect
. Oto co zrobić:
git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>
Teraz czas na automatyczny test. Polecenie powłoki '[ -e foo.bar ]'
zwróci 0, Jeśli foo.bar
istnieje, a 1 w przeciwnym razie. Polecenie " run " git-bisect
użyje wyszukiwania binarnego, aby automatycznie znaleźć pierwszy commit, w którym test się nie powiedzie. Rozpoczyna się w połowie danego zakresu (od dobrego do złego) i tnie go na pół na podstawie wyniku określonego testu.
git bisect run '[ -e foo.bar ]'
Teraz jesteś w commit, który go usunął. Stąd możesz wrócić do przyszłości i użyć git-revert
aby cofnąć zmianę,
git bisect reset
git revert <the offending commit>
Albo możesz cofnąć jeden commit i ręcznie sprawdzić obrażenia:
git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-28 19:10:53
Mój nowy ulubiony alias, oparty na bonyiii 'S answer (upvoted) i mojej własnej odpowiedzi na temat" podaj argument do komendy Git alias":
git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'
Zgubiłem plik, usunięty przez pomyłkę kilka commitów temu?
Szybko:
git restore my_deleted_file
Kryzys zażegnany.
Uwaga, Z Git 2.23 (Q3 2019) pochodzi eksperymentalna Komenda o nazwie git restore
(!).Więc zmień nazwę tego aliasu(jak pokazano poniżej).
Robert Dailey proponuje w komentarzach następujący alias:
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
I jegan dodaje w komentarzach :
Do Ustawienia aliasu z linii poleceń użyłem polecenia:
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-02 13:48:21
Jeśli znasz nazwę pliku, jest to łatwy sposób z podstawowymi poleceniami:
Wypisuje wszystkie commity dla tego pliku.
git log -- path/to/file
Ostatni commit (najwyższy) to ten, który usunął plik. Więc musisz przywrócić przedostatni commit.
git checkout {second to last commit} -- path/to/file
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-15 11:48:31
Przywracanie usuniętego i zatwierdzonego pliku:
git reset HEAD some/path
git checkout -- some/path
Został przetestowany na Git w wersji 1.7.5.4.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 20:26:38
Jeśli tylko wprowadziłeś zmiany i usunąłeś plik, ale nie zatwierdziłeś go, a teraz zerwałeś ze swoimi zmianami
git checkout -- .
Ale usunięte pliki nie powróciły, wystarczy wykonać następujące polecenie:
git checkout <file_path>
Presto, Twoje akta wróciły.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 15:30:19
Mam To rozwiązanie .
-
Uzyskaj identyfikator zatwierdzenia, w którym plik został usunięty, używając jednego z poniższych sposobów.
-
git log --grep=*word*
git log -Sword
git log | grep --context=5 *word*
-
git log --stat | grep --context=5 *word*
# zalecane, jeśli trudno Zapamiętaj Wszystko
-
-
Powinieneś dostać coś w stylu:
Commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 autor: Alexander Orlov Data: Thu May 12 23:44:27 2011 +0200
replaced deprecated GWT class - gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script
Commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 autor: Alexander Orlov Data: Thu May 12 22:10:22 2011 +0200
3. Teraz używając identyfikatora zatwierdzenia bfe68bd117e1091c96d2976c99b3bcc8310bebe7 do:
git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java
Ponieważ identyfikator commita odwołuje się do commita, w którym plik został już usunięty, musisz odwołać się do commita tuż przed bfe68b, co możesz zrobić, dodając ^1
. Oznacza to: daj mi commit tuż przed bfe68b.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-25 18:07:17
git checkout /path/to/deleted.file
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-25 18:05:51
git undelete path/to/file.ext
-
Umieść to w swoim
.bash_profile
(lub innym odpowiednim pliku, który ładuje się po otwarciu powłoki poleceń):git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
-
Następnie użyj:
git undelete path/to/file.ext
Ten alias najpierw sprawdza, czy znajduje ostatni commit, w którym istniał ten plik, a następnie wykonuje polecenie Git dla tej ścieżki z ostatniego commita, w którym istniał ten plik. źródło .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:34:44
W wielu przypadkach przydatne może być użycie coreutils (grep, sed, itp.) w połączeniu z Git. Znam już te narzędzia całkiem dobrze, ale Git mniej. Jeśli chciałbym wyszukać usunięty plik, wykonałbym następujące czynności:
git log --raw | grep -B 30 $'D\t.*deleted_file.c'
Kiedy znajdę revision/commit:
git checkout <rev>^ -- path/to/refound/deleted_file.c
Tak jak inni mówili przede mną.
Plik zostanie przywrócony do stanu sprzed usunięcia. Pamiętaj o ponownym przypisaniu go do działającego drzewa, jeśli chcesz go zachować w pobliżu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 20:27:59
Właściwie to pytanie dotyczy bezpośrednio Gita, ale ktoś taki jak ja pracuje z narzędziami GUI takimi jak WebStorm VCS inne niż znajomość poleceń Git CLI.
Klikam prawym przyciskiem myszy na ścieżce, która zawiera usunięty plik, a następnie przechodzę do Git i klikam na Show History .
The VCS tools show all revisions train and I can see all commits and changes of each of them.
Następnie wybieram commity, które mój przyjaciel usuwa plik PostAd.js
. zobacz poniżej:
A teraz widzę moje pragnienie usunięte pliki. Po prostu klikam dwukrotnie na nazwę pliku i odzyskuje się.
Wiem, że moja odpowiedź nie jest komend Git, ale jest szybka, niezawodna i łatwa dla początkujących i profesjonalnych programistów. WebStorm VCS tools są niesamowite i idealne do pracy z Gitem i nie potrzebuje żadnych innych wtyczek ani narzędzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:46:10
Musiałem przywrócić kilka usuniętych plików z określonego commita i zarządzałem tym za pomocą dwóch komend:
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ --
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD
(zwróć uwagę na spację końcową na końcu każdego polecenia.)
Pliki zostały dodane do.plik gitignore, a następnie wyczyszczone za pomocą git rm
. Musiałem przywrócić pliki, ale potem je odinstalować. Miałem setki plików do przywrócenia, a pisanie rzeczy ręcznie dla każdego pliku, jak w innych przykładach, miało być zbyt wolne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:30:06
Miałem to samo pytanie. Nie wiedząc o tym, stworzyłem zwisające.
Lista zwisających commitów
git fsck --lost-found
Sprawdź każdy zwisający commit
git reset --hard <commit id>
Moje pliki pojawiły się ponownie, gdy przeniosłem się do zwisającego commita.
git status
z powodu:
“HEAD detached from <commit id where it detached>”
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 17:08:40
Znajdź commit, który usunął Twój plik:
git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '
Przykładowe wyjście:
4711174
Od wersji Git 2.23 istnieje polecenie restore
. Jest to wciąż eksperymentalne , ale aby przywrócić coś, co usunąłeś w commicie (4711174 w tym przypadku), możesz wpisać:
git restore --source=4711174^ path/to/file
Zwróć uwagę na ^ po zatwierdzeniu id chcemy przywrócić coś z zatwierdzania przed Tym, który usunął plik.
Argument --source
mówi komendzie restore
gdzie szukać plików do przywrócenia i może to być dowolny commit, a nawet indeks.
Zobacz: git-restore doc for git 2.23.0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-05 16:05:16
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory
Przywróć usunięty plik:
user@bsd:~/work/git$ git checkout
D .slides.tex.swp
D slides.tex
user@bsd:~/work/git$ git checkout slides.tex
user@bsd:~/work/git$ ls slides.tex
slides.tex
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-29 16:35:45
Jeśli znasz commit, który usunął plik(y), uruchom to polecenie, gdzie <SHA1_deletion>
jest commitem, który usunął plik:
git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --
Część przed potokiem wyświetla listę wszystkich plików, które zostały usunięte w commicie; wszystkie są kasami z poprzedniego commitu, aby je przywrócić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 19:27:52
W naszym przypadku przypadkowo usunęliśmy pliki w commicie i niektóre commity później zdaliśmy sobie sprawę z naszego błędu i chcieliśmy odzyskać wszystkie pliki, które zostały usunięte, ale nie te, które zostały zmodyfikowane.
Bazując na doskonałej odpowiedzi Charlesa Baileya, oto moja jedna linijka:git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:28:14
Proste i precyzyjne -
Po pierwsze, pobierz najnowszy stabilny commit, w którym masz ten plik przez -
git log
/ Align = "left" / 1234567.., then
git checkout <$commitid> $fileName
Spowoduje przywrócenie wersji pliku, która była w tym zatwierdzeniu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-26 12:31:23
Najlepszy sposób, aby to zrobić, spróbuj.
Najpierw znajdź identyfikator zmiany, który usunął Twój plik. To daje podsumowanie commitów, które usunięte pliki.
Git log --diff-filter=d --summary
Git checkout 84sdhfddbddf~1
Uwaga: 84sdhfddbddd
jest Twoim commit id
Dzięki temu możesz łatwo odzyskać wszystkie usunięte pliki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:36:14
Zawsze możesz git revert
twój commit, który usunął plik. (zakłada to, że usunięcie było jedyną zmianą w commicie.)
> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <[email protected]>
Date: Thu May 9 11:11:06 2019 -0700
deleted readme.md
A jeśli kontynuujesz pracę, a później zdasz sobie sprawę, że nie chcesz zatwierdzać tego usunięcia, możesz go przywrócić używając:
> git revert 2994bd
Teraz git log
pokazuje:
> git log
Author: Dave <[email protected]>
Date: Thu May 9 11:17:41 2019 -0700
Revert "deleted readme"
This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.
I readme.md
zostały przywrócone do repozytorium.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:42:58
Mam również ten problem używając poniższego kodu do pobrania poprzedniego pliku do lokalnego katalogu:
git checkout <file path with name>
Poniższy przykład działa dla mnie:
git checkout resources/views/usaSchools.blade.php
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:41:47
Jeśli usunięcie nie zostało zatwierdzone, poniższe polecenie przywróci usunięty plik w drzewie roboczym.
$ git checkout -- <file>
Możesz uzyskać listę wszystkich usuniętych plików w drzewie roboczym za pomocą poniższego polecenia.
$ git ls-files --deleted
Jeśli usunięcie zostało popełnione, znajdź zatwierdzenie, w którym nastąpiło, a następnie odzyskaj Plik z tego zatwierdzenia.
$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>
W przypadku, gdy szukasz ścieżki do odzyskania pliku, poniższe polecenie wyświetli podsumowanie wszystkich usuniętych plików pliki.
$ git log --diff-filter=D --summary
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-12 18:56:41
$ git log --diff-filter=D --summary | grep "delete" | sort
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-05 01:01:30
Aby przywrócić wszystkie usunięte pliki za pomocą Git, możesz również zrobić:
git checkout $(git ls-files --deleted)
Gdzie git ls-files --deleted
wyświetla wszystkie usunięte pliki, a git checkout $(git command)
przywraca listę plików w parametrze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 22:39:05