Powiedz, że jestem w repozytorium Git. Usuwam plik i zatwierdzam tę zmianę. Kontynuuję pracę i robię więcej zobowiązań. Następnie stwierdzam, że muszę przywrócić ten plik.
Wiem, że mogę pobrać plik przy użyciu git checkout HEAD^ foo.bar
, ale tak naprawdę nie wiem, kiedy ten plik został usunięty.
- Jaki byłby najszybszy sposób na znalezienie zatwierdzenia, które usunęło daną nazwę pliku?
- Jaki byłby najłatwiejszy sposób na powrót tego pliku do mojej kopii roboczej?
Mam nadzieję, że nie muszę ręcznie przeglądać dzienników, sprawdzać całego projektu pod kątem danego SHA, a następnie ręcznie kopiować ten plik do mojego oryginalnego kasy.
git
file-io
git-checkout
avdgaag
źródło
źródło
git log --diff-filter=D -- path/to/file
git checkout deletedFile
usunięcie,deletedFile
jeśli zostało usunięte, ale to usunięcie nie zostało jeszcze ustawione lub zatwierdzone . Nie o to tu pyta pytanie; to pytanie dotyczy sposobu przywrócenia pliku, którego usunięcie zostało popełnione wiele zmian wcześniej.Odpowiedzi:
Znajdź ostatnie zatwierdzenie, które wpłynęło na daną ścieżkę. Ponieważ plik nie znajduje się w zatwierdzeniu HEAD, to zatwierdzenie musiało go usunąć.
Następnie sprawdź wersję przy zatwierdzeniu wcześniej, używając
^
symbolu caret ( ):Lub w jednym poleceniu, jeśli
$file
jest to dany plik.Jeśli używasz zsh i masz włączoną opcję EXTENDED_GLOB, symbol karetki nie będzie działał. Zamiast tego możesz użyć
~1
.źródło
± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^
Zmieniłem na bash i to działało dobrze.error: pathspec <filename> did not match any file(s) known to git.
. Rozwiązaniem było użycie git bash.git checkout <deleting-commit>~1 -- <file-path>
~ X pozwala określić X zatwierdzeń przed określonym zatwierdzeniem, więc ~ 1 jest zatwierdzeniem przed ~ 2 to dwa zatwierdzenia wcześniej, itd.^
jest znakiem ucieczki! Dlatego na cmd musisz wpisać,^^
aby powiedzieć cmd, że chcesz pojedynczego literału ^ i że nie unikniesz po nim czegoś innego. Wielu ludziom dzieje się to, że po nich^
następuje spacja. Więc cmd myśli, że uciekasz w przestrzeń - co daje po prostu znak spacji. Tak więc, zanim git otrzyma argumenty CLI, zobaczySHA1
i nieSHA1^
. To jest naprawdę denerwujące.~
nie jest postacią ucieczki, dlatego to wciąż działa. (PS. Jeśli sądzisz, że pracownicy Google będą chcieli uzyskać te informacje, prosimy o głosowanie na ten komentarz)git log --diff-filter=D --summary
do pobierania wszystkich zatwierdzeń, które usunęły pliki i pliki zostały usunięte;git checkout $commit~1 path/to/file.ext
aby przywrócić usunięty plik.Gdzie
$commit
jest wartość zatwierdzenia znalezionego w kroku 1, npe4cf499627
źródło
git log -- *PartOfMyFileName*
. Dzięki za$commit~1
git checkout $commit~1 filename
składnia działa idealny dla poszczególnych plików i działa także dla całych katalogów. to znaczy: przywrócić wszystkie usunięte obrazy w ./images od sha 12345:git checkout 12345~1 images
. dzięki za tę odpowiedź!$commit~1
oznacza, że powinieneś dodać nazwę zatwierdzenia. Coś jak1d0c9ef6eb4e39488490543570c31c2ff594426c
gdzie$commit
jest.Aby przywrócić wszystkie usunięte pliki w folderze, wprowadź następujące polecenie.
źródło
git
uczyniło nawet najprostsze zadanie.ls-files
podrzędna jest przydatna, ale wydaje się, że nie działa w przypadku plików, które zostały usunięte,git rm
tzn. Przeniesione, nie mówiąc już o zatwierdzeniu, o co poprosił OP.M myChangedFile
późniejgit checkout
?Doszedłem do tego pytania, szukając przywrócenia właśnie usuniętego pliku, ale nie zatwierdziłem jeszcze zmiany. Na wypadek, gdybyś znalazł się w takiej sytuacji, wszystko, co musisz zrobić, to:
git checkout HEAD -- path/to/file.ext
źródło
Jeśli jesteś szalony, użyj
git-bisect
. Oto co robić:Teraz nadszedł czas na uruchomienie testu automatycznego. Polecenie powłoki
'[ -e foo.bar ]'
zwróci 0, jeślifoo.bar
istnieje, a 1 w przeciwnym razie. Komenda „run”git-bisect
użyje wyszukiwania binarnego do automatycznego znalezienia pierwszego zatwierdzenia w przypadku niepowodzenia testu. Zaczyna się w połowie podanego zakresu (od dobrego do złego) i przecina go na pół na podstawie wyniku określonego testu.Teraz jesteś przy zatwierdzeniu, które go usunęło. Stąd możesz wrócić do przyszłości i
git-revert
cofnąć zmianę,lub możesz cofnąć się o jedno zatwierdzenie i ręcznie sprawdzić uszkodzenia:
źródło
git bisect run '[ -e foo.bar ]'
?git bisect run
mówi Gitowi, aby zautomatyzował dzielenie, uruchamiając komendę po słowie „uruchom”, gdzie komenda musi wrócić0
dogood
wersji (zobaczgit help bisect
szczegóły).'[ -e foo.bar ]'
Jest standardowym wyrażenie do testowania, czy plikfoo.bar
nie istnieje (implementacja jest zwykle w pliku/usr/bin/[
, który jest zwykle hardlinked do/usr/bin/test
) i pojedyncze znaki quation służą do wprowadzenia że wszystko jako jeden argument wiersza poleceń.Mój nowy ulubiony alias, na podstawie bonyiii „s odpowiedzi (upvoted) oraz własnej odpowiedzi na temat« Przepuścić argument do polecenia alias Git »:
Zgubiłem plik, usunięty przez pomyłkę kilka zmian wcześniej?
Szybki:
Kryzys zażegnany.
Uwaga, wraz z Git 2.23 (III kwartał 2019) pojawia się eksperymentalne polecenie o nazwie
git restore
(!).Zmień nazwę tego aliasu (jak pokazano poniżej).
Robert Dailey proponuje w komentarzach następujący alias:
I jegan dodaje w komentarzach :
źródło
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Expansion of alias 'restore' failed; '!git' is not a git command
Jeśli znasz nazwę pliku, jest to prosty sposób za pomocą podstawowych poleceń:
Wyświetl wszystkie zatwierdzenia dla tego pliku.
Ostatni zatwierdzenie (najwyższy) to ten, który usunął plik. Musisz więc przywrócić drugi do ostatniego zatwierdzenia.
źródło
Aby przywrócić usunięty i zatwierdzony plik:
Został przetestowany na wersji Git 1.7.5.4.
źródło
error: pathspec 'foo' did not match any file(s) known to git.
upewniłem się, że nazwa pliku jest poprawna. Wersja Git 2.7.0git add -A
, ale przywrócony plik był nadal w fazie niezaangażowania.Jeśli dokonałeś tylko zmian i usunąłeś plik, ale go nie zatwierdziłeś, a teraz zerwałeś ze swoimi zmianami
ale usunięte pliki nie powróciły, wystarczy wykonać następujące polecenie:
I presto, twój plik powrócił.
źródło
Mam to rozwiązanie .
Uzyskaj identyfikator zatwierdzenia, w którym plik został usunięty, korzystając z 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 prawie nic nie pamiętaszPowinieneś dostać coś takiego:
3 . Teraz za pomocą identyfikatora zatwierdzenia bfe68bd117e1091c96d2976c99b3bcc8310bebe7 wykonaj:
Ponieważ identyfikator zatwierdzenia odwołuje się do zatwierdzenia, w którym plik został już usunięty, musisz odwołać się do zatwierdzenia tuż przed bfe68b, co możesz zrobić, dodając
^1
. Oznacza to: daj mi zatwierdzenie tuż przed bfe68b.źródło
źródło
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ń):Następnie użyj:
Ten alias najpierw sprawdza, czy znajduje się ostatnie zatwierdzenie w miejscu, w którym istniał ten plik, a następnie wykonuje wypisanie Git ścieżki tego pliku od tego ostatniego zatwierdzenia, w którym istniał ten plik. Źródło .
źródło
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. Gdybym chciał wyszukać usunięty plik, zrobiłbym następujące czynności:
Kiedy znajdę wersję / zatwierdzenie:
Tak jak inni stwierdzili przede mną.
Plik zostanie teraz przywrócony do stanu sprzed usunięcia. Pamiętaj, aby ponownie przypisać go do działającego drzewa, jeśli chcesz go zachować.
źródło
Musiałem przywrócić wiązkę usuniętych plików z określonego zatwierdzenia i zarządzałem nimi za pomocą dwóch poleceń:
(Zwróć uwagę na końcowe spacje na końcu każdego polecenia.)
Pliki zostały dodane do pliku .gitignore, a następnie wyczyszczone za pomocą
git rm
. Musiałem przywrócić pliki, ale potem je wycofać. Miałem setki plików do przywrócenia, a wpisywanie rzeczy ręcznie dla każdego pliku, jak w innych przykładach, będzie o wiele za wolne.źródło
Właściwie to pytanie dotyczy bezpośrednio Gita, ale ktoś taki jak ja pracuje z narzędziami GUI, takimi jak WebStorm VCS oprócz wiedzy o poleceniach Git CLI.
Kliknij prawym przyciskiem myszy ścieżkę zawierającą usunięty plik, a następnie przejdź do Git, a następnie kliknij polecenie Pokaż historię .
Narzędzia VCS pokazują wszystkie zmiany wersji i widzę wszystkie zatwierdzenia i zmiany każdego z nich.
Następnie wybieram zatwierdzenia, że mój przyjaciel usunął
PostAd.js
plik. teraz patrz poniżej:A teraz widzę moje pragnienie usunięcia pliku. Wystarczy dwukrotnie kliknąć nazwę pliku, aby odzyskać.
Wiem, że moja odpowiedź nie jest poleceniami Git, ale jest szybka, niezawodna i łatwa dla początkujących i profesjonalnych programistów. Narzędzia WebStorm VCS są niesamowite i idealne do pracy z Git i nie wymagają żadnych innych wtyczek ani narzędzi.
źródło
Miałem to samo pytanie. Nie wiedząc o tym, stworzyłem zwisające zatwierdzenie .
Lista zwisających zobowiązań
git fsck --lost-found
Sprawdź każde zwisające zatwierdzenie
git reset --hard <commit id>
Moje pliki pojawiły się ponownie, kiedy przeniosłem się do wiszącego zatwierdzenia.
git status
z powodu:“HEAD detached from <commit id where it detached>”
źródło
Przywróć usunięty plik:
źródło
Jeśli znasz zatwierdzenie, które usunęło plik (i), uruchom to polecenie, gdzie
<SHA1_deletion>
jest zatwierdzenie, które usunęło plik:Część przed potokiem zawiera listę wszystkich plików, które zostały usunięte w zatwierdzeniu; wszystkie są kasami z poprzedniego zatwierdzenia, aby je przywrócić.
źródło
Znajdź zatwierdzenie, które usunęło twój plik:
Przykładowe dane wyjściowe:
Od wersji Git 2.23 jest tak naprawdę
restore
polecenie. Nadal jest w fazie eksperymentalnej, ale aby przywrócić coś, co usunąłeś z zatwierdzenia (w tym przypadku 4711174), możesz wpisać:Zauważ, że ^ po popełnić id jak chcemy przywrócić coś od zatwierdzenia przed tym, który usunął plik.
--source
Argumentem opowiadarestore
poleceń, gdzie szukać pliku (ów) do przywrócenia i może to być dowolny popełnić a nawet indeks.Zobacz: git-restore doc dla git 2.23.0
źródło
W naszym przypadku przypadkowo usunęliśmy pliki w zatwierdzeniu, a niektóre zatwierdzenia 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.
Opierając się na doskonałej odpowiedzi Charlesa Baileya, oto moja linijka:
źródło
Prosty i precyzyjny
Po pierwsze, uzyskaj najnowsze stabilne zatwierdzenie, w którym masz ten plik przez -
Powiedzmy, że znajdziesz $ commitid 1234567 ... więc
Spowoduje to przywrócenie wersji pliku, która była w tym zatwierdzeniu.
źródło
Aby to zrobić najlepiej, spróbuj.
Najpierw znajdź identyfikator zatwierdzenia, który usunął twój plik. Daje ci podsumowanie zatwierdzonych usuniętych plików.
Uwaga:
84sdhfddbddd
jest twójcommit id
Dzięki temu możesz łatwo odzyskać wszystkie usunięte pliki.
źródło
Zawsze
git revert
możesz zatwierdzić, który usunął plik. ( Zakłada się, że usunięcie było jedyną zmianą w zatwierdzeniu ).A jeśli kontynuowałeś pracę i później uświadomiłeś sobie, że nie chcesz zatwierdzić usunięcia, możesz go cofnąć, używając:
Teraz
git log
pokazuje:I
readme.md
został przywrócony do repozytorium.źródło
Mam również ten problem przy użyciu poniższego kodu, aby pobrać poprzedni plik do katalogu lokalnego:
Poniższy przykład działa dla mnie:
git checkout resources/views/usaSchools.blade.php
źródło
źródło
Jeśli usunięcie nie zostało zatwierdzone, poniższe polecenie przywróci usunięty plik z drzewa roboczego.
Możesz uzyskać listę wszystkich usuniętych plików z drzewa roboczego, używając poniższego polecenia.
Jeśli usunięcie zostało zatwierdzone, znajdź zatwierdzenie w miejscu, w którym się zdarzyło, a następnie odzyskaj plik z tego zatwierdzenia.
Jeśli szukasz ścieżki pliku do odzyskania, poniższe polecenie wyświetli podsumowanie wszystkich usuniętych plików.
źródło
Aby przywrócić wszystkie usunięte pliki za pomocą Git, możesz również:
Gdzie
git ls-files --deleted
wyświetla listę wszystkich usuniętych plików igit checkout $(git command)
przywraca listę plików w parametrze.źródło