Jak mogę zresetować lub przywrócić plik do określonej wersji?

4511

Wprowadziłem kilka zmian w pliku, który został popełniony kilka razy w ramach grupy plików, ale teraz chcę zresetować / przywrócić zmiany w nim z powrotem do poprzedniej wersji.

Zrobiłem git lograzem z, git diffaby znaleźć potrzebną wersję, ale po prostu nie mam pojęcia, jak przywrócić plik do poprzedniego stanu w przeszłości.

Nienawidzi_
źródło
11
Po przywróceniu nie zapomnij --cachedpodczas sprawdzania git diff. link
Geoffrey Hale,
5
Znalazłem twoje pytanie, kiedy przejrzałem moje. Ale po przeczytaniu rozwiązania sprawdziłem swój dziennik i dowiedziałem się, że dokonałem trzech zmian jako samodzielnego zatwierdzenia, więc przywróciłem git dla tego zatwierdzenia i wszystko inne pozostało tak, jak tego chciałem. Nie rozwiązanie, tylko inny sposób, aby to zrobić czasami.
sudo97,

Odpowiedzi:

6129

Zakładając, że skrót żądanego zatwierdzenia to c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

Strona podręcznika kasy git zawiera więcej informacji.

Jeśli chcesz wcześniej powrócić do zatwierdzenia c5f567, dołącz ~1(gdzie 1 to liczba zatwierdzeń, które chcesz cofnąć, może to być dowolna wartość):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

Na marginesie, zawsze czułem się niekomfortowo z tym poleceniem, ponieważ jest ono używane zarówno do zwykłych rzeczy (zmiana między gałęziami), jak i do niezwykłych, destrukcyjnych rzeczy (odrzucanie zmian w katalogu roboczym).

Greg Hewgill
źródło
12
@shadowhand: Czy istnieje sposób, aby to odwrócić, więc jest to wersja zaraz po?
aliteralmind
16
@aliteralmind: Nie, niestety zapis skrótu do historii Git jest cofany w historii.
Greg Hewgill
46
Jeśli zamierzasz użyć nazwy gałęzi dla abcde (np. develop) Będziesz chciał git checkout develop -- file/to/restore(zwróć uwagę na podwójną myślnik)
Ohad Schneider
8
@aliteralmind: Właściwie tak, jest na to sposób: „git log --reverse -1 --ancestry-path yourgitrev..master”, a następnie użyj odpowiednich opcji, aby uzyskać git rev. --ancestry-path „narysuje linię” między dwoma zatwierdzeniami, a -1 pokaże tylko jedną wersję, a --reverse sprawi, że pierwszy emitowany wpis będzie najstarszy.
Chris Cogdon,
6
Osobiście uważam, że HEAD ^ jest łatwiejszy do napisania niż HEAD ~ 1 :)
juzzlin
606

Możesz szybko przejrzeć zmiany wprowadzone w pliku za pomocą polecenia diff:

git diff <commit hash> <filename>

Następnie, aby przywrócić określony plik do tego zatwierdzenia, użyj polecenia reset:

git reset <commit hash> <filename>

Może być konieczne skorzystanie z tej --hardopcji, jeśli masz lokalne modyfikacje.

Dobrym sposobem zarządzania punktami na drodze jest używanie znaczników do czystego oznaczania punktów na osi czasu. Nie do końca rozumiem twoje ostatnie zdanie, ale możesz chcieć oddzielić gałąź od poprzedniego momentu. Aby to zrobić, użyj wygodnego polecenia realizacji transakcji:

git checkout <commit hash>
git checkout -b <new branch name>

Następnie możesz zmienić to ustawienie względem swojej głównej linii, gdy będziesz gotowy do scalenia tych zmian:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
Chris Lloyd
źródło
7
Polecenie „git checkout <commit hash>” zwróciło mi moją starszą wersję projektu dokładnie tego, którego szukałem Dzięki Chris.
vidur punj
48
Przywrócenie pliku git checkout <commit hash> <filename>działało dla mnie lepiej niżgit reset
Motti Strom
3
Chciałem wczesnej wersji pojedynczego pliku, ponieważ nadpisałem 150 wierszy źle dobraną opcją kopiuj / wklej. git checkout <commit hash> <filename>pracował dla mnie. To nie powinna być zaakceptowana odpowiedź, IMHO. git resetnie.
harperville
24
nie można użyć git resetdo zresetowania pojedynczego pliku, pojawi się błądfatal: Cannot do hard reset with paths
opóźnienie
13
Co slier powiedział: nie możesz git reset --hard <commit hash> <filename>. To będzie błąd z tym, fatal: Cannot do hard reset with paths.co powiedział Motti Strom: użyjgit checkout <commit hash> <filename>
Hawkeye Parker
366

Możesz użyć dowolnego odniesienia do git commit, w tym SHA-1, jeśli jest to najwygodniejsze. Chodzi o to, że polecenie wygląda następująco:

git checkout [commit-ref] -- [filename]

foxxtrot
źródło
22
Jaka jest różnica między tą odpowiedzią, która ma --, a odpowiedzią, która nie ma?
2rs2ts,
80
W git '-' przed listą plików mówi git, że wszystkie następne argumenty powinny być interpretowane jako nazwy plików, a nie jako nazwy gałęzi lub cokolwiek innego. Czasami jest to pomocne w ujednoznacznieniu.
foxxtrot
49
„-” to nie tylko konwencja git, ale coś, co można znaleźć w różnych miejscach w linii poleceń * nix. rm -- -f(usuń plik o nazwie -f) wydaje się być kanonicznym przykładem. Więcej szczegółów tutaj
Hawkeye Parker
7
Po prostu dodaj do tego, co powiedział @HawkeyeParker, rmpolecenie używa getopt (3) do parsowania swoich argumentów. getoptto polecenie analizujące argumenty poleceń. gnu.org/software/libc/manual/html_node/Getopt.html
Devy
2
@ Kochanie Tak, właśnie to mam na myśli i tak, prawdopodobnie wcale nie jest powszechne. Widziałem ten przykład w różnych miejscach, może po to, aby był niezapomniany: rm -f jest znany z przerażania / niebezpieczeństw. Ale chodzi o to, że w * nix nazwa pliku może zaczynać się od „-”, a to dezorientuje różnych interpreterów wiersza poleceń, którzy, widząc „-”, oczekują opcji polecenia. Może to być dowolny plik zaczynający się od „-”; np. „-mySpecialFile”.
Hawkeye Parker,
287
git checkout -- foo

Zresetuje się foodo HEAD. Możesz też:

git checkout HEAD^ foo

za jedną wersję wstecz itp.

Greg Hewgill
źródło
12
Sugerowałbym użycie składni, git checkout -- fooaby uniknąć błędów, jeśli foojest to coś specjalnego (np. Katalog lub plik o nazwie -f). W przypadku git, jeśli nie masz pewności, zawsze poprzedzaj wszystkie pliki i katalogi specjalnym argumentem --.
Mikko Rantalainen,
8
Dodatkowa uwaga do komentarza Mikko: --nie jest poleceniem git ani specjalnym poleceniem git. Jest to wbudowany bash oznaczający koniec opcji poleceń. Możesz go używać z wieloma innymi poleceniami bash.
Matthaeus
14
@ matthaeus nie jest ani specyficzny dla basha, ani w ogóle jest cechą powłoki. Jest to konwencja zaimplementowana w wielu różnych poleceniach (obsługiwanych przez getopt).
Greg Hewgill,
2
Nie, --to nie wbudowanym poleceniem szczególny wyraz w bash. Ale jest to powszechna konwencja obsługiwana przez wiele parserów wiersza poleceń i używana przez wiele interfejsów CLI, w tym git.
Emil Lundberg,
123

Aby powrócić do ostatniej zatwierdzonej wersji, która jest najczęściej potrzebna, możesz użyć tego prostszego polecenia.

git checkout HEAD file/to/restore
CDR
źródło
2
Jaka jest różnica między tym (GIT Checkout HEAD file / to / restore) a git reset --hard file / to / restore ???
Motti Shneor
2
1) łatwiej zapamiętać bardziej ogólny sposób 2) nie martw się, aby nacisnąć Enter przed wprowadzeniem nazwy pliku
Roman Susi
105

Właśnie miałem ten sam problem i najłatwiej zrozumieć tę odpowiedź ( commit-refjest to wartość SHA zmiany w dzienniku, do której chcesz wrócić):

git checkout [commit-ref] [filename]

Spowoduje to umieszczenie tej starej wersji w katalogu roboczym i stamtąd możesz ją zatwierdzić, jeśli chcesz.

brązowy
źródło
91

Jeśli wiesz, ile zatwierdzeń musisz cofnąć, możesz użyć:

git checkout master~5 image.png

Zakłada się, że jesteś w masteroddziale, a żądana wersja to 5 zatwierdza z powrotem.

Ron DeVera
źródło
80

Myślę, że go znalazłem .... z http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Czasami chcesz po prostu wrócić i zapomnieć o każdej zmianie po pewnym punkcie, ponieważ wszystkie są w błędzie.

Zacząć od:

$ git log

która pokazuje listę ostatnich zatwierdzeń i ich skrótów SHA1.

Następnie wpisz:

$ git reset --hard SHA1_HASH

aby przywrócić stan do danego zatwierdzenia i trwale usunąć wszystkie nowsze zatwierdzenia z rekordu.

jdee
źródło
24
Git nigdy niczego nie usuwa. Twoje stare zatwierdzenia nadal tam są, ale jeśli nie ma wskazującego wierzchołka gałęzi, nie są już osiągalne. git reflog nadal będzie je wyświetlał, dopóki nie wyczyścisz swojego repozytorium za pomocą git-gc.
Bombe,
1
@Bombe: Dziękujemy za informację. Sprawdziłem starą wersję pliku. Po przeczytaniu twojego komentarza mogłem użyć „gitref”, aby wyszukać częściowy skrót SHA1, i użyć „kasy”, aby wrócić do najnowszej wersji. Inni użytkownicy git mogą uznać tę informację za przydatną.
Winston C. Yang
4
ewentualnie możliwe, że nastąpigit push --force
bshirley
4
Jeśli masz niezatwierdzone zmiany, tracisz je, jeśli zrobić --hard resetowania git
Boklucius
5
@Bombe - „Git nigdy niczego nie usuwa. Twoje stare zatwierdzenia są nadal dostępne, ale jeśli nie jest wskazany wierzchołek gałęzi, nie są one już osiągalne”. - ale takie zatwierdzenia są przycinane po określonym czasie, więc „Git nigdy niczego nie usuwa” jest nieprawdziwe.
Bulwersator
61

To działało dla mnie:

git checkout <commit hash> file

Następnie zatwierdź zmianę:

git commit -a
v2k
źródło
54

Musisz być ostrożny, mówiąc „wycofać”. Jeśli kiedyś miałeś jedną wersję pliku w zatwierdzeniu $ A, a następnie dokonałeś dwóch zmian w dwóch osobnych zatwierdzeniach $ B i $ C (więc widzisz trzecią iterację pliku) i jeśli mówisz „ Chcę przywrócić do pierwszego ”, czy naprawdę to masz na myśli?

Jeśli chcesz pozbyć się zmian zarówno drugiej, jak i trzeciej iteracji, jest to bardzo proste:

$ git checkout $A file

a następnie zatwierdzasz wynik. Polecenie pyta: „Chcę sprawdzić plik ze stanu zarejestrowanego przez zatwierdzenie $ A”.

Z drugiej strony, chodziło ci o to, aby pozbyć się wprowadzonej drugiej iteracji (tj. Zatwierdzenia $ B), zachowując zachowanie pliku C dokonane w pliku, chciałbyś przywrócić $ B

$ git revert $B

Pamiętaj, że ktokolwiek stworzył zatwierdzenie $ B, może nie był zbyt zdyscyplinowany i mógł popełnić całkowicie niezwiązaną zmianę w tym samym zatwierdzeniu, a to przywrócenie może dotykać plików innych niż pliki, które widzisz obrażające zmiany, więc możesz chcieć dokładnie sprawdzić wynik po wykonaniu więc.


źródło
Zrobiłem to, ale „plik dziennika git” powiedziałby, że byłem na pierwotnym zatwierdzeniu, HEAD. Wyglądało na to, że „git checkout” zawodził. Jednak status git pokazał, że plik został faktycznie zmieniony, a „plik różnicowy git” pokazałby rzeczywiste zmiany. Również „status git” pokazał, że plik również się zmienił. Nie używaj więc „git log” tutaj, aby śledzić, które pliki uległy zmianie.
Frederick Ollinger
37

Zabawne, git checkout foonie będzie działać, jeśli kopia robocza znajduje się w katalogu o nazwie foo; Jednak zarówno git checkout HEAD fooi git checkout ./foobędzie:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo
Aaron Maenpaa
źródło
26
lubgit checkout -- foo
knittl,
32

Oto jak rebasedziała:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

Załóżmy, że masz

---o----o----o----o  master
    \---A----B       <my branch>

Pierwsze dwa polecenia ... zatwierdzają polecenie git checkout git rebase master

... sprawdź gałąź zmian, którą chcesz zastosować do mastergałęzi. rebaseKomenda bierze rewizje u <my branch>(które nie występują w master) i występuje ponownie je na głowę master. Innymi słowy, rodzic pierwszego zatwierdzenia w <my branch>nie jest już poprzednim zatwierdzeniem w masterhistorii, ale bieżącym szefem master. Te dwa polecenia są takie same jak:

git rebase master <my branch>

Może być łatwiej zapamiętać to polecenie, ponieważ gałęzie „podstawowa” i „modyfikująca” są jawne.

. Ostateczny wynik historii to:

---o----o----o----o   master
                   \----A'----B'  <my branch>

Ostatnie dwa polecenia ...

git checkout master
git merge <my branch>

... wykonaj szybkie przewijanie do przodu, aby zastosować wszystkie <my branch>zmiany master. Bez tego kroku zatwierdzenie rebase nie zostanie dodane do master. Ostateczny wynik to:

---o----o----o----o----A'----B'  master, <my branch>

masteri <my branch>oba odniesienia B'. Od tego momentu można bezpiecznie usunąć <my branch>odwołanie.

git branch -d <my branch>
cmcginty
źródło
26

Począwszy od git v2.23.0 istnieje nowa metoda git restore , która powinna przyjąć część tego, za co git checkoutbyła odpowiedzialna (nawet zaakceptowana odpowiedź wspomina, co git checkoutjest dość mylące). Zobacz najważniejsze zmiany na blogu github .

Domyślne zachowanie tego polecenia polega na przywróceniu stanu drzewa roboczego z zawartością pochodzącą z sourceparametru (który w twoim przypadku będzie skrótem zatwierdzenia).

Zatem na podstawie odpowiedzi Grega Hewgilla (zakładając, że jest to suma zatwierdzenia c5f567), polecenie wyglądałoby tak:

git restore --source=c5f567 file1/to/restore file2/to/restore

Lub jeśli chcesz przywrócić do zawartości jednego zatwierdzenia przed c5f567:

git restore --source=c5f567~1 file1/to/restore file2/to/restore
mjarosie
źródło
24

Najpierw zresetuj głowicę do pliku docelowego

git reset HEAD path_to_file

Drugie pobranie tego pliku

git checkout -- path_to_file
Gulshan Maurya
źródło
4
+1, choć nie jestem pewien zamiaru zresetowania HEAD. Może, ale nie musi być potrzebny. W mojej sytuacji chciałem przywrócić tylko jeden konkretny plik do wersji w repozytorium (co pozostawało nienaruszonymi pozostałymi lokalnymi zmianami. Wystarczyło mi wykonanie drugiego kroku powyżej
fkl
Tak, muszę tylko uruchomić 2. polecenie. Jak -> shellhacks.com/git-revert-file-to-previous-commit
javaPlease42
22

git-aliasy, awk i funkcje powłoki na ratunek!

git prevision <N> <filename>

gdzie <N>jest liczba wersji pliku do wycofania dla pliku <filename>.
Na przykład, aby pobrać bieżącą poprzednią wersję pojedynczego pliku x/y/z.c, uruchom

git prevision -1 x/y/z.c

Jak działa Git Prevision?

Dodaj następujące elementy do swojego gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

Komenda w zasadzie

  • wykonuje a git logna podanym pliku i
  • wybiera odpowiedni identyfikator zatwierdzenia w historii pliku i
  • wykonuje a git checkoutdla identyfikatora zatwierdzenia dla określonego pliku.

Zasadniczo wszystko, co można by zrobić ręcznie w tej sytuacji,
opakowane w jeden piękny, wydajny alias git - git-prevision

TheCodeArtist
źródło
20

Muszę tu podłączyć EasyGit , który jest otoką , aby uczynić git bardziej dostępnym dla nowicjuszy bez mylenia doświadczonych użytkowników. Jedną z rzeczy, które robi, jest nadawanie większego znaczeniagit revert . W takim przypadku wystarczy powiedzieć:

eg revert foo/bar foo/baz

Arystoteles Pagaltzis
źródło
1
Powinno być eg revert --in REVISON -- FILENAME. To --injest ważne. Dla użytkowników systemu Windows: Otwórz git bash. Wykonać echo %PATH. Pierwsza ścieżka powinna znajdować się w katalogu użytkownika kończącym się na bin. Utwórz tę ścieżkę. Przechowuj np . Tam. Nazwij to eg. Nie eg.txt.
koppor
20

W przypadku, gdy chcesz przywrócić plik do poprzedniego zatwierdzenia (i plik, który chcesz przywrócić, już zatwierdzony), możesz użyć

git checkout HEAD^1 path/to/file

lub

git checkout HEAD~1 path/to/file

Następnie po prostu zrób scenariusz i zatwierdź „nową” wersję.

Uzbrojeni w wiedzę, że zatwierdzenie może mieć dwoje rodziców w przypadku scalenia, powinieneś wiedzieć, że HEAD ^ 1 jest pierwszym rodzicem, a HEAD ~ 1 jest drugim rodzicem.

Albo zadziała, jeśli w drzewie jest tylko jeden rodzic.

ModernIncantations
źródło
19

Wiele sugestii tutaj, większość podobnych do git checkout $revision -- $file. Kilka niejasnych alternatyw:

git show $revision:$file > $file

Często też używam tego, aby chwilowo zobaczyć konkretną wersję:

git show $revision:$file

lub

git show $revision:$file | vim -R -

(OBS: $filenależy go poprzedzić, ./jeśli jest to ścieżka względna git show $revision:$filedo działania)

A jeszcze bardziej dziwne:

git archive $revision $file | tar -x0 > $file
Peter V. Mørch
źródło
1
Jest to dobra alternatywa, jeśli nie masz pewności, którą wersję zatwierdzenia chcesz i musisz „zajrzeć” bez zastępowania katalogu roboczego.
wisbucky
18

Zauważ jednak, że git checkout ./fooi git checkout HEAD ./foo nie są dokładnie tym samym; przykładem:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(Drugi addetap pliku w indeksie, ale nie zostaje zatwierdzony .)

Git checkout ./foooznacza odwróć ścieżkę ./foood indeksu ; dodanie HEADinstruuje Git, aby HEADprzed wykonaniem tej operacji przywrócił tę ścieżkę indeksu do swojej wersji.

Damien Diederen
źródło
14

Dla mnie żadna odpowiedź nie wydawała się naprawdę jasna, dlatego chciałbym dodać moją, która wydaje się bardzo łatwa.

Mam zatwierdzenie, abc1a następnie dokonałem kilku (lub jednej modyfikacji) pliku file.txt.

Teraz powiedz, że coś pomieszałem w pliku file.txti chcę wrócić do poprzedniego zatwierdzenia abc1.

1 git checkout file.txt.: spowoduje to usunięcie lokalnych zmian, jeśli ich nie potrzebujesz

2 git checkout abc1 file.txt.: spowoduje to przeniesienie pliku do poszukiwanej wersji

3 git commit -m "Restored file.txt to version abc1".: spowoduje to twoje cofnięcie.

  1. git push : spowoduje to wypchnięcie wszystkiego ze zdalnego repozytorium

Pomiędzy krokiem 2 i 3 oczywiście możesz zrobić, git statusaby zrozumieć, co się dzieje. Zwykle powinieneś zobaczyć file.txtjuż dodane i dlatego nie ma potrzeby git add.

desmond13
źródło
2
OK, więc sądzę, że kroki 1. i 2. wykluczają się wzajemnie: jeśli abc1 jest ostatnim zatwierdzeniem, nie ma potrzeby 2. i jeśli były inne zatwierdzenia po abc1, możesz bezpośrednio zrobić 2.
Jean Paul
13
  1. Git przywraca plik do konkretnego zatwierdzenia
git checkout Last_Stable_commit_Number -- fileName

2. Przywróć plik do określonej gałęzi

git checkout branchName_Which_Has_stable_Commit fileName
ireshika piyumalie
źródło
11

Aby przejść do poprzedniej wersji zatwierdzenia pliku, pobierz numer zatwierdzenia, powiedz eb917a1

git checkout eb917a1 YourFileName

Jeśli chcesz tylko wrócić do ostatniej zatwierdzonej wersji

git reset HEAD YourFileName
git checkout YourFileName

Spowoduje to po prostu przejście do ostatniego zatwierdzonego stanu pliku

shah1988
źródło
10

git checkout ref | commitHash - filePath

na przykład

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar
Amos Folarin
źródło
10

Wiele odpowiedzi tutaj roszczenia w użyciu git reset ... <file>lub git checkout ... <file>, ale przez to, co tracisz na modyfikacje <file>popełnione po popełnić chcesz przywrócić.

Jeśli chcesz cofnąć zmiany z jednego zatwierdzenia tylko w jednym pliku, tak jak git revertzrobiłby to tylko jeden plik (lub powiedzmy podzbiór plików zatwierdzenia), sugeruję użycie obu git diffi git applytak (z <sha>hash = zatwierdzenie, które chcesz cofnąć):

git diff <sha>^ <sha> path/to/file.ext | git apply -R

Zasadniczo najpierw wygeneruje łatkę odpowiadającą zmianom, które chcesz cofnąć, a następnie zastosuje ją odwrotnie, aby usunąć te zmiany.

Oczywiście nie zadziała, jeśli odwrócone linie zostały zmodyfikowane przez jakiekolwiek zatwierdzenie między <sha1>i HEAD(konflikt).

Vince
źródło
To powinna być zatwierdzona odpowiedź. Czy mogę zasugerować nieco uproszczoną wersję:git show -p <sha> path/to/file.ext|git apply -R
Amaury D
możesz użyć <sha>^!zamiast<sha>^ <sha>
kambuzującego
8

Użyj, git logaby uzyskać klucz skrótu dla określonej wersji, a następnie użyjgit checkout <hashkey>

Uwaga: Nie zapomnij wpisać skrótu przed ostatnim. Ostatni hash wskazuje twoją aktualną pozycję (HEAD) i niczego nie zmienia.

Mustafakyr
źródło
7

Oczywiście ktoś albo musi napisać zrozumiałą książkę na temat git, albo git musi być lepiej wyjaśniony w dokumentacji. W obliczu tego samego problemu zgadłem

cd <working copy>
git revert master

cofnie ostatnie zatwierdzenie, które wydaje się robić.

Ian

Ian Davis
źródło
7

Możesz to zrobić w 4 krokach:

  1. cofnij całe zatwierdzenie z plikiem, który chcesz przywrócić - spowoduje to utworzenie nowego zatwierdzenia w oddziale
  2. miękki reset, który zatwierdza - usuwa zatwierdzenie i przenosi zmiany do obszaru roboczego
  3. ręcznie wybierz pliki, aby je przywrócić i zatwierdzić
  4. upuść wszystkie inne pliki w obszarze roboczym

Co musisz wpisać w swoim terminalu :

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> I & git commit -m 'reverting file'
  4. git checkout .

powodzenia

Nir M.
źródło
czy to nie przywraca WSZYSTKICH zmian?
arcee123
1
@ arcee123 Tak, ale późniejszy reset powoduje cofnięcie wszystkich zmian. Problem polega na tym, że git-revertdziała tylko na całe repozytorium, więc aby to zrekompensować, musimy cofnąć wszystko inne.
Timothy
2
Zalecam użycie: 1. git revert --no-commit <commit_hash>2. git reset HEADZapisuje to dodatkowe zatwierdzenie i wykonuje wszystkie zmiany tylko w twoim katalogu roboczym.
Timothy
Odpowiedź @ greg-hewgill jest lepsza i trafniejsza. Ten jest kiepski i nie należy go używać.
Daniel Tranca
Jest to dokładnie to, co jest potrzebne do prawdziwego przywrócenia określonych plików. Musiałem cofnąć zmiany w kilku plikach z wcześniejszego zatwierdzenia, które już zostało wypchnięte do zdalnego repozytorium. Cofnąłem, zresetowałem i zatwierdziłem wynik: git revert _oldcommit_ --no-commit git reset -- _unchanged1_ _unchanged2_ ... git commit -m "branch without changes to specific files"nowa wskazówka gałęzi odzwierciedlała wszystkie zmiany oprócz przywróconych plików.
Suncat2000
7

To bardzo prosty krok. Pobierz plik do identyfikatora zatwierdzenia, który chcemy, tutaj jeden identyfikator zatwierdzenia wcześniej, a następnie po prostu wprowadź zmiany i zakończ.

# git checkout <previous commit_id> <file_name>
# git commit --amend

To jest bardzo przydatne. Jeśli chcemy przenieść dowolny plik do dowolnego wcześniejszego identyfikatora zatwierdzenia u góry zatwierdzenia, możemy to łatwo zrobić.

Abhishek Dwivedi
źródło
5
git revert <hash>

Cofa zatwierdzenie. Wygląda na to, że uważasz, że git revertdotyczy tylko ostatniego zatwierdzenia.

To nie rozwiązuje twojego problemu, jeśli chcesz przywrócić zmianę w określonym pliku, a zatwierdzenie zmieniło się bardziej niż ten plik.

Otto
źródło
5

jeśli popełnisz zły plik w swoich ostatnich zatwierdzeniach, postępuj zgodnie z instrukcją:

  1. drzewo open source, zmień to zatwierdzenie

drzewo open source

  1. zmień linie i znajdź swoje zatwierdzenie, że niewłaściwy plik wysłany jako zatwierdzenie

wprowadź opis zdjęcia tutaj

  1. możesz zobaczyć listę swoich zmian w tym zatwierdzeniu lista plików w drzewie źródłowym
  2. wybierz go, a następnie kliknij ... przyciski po prawej stronie ... kliknij odwróć plik
  3. możesz to zobaczyć na zakładce stanu pliku w lewym dolnym rogu, a następnie kliknij odłączyć scenę:

karta stanu pliku

  1. otwórz kod studia wizualnego i przywróć, zatwierdzając usunięte pliki
  2. po nich wszystkich możesz zobaczyć wyniki ostatniego zatwierdzenia w drzewie źródłowym

wprowadź opis zdjęcia tutaj

szabla tabatabaee yazdi
źródło