Znajdź i przywróć usunięty plik w repozytorium Git


2802

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.

  1. Jaki byłby najszybszy sposób na znalezienie zatwierdzenia, które usunęło daną nazwę pliku?
  2. 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.


39
zwróć uwagę, że poprzedni komentarz odpowiada na pytanie w tytule, a nie w treści - obejmuje to sprawdzenie, kiedy plik został usunięty.
avdgaag

8
Aby znaleźć zatwierdzenie, plik został usunięty w:git log --diff-filter=D -- path/to/file
titaniumdecoy



54
@ hhh cofnie git checkout deletedFileusunięcie, deletedFilejeś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.
Mark Amery

Odpowiedzi:


3150

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ąć.

git rev-list -n 1 HEAD -- <file_path>

Następnie sprawdź wersję przy zatwierdzeniu wcześniej, używając ^symbolu caret ( ):

git checkout <deleting_commit>^ -- <file_path>

Lub w jednym poleceniu, jeśli $filejest to dany plik.

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ł. Zamiast tego możesz użyć ~1.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

94
Trudnym zadaniem jest sprawdzenie zatwierdzenia PRZED, używając przyrostka ^. Dzięki.
Christian Oudard

4
Z jakiegoś powodu to nie zadziała w Zsh. ± 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.
zoras

20
Z wiersza poleceń systemu Windows dostałem błąd. error: pathspec <filename> did not match any file(s) known to git.. Rozwiązaniem było użycie git bash.
donturner

56
@zoras zsh ma własne rozszerzenie na „^”, ale uważam, że możesz użyć alternatywnej składni „~ 1”: 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.
Nils Luxton,

22
W Windows cmd znak ten ^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, zobaczy SHA1i nie SHA1^ . 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)
Alexander Bird,

875
  1. Służy git log --diff-filter=D --summarydo pobierania wszystkich zatwierdzeń, które usunęły pliki i pliki zostały usunięte;
  2. Użyj, git checkout $commit~1 path/to/file.extaby przywrócić usunięty plik.

Gdzie $commitjest wartość zatwierdzenia znalezionego w kroku 1, npe4cf499627


10
ciekawe, do czego odnosi się ~ 1?
tommy chheng

7
@tommy - specyfikacja tyldy da ci n-tego wnuka nazwanego zatwierdzenia. Aby uzyskać więcej informacji, zobacz book.git-scm.com/4_git_treeishes.html .
Robert Munteanu,

5
jest to zdecydowanie najłatwiejsze i intuicyjne podejście. git log -- *PartOfMyFileName*. Dzięki za$commit~1
bgs

3
git checkout $commit~1 filenameskł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ź!
noinput

34
@Alexar $commit~1oznacza, że ​​powinieneś dodać nazwę zatwierdzenia. Coś jak 1d0c9ef6eb4e39488490543570c31c2ff594426cgdzie $commitjest.
Eugene

319

Aby przywrócić wszystkie usunięte pliki w folderze, wprowadź następujące polecenie.

git ls-files -d | xargs git checkout --

1
Gdzie są przesyłane pliki? Nie widzę żadnej zmiany.
William Grand,

21
Jest to prawdopodobnie najłatwiejsza metoda. To wypaczone, jak trudne gituczyniło nawet najprostsze zadanie.
jww

git checkout - [plik] przywróci zmiany w [pliku]. Potok zastąpi [plik] nazwą usuniętych plików.
Manu,

6
Komenda ls-filespodrzędna jest przydatna, ale wydaje się, że nie działa w przypadku plików, które zostały usunięte, git rmtzn. Przeniesione, nie mówiąc już o zatwierdzeniu, o co poprosił OP.
MarkHu,

Działa to w przypadku przywracania usuniętych plików, ale jak mogę zaktualizować pliki, które zostały zmienione, i pokazać je M myChangedFilepóźniej git checkout?
libby

124

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


93

Jeśli jesteś szalony, użyj git-bisect. Oto co robić:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Teraz nadszedł czas na uruchomienie testu automatycznego. Polecenie powłoki '[ -e foo.bar ]'zwróci 0, jeśli foo.baristnieje, a 1 w przeciwnym razie. Komenda „run” git-bisectuż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.

git bisect run '[ -e foo.bar ]'

Teraz jesteś przy zatwierdzeniu, które go usunęło. Stąd możesz wrócić do przyszłości i git-revertcofnąć zmianę,

git bisect reset
git revert <the offending commit>

lub możesz cofnąć się o jedno zatwierdzenie i ręcznie sprawdzić uszkodzenia:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

2
Czy mógłbyś rozwinąć sprawę git bisect run '[ -e foo.bar ]'?
dodany

Możesz także użyć dobra i zła ręcznie, jeśli nie można tego automatycznie sprawdzić. Zobacz stronę dwusieczną.
Josh Lee

1
@avdgaag git bisect runmówi Gitowi, aby zautomatyzował dzielenie, uruchamiając komendę po słowie „uruchom”, gdzie komenda musi wrócić 0do goodwersji (zobacz git help bisectszczegóły). '[ -e foo.bar ]'Jest standardowym wyrażenie do testowania, czy plik foo.barnie 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ń.
Mikko Rantalainen,

Świetny pomysł. Wypróbowałem to podejście i zidentyfikowałem zatwierdzenie przed usunięciem, ale nie zatwierdzenie, które faktycznie usunęło plik. W innym teście wykrył 2 zatwierdzenia przed usunięciem.
Michael Osofsky

Szalony? Może. Ale bisecta to świetny sposób na znalezienie miejsca, w którym został wprowadzony błąd, więc i tak warto się go nauczyć. Więc chociaż może nie jest to „poprawny” lub najbardziej „poprawny” sposób, nadal jest to dobry pomysł i zdecydowanie +1!
Pryftan,

77

Mój nowy ulubiony alias, na podstawie bonyiii „s odpowiedzi (upvoted) oraz własnej odpowiedzi na temat« Przepuścić argument do polecenia alias Git »:

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 zmian wcześniej?
Szybki:

git restore my_deleted_file

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:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

I jegan dodaje w komentarzach :

Do ustawienia aliasu z wiersza poleceń użyłem tego polecenia:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

7
Przywraca to cały zatwierdzenie, a nie tylko żądany plik.
Daniel Bang

5
Oto mój pseudonim, działa wspaniale:restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
void.pointer

1
@RobertDailey To wygląda świetnie! W odpowiedzi umieściłem twój alias, aby zwiększyć widoczność.
VonC

1
Aby ustawić alias z wiersza poleceń, użyłem tego polecenia:git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
jegan

2
Expansion of alias 'restore' failed; '!git' is not a git command
Karl Morrison

54

Jeśli znasz nazwę pliku, jest to prosty sposób za pomocą podstawowych poleceń:

Wyświetl wszystkie zatwierdzenia dla tego pliku.

git log -- path/to/file

Ostatni zatwierdzenie (najwyższy) to ten, który usunął plik. Musisz więc przywrócić drugi do ostatniego zatwierdzenia.

git checkout {second to last commit} -- path/to/file

Właśnie użyłem tego rozwiązania i nie było zatwierdzenia do usunięcia. Udało mi się jednak przywrócić plik przy użyciu najnowszego identyfikatora zatwierdzenia.
Adam

Czy ostatnie zatwierdzenie (poprzednie zatwierdzenie usunięcia) nie zawierałoby najnowszej wersji usuniętego pliku? Przedostatni (zatwierdzenie przed poprzednim zatwierdzeniem do usunięcia) może być beznadziejnie przestarzały.
Suncat2000

1
To pierwsze rozwiązanie, które widziałem, jest na tyle proste, że nie będę musiał tu wracać, aby je znaleźć następnym razem. Może.
Eloff,

@ Suncat2000 „od drugiego do ostatniego” oznacza „poprzednie zobowiązanie do usunięcia”, tak samo jak „obok ostatniego”. en.wiktionary.org/wiki/penultimate#Synonim
wisbucky

Dzięki zillion razy za tę odpowiedź !!!!!
Rakesh Bk

29

Aby przywrócić usunięty i zatwierdzony plik:

git reset HEAD some/path
git checkout -- some/path

Został przetestowany na wersji Git 1.7.5.4.


1
To nie działało dla mnie. Po kasie error: pathspec 'foo' did not match any file(s) known to git.upewniłem się, że nazwa pliku jest poprawna. Wersja Git 2.7.0
wisbucky

-1; To jest źle. Te polecenia cofnąć usunięcie, które jeszcze nie zostało popełnione (pierwszy unstages usunięcia, jeśli to wystawił, a drugi usuwa Unstaged zmiany w pliku), ale jesteś tutaj twierdząc, że oni przywracania zaangażowana usunięcie pliku, co po prostu nie jest prawdą i zakończy się niepowodzeniem z błędem podobnym do powyższego w komentarzu @ wisbucky.
Mark Amery

@ MarkAmery Rzeczywiście, myślę, że to polecenie działało dobrze dla tych programistów, którzy nie ustawili jawnego przygotowania do zatwierdzania usuniętych plików git add -A, ale przywrócony plik był nadal w fazie niezaangażowania.
Fedir RYKHTIK

25

Jeśli dokonałeś tylko zmian i usunąłeś plik, ale go nie zatwierdziłeś, 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>

I presto, twój plik powrócił.


24

Mam to rozwiązanie .

  1. 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ętasz
  2. Powinieneś dostać coś takiego:

popełnić bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autor: Alexander Orlov Data: czw 12 maja 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

popełnić 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Autor: Alexander Orlov Data: czw 12 maja 22:10:22 2011 +0200

3 . Teraz za pomocą identyfikatora zatwierdzenia bfe68bd117e1091c96d2976c99b3bcc8310bebe7 wykonaj:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

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.


Jest to to samo podejście co zaakceptowana odpowiedź, ale z kilkoma innymi sposobami znalezienia kasującego zatwierdzenia. Nadal podoba mi się podejście przyjęte w przyjętej odpowiedzi, ale są to dobre alternatywy. Dzięki!
avdgaag

Zakładam, że najpierw sprawdzenie usuniętego pliku, a następnie (bez jego zmiany) zatwierdzenie go nie tworzy kopii pliku. Dobrze? (Muszę to zrobić z obrazami, a kopie powiększyłyby repozytorium)
Stonecrusher


12

git undelete path/to/file.ext

  1. 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" -'
    
  2. Następnie użyj:

    git undelete path/to/file.ext
    

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 .


11

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:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

Kiedy znajdę wersję / zatwierdzenie:

git checkout <rev>^ -- path/to/refound/deleted_file.c

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ć.


7

Musiałem przywrócić wiązkę usuniętych plików z określonego zatwierdzenia i zarządzałem nimi za pomocą dwóch poleceń:

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 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.


7

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ę .

Wpisz opis zdjęcia tutaj

Narzędzia VCS pokazują wszystkie zmiany wersji i widzę wszystkie zatwierdzenia i zmiany każdego z nich.

Wpisz opis zdjęcia tutaj

Następnie wybieram zatwierdzenia, że ​​mój przyjaciel usunął PostAd.jsplik. teraz patrz poniżej:

Wpisz opis zdjęcia tutaj

A teraz widzę moje pragnienie usunięcia pliku. Wystarczy dwukrotnie kliknąć nazwę pliku, aby odzyskać.

Wpisz opis zdjęcia tutaj

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.


1
To jest niesamowite! Dziękuję Ci. Zdecydowanie łatwiejsze rozwiązanie dla tych, którzy używają IDE JetBrain.
Fabiano Arruda

Jak przywrócić plik, jeśli jest obrazem?
Nodirabegimxonoyim

Drogi @FabianoArruda, IDE JetBrains to potężne narzędzia do programowania. dziękuję za twój piękny komentarz.
AmerllicA

Dzięki tobie drogi @PeterMortensen za wydanie.
AmerllicA

6

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>”


2
Dziękuję Ci bardzo. Pomogłeś mi przywrócić tysiące linii kodów.
Reuben

5
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

2
Pytanie dotyczyło przywrócenia pliku po jego usunięciu i zatwierdzeniu zmiany. Ta odpowiedź dotyczy przywracania pliku, który został usunięty tylko z katalogu roboczego.
akaihola,

To prawda i właśnie tego szukałem.
Hola Soy Edu Feliz Navidad

4

Jeśli znasz zatwierdzenie, które usunęło plik (i), uruchom to polecenie, gdzie <SHA1_deletion>jest zatwierdzenie, które usunęło plik:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

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ć.


4

Znajdź zatwierdzenie, które usunęło twój plik:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

Przykładowe dane wyjściowe:

4711174

Od wersji Git 2.23 jest tak naprawdę restorepolecenie. Nadal jest w fazie eksperymentalnej, ale aby przywrócić coś, co usunąłeś z zatwierdzenia (w tym przypadku 4711174), możesz wpisać:

git restore --source=4711174^ path/to/file

Zauważ, że ^ po popełnić id jak chcemy przywrócić coś od zatwierdzenia przed tym, który usunął plik.

--sourceArgumentem opowiada restorepoleceń, 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


4

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:

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)

2

Prosty i precyzyjny

Po pierwsze, uzyskaj najnowsze stabilne zatwierdzenie, w którym masz ten plik przez -

git log 

Powiedzmy, że znajdziesz $ commitid 1234567 ... więc

git checkout <$commitid> $fileName

Spowoduje to przywrócenie wersji pliku, która była w tym zatwierdzeniu.


1

Aby to zrobić najlepiej, spróbuj.


Najpierw znajdź identyfikator zatwierdzenia, który usunął twój plik. Daje ci podsumowanie zatwierdzonych usuniętych plików.

git log --diff-filter = D - podsumowanie

git checkout 84sdhfddbdddf ~ 1

Uwaga: 84sdhfddbddd jest twójcommit id

Dzięki temu możesz łatwo odzyskać wszystkie usunięte pliki.


1

Zawsze git revertmożesz zatwierdzić, który usunął plik. ( Zakłada się, że usunięcie było jedyną zmianą w zatwierdzeniu ).

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

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:

> git revert 2994bd

Teraz git logpokazuje:

> git log
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

I readme.mdzostał przywrócony do repozytorium.


Ponieważ pytanie zakłada, że ​​po usunięciu pliku dokonano szeregu zatwierdzeń i ponieważ nic nie wskazuje na to, że kolejne zatwierdzenia są niepożądane, wydaje się, że nie pomoże to OP w opisanej sytuacji.
Jonathan Leffler

1
Tak! Możesz dokonywać kolejnych zatwierdzeń i nadal cofać zatwierdzenie usuwania. Więc jeśli zatwierdzenie 111 usuwa plik i zatwierdzenie 222, 333, 444, dodaje / modyfikuje rzeczy, nadal możesz cofnąć zatwierdzenie 111, aby cofnąć usunięcie, i stanie się ono zatwierdzone 555
Dave Baghdanov

0

Mam również ten problem przy użyciu poniższego kodu, aby pobrać poprzedni plik do katalogu lokalnego:

git checkout <file path with name>

Poniższy przykład działa dla mnie:

git checkout resources/views/usaSchools.blade.php


Proszę wspomnieć, na czym polega problem
Akbor

Usunięcie zostało już popełnione. W takim przypadku musisz określić zatwierdzenie do przywrócenia.
sba


-1

Jeśli usunięcie nie zostało zatwierdzone, poniższe polecenie przywróci usunięty plik z drzewa roboczego.

$ git checkout -- <file>

Możesz uzyskać listę wszystkich usuniętych plików z drzewa roboczego, używając poniższego polecenia.

$ git ls-files --deleted

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.

$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>

Jeśli szukasz ścieżki pliku do odzyskania, poniższe polecenie wyświetli podsumowanie wszystkich usuniętych plików.

$ git log --diff-filter=D --summary

-1

Aby przywrócić wszystkie usunięte pliki za pomocą Git, możesz również:

git checkout $(git ls-files --deleted)

Gdzie git ls-files --deletedwyświetla listę wszystkich usuniętych plików i git checkout $(git command)przywraca listę plików w parametrze.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.