Jak przywrócić cały katalog z historii repozytorium git?


91

Chciałbym przywrócić cały katalog (rekurencyjnie) z historii mojego repozytorium git.

Jest tylko 1 gałąź (master).

Znam zatwierdzenie, w którym były błędy.

Czy mogę użyć skrótu sha1 zatwierdzenia nadrzędnego, aby przywrócić stan katalogu, jaki był przed dołączeniem błędów?

Pomyślałem o czymś takim:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

ale to nie zadziałało.


7
spróbuj dodać „-” między wersjami i ścieżkami:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Carlos Campderrós

to pomogło. Dziękuję Ci bardzo.
mostwanted

1
@ CarlosCampderrós Napisz to jako prawdziwą odpowiedź i zbierz swoje 15 punktów zanim zrobi to ktoś inny;)
ralphtheninja

@MagnusSkog Nie byłem pewien, czy to zadziała, więc napisałem komentarz, aby sprawdzić. Teraz, gdy jestem pewien, że działa,
zapisałem

2
Ogólnie rzecz biorąc, „to nie zadziałało” jest mało przydatne. Powiedz nam, dlaczego to nie zadziałało, najlepiej z wyjściem błędu (przyciętym, jeśli jest bardzo długi).
me_and

Odpowiedzi:


156

spróbuj dodać „-” między wersjami i ścieżkami:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

A jeśli chcesz odzyskać katalog z poprzedniego zatwierdzenia, możesz zamienić skrót zatwierdzenia na HEAD ~ 1, na przykład:

git checkout HEAD~1 -- path/to/the/folder/ 

to samo polecenie, prawie inny cel: stackoverflow.com/questions/953481/…
cregox

18
Jest jednak jeden problem: OP nie określa, czy katalog nadal istnieje. Aby przywrócić istniejący katalog do stanu zatwierdzenia, najpierw należy usunąć zawartość katalogu. W innym przypadku istniejące pliki, które nie istniały w starym zatwierdzeniu, nie zostaną usunięte.
Alberto,

7
+1 @Alberto zdecydowanie się zgadzam. Zrobiłem rm -Rf path/to/the/folderwtedy git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- Wynik: ta ścieżka miała dokładnie takie same pliki jak w tym zatwierdzeniu, bez różnic i żadnych dodatkowych plików, które zostały utworzone po tym zatwierdzeniu. Tego właśnie chcę.
theroby znacie

2
co to --robi?
Ray Foss

2
@RayFoss mówi gitowi, że poniższe parametry są plikami (w przeciwnym razie można je pomylić z hashem zatwierdzenia, rozgałęzieniem lub czymś innym). Zwykle nie są potrzebne, ale nie zaszkodzi je umieścić
Carlos Campderrós

3

Można to zrobić na dwa proste sposoby:

Jeśli zatwierdzenie, które zawierało błędy, zawierało tylko błędy, użyj, git revertaby odwrócić ich skutki.

Jeśli nie, łatwa ścieżka jest następująca:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

Jeśli po prostu git checkout <SHA-ID>to zrobisz, tymczasowo przeniesie Cię to do tego sha-commit.

Każdy obiekt commit przechowuje w tym czasie całą strukturę dysku, więc jeśli masz tam pliki i chcesz je skopiować, możesz to zrobić. Ostrzeżenie jednak, nie będziesz w żadnej gałęzi, więc będziesz musiał wrócić do mastera przed skopiowaniem pliku do drzewa roboczego i zatwierdzeniem go.


re „powrót do mastera” masz na myśli mistrza kasy?
Pacerier
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.