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 log
razem z, git diff
aby znaleźć potrzebną wersję, ale po prostu nie mam pojęcia, jak przywrócić plik do poprzedniego stanu w przeszłości.
git
version-control
git-checkout
Nienawidzi_
źródło
źródło
--cached
podczas sprawdzaniagit diff
. linkOdpowiedzi:
Zakładając, że skrót żądanego zatwierdzenia to
c5f567
: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ść):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).
źródło
develop
) Będziesz chciałgit checkout develop -- file/to/restore
(zwróć uwagę na podwójną myślnik)Możesz szybko przejrzeć zmiany wprowadzone w pliku za pomocą polecenia diff:
Następnie, aby przywrócić określony plik do tego zatwierdzenia, użyj polecenia reset:
Może być konieczne skorzystanie z tej
--hard
opcji, 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:
Następnie możesz zmienić to ustawienie względem swojej głównej linii, gdy będziesz gotowy do scalenia tych zmian:
źródło
git checkout <commit hash> <filename>
działało dla mnie lepiej niżgit reset
git checkout <commit hash> <filename>
pracował dla mnie. To nie powinna być zaakceptowana odpowiedź, IMHO.git reset
nie.git reset
do zresetowania pojedynczego pliku, pojawi się błądfatal: Cannot do hard reset with paths
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>
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]
źródło
--
, a odpowiedzią, która nie ma?rm -- -f
(usuń plik o nazwie-f
) wydaje się być kanonicznym przykładem. Więcej szczegółów tutajrm
polecenie używa getopt (3) do parsowania swoich argumentów.getopt
to polecenie analizujące argumenty poleceń. gnu.org/software/libc/manual/html_node/Getopt.htmlZresetuje się
foo
do HEAD. Możesz też:za jedną wersję wstecz itp.
źródło
git checkout -- foo
aby uniknąć błędów, jeślifoo
jest 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--
.--
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.--
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.Aby powrócić do ostatniej zatwierdzonej wersji, która jest najczęściej potrzebna, możesz użyć tego prostszego polecenia.
źródło
Właśnie miałem ten sam problem i najłatwiej zrozumieć tę odpowiedź (
commit-ref
jest to wartość SHA zmiany w dzienniku, do której chcesz wrócić):Spowoduje to umieszczenie tej starej wersji w katalogu roboczym i stamtąd możesz ją zatwierdzić, jeśli chcesz.
źródło
Jeśli wiesz, ile zatwierdzeń musisz cofnąć, możesz użyć:
Zakłada się, że jesteś w
master
oddziale, a żądana wersja to 5 zatwierdza z powrotem.źródło
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.
źródło
git push --force
To działało dla mnie:
Następnie zatwierdź zmianę:
źródło
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:
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
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
Zabawne,
git checkout foo
nie będzie działać, jeśli kopia robocza znajduje się w katalogu o nazwiefoo
; Jednak zarównogit checkout HEAD foo
igit checkout ./foo
będzie:źródło
git checkout -- foo
Oto jak
rebase
działa:Załóżmy, że masz
Pierwsze dwa polecenia ... zatwierdzają polecenie git checkout git rebase master
... sprawdź gałąź zmian, którą chcesz zastosować do
master
gałęzi.rebase
Komenda bierze rewizje u<my branch>
(które nie występują wmaster
) i występuje ponownie je na głowęmaster
. Innymi słowy, rodzic pierwszego zatwierdzenia w<my branch>
nie jest już poprzednim zatwierdzeniem wmaster
historii, ale bieżącym szefemmaster
. Te dwa polecenia są takie same jak:Może być łatwiej zapamiętać to polecenie, ponieważ gałęzie „podstawowa” i „modyfikująca” są jawne.
. Ostateczny wynik historii to:
Ostatnie dwa polecenia ...
... wykonaj szybkie przewijanie do przodu, aby zastosować wszystkie
<my branch>
zmianymaster
. Bez tego kroku zatwierdzenie rebase nie zostanie dodane domaster
. Ostateczny wynik to:master
i<my branch>
oba odniesieniaB'
. Od tego momentu można bezpiecznie usunąć<my branch>
odwołanie.źródło
Począwszy od git v2.23.0 istnieje nowa metoda git restore , która powinna przyjąć część tego, za co
git checkout
była odpowiedzialna (nawet zaakceptowana odpowiedź wspomina, cogit checkout
jest 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
source
parametru (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:Lub jeśli chcesz przywrócić do zawartości jednego zatwierdzenia przed c5f567:
źródło
Najpierw zresetuj głowicę do pliku docelowego
Drugie pobranie tego pliku
źródło
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
, uruchomJak działa Git Prevision?
Dodaj następujące elementy do swojego
gitconfig
Zasadniczo wszystko, co można by zrobić ręcznie w tej sytuacji,
opakowane w jeden piękny, wydajny alias git - git-prevision
źródło
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 znaczenia
git revert
. W takim przypadku wystarczy powiedzieć:eg revert foo/bar foo/baz
źródło
eg revert --in REVISON -- FILENAME
. To--in
jest 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ę nabin
. Utwórz tę ścieżkę. Przechowuj np . Tam. Nazwij toeg
. Nieeg.txt
.W przypadku, gdy chcesz przywrócić plik do poprzedniego zatwierdzenia (i plik, który chcesz przywrócić, już zatwierdzony), możesz użyć
lub
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.
źródło
Wiele sugestii tutaj, większość podobnych do
git checkout $revision -- $file
. Kilka niejasnych alternatyw:Często też używam tego, aby chwilowo zobaczyć konkretną wersję:
lub
(OBS:
$file
należy go poprzedzić,./
jeśli jest to ścieżka względnagit show $revision:$file
do działania)A jeszcze bardziej dziwne:
źródło
Zauważ jednak, że
git checkout ./foo
igit checkout HEAD ./foo
nie są dokładnie tym samym; przykładem:(Drugi
add
etap pliku w indeksie, ale nie zostaje zatwierdzony .)Git checkout ./foo
oznacza odwróć ścieżkę./foo
od indeksu ; dodanieHEAD
instruuje Git, abyHEAD
przed wykonaniem tej operacji przywrócił tę ścieżkę indeksu do swojej wersji.źródło
Dla mnie żadna odpowiedź nie wydawała się naprawdę jasna, dlatego chciałbym dodać moją, która wydaje się bardzo łatwa.
Mam zatwierdzenie,
abc1
a następnie dokonałem kilku (lub jednej modyfikacji) plikufile.txt
.Teraz powiedz, że coś pomieszałem w pliku
file.txt
i chcę wrócić do poprzedniego zatwierdzeniaabc1
.1
git checkout file.txt
.: spowoduje to usunięcie lokalnych zmian, jeśli ich nie potrzebujesz2
git checkout abc1 file.txt
.: spowoduje to przeniesienie pliku do poszukiwanej wersji3
git commit -m "Restored file.txt to version abc1"
.: spowoduje to twoje cofnięcie.git push
: spowoduje to wypchnięcie wszystkiego ze zdalnego repozytoriumPomiędzy krokiem 2 i 3 oczywiście możesz zrobić,
git status
aby zrozumieć, co się dzieje. Zwykle powinieneś zobaczyćfile.txt
już dodane i dlatego nie ma potrzebygit add
.źródło
2. Przywróć plik do określonej gałęzi
źródło
Aby przejść do poprzedniej wersji zatwierdzenia pliku, pobierz numer zatwierdzenia, powiedz eb917a1
Jeśli chcesz tylko wrócić do ostatniej zatwierdzonej wersji
Spowoduje to po prostu przejście do ostatniego zatwierdzonego stanu pliku
źródło
git checkout ref | commitHash - filePath
na przykład
źródło
Wiele odpowiedzi tutaj roszczenia w użyciu
git reset ... <file>
lubgit 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 revert
zrobiłby to tylko jeden plik (lub powiedzmy podzbiór plików zatwierdzenia), sugeruję użycie obugit diff
igit apply
tak (z<sha>
hash = zatwierdzenie, które chcesz cofnąć):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>
iHEAD
(konflikt).źródło
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
zamiast<sha>^ <sha>
Użyj,
git log
aby 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.
źródło
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
cofnie ostatnie zatwierdzenie, które wydaje się robić.
Ian
źródło
Możesz to zrobić w 4 krokach:
Co musisz wpisać w swoim terminalu :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
I &git commit -m 'reverting file'
git checkout .
powodzenia
źródło
git-revert
działa tylko na całe repozytorium, więc aby to zrekompensować, musimy cofnąć wszystko inne.git revert --no-commit <commit_hash>
2.git reset HEAD
Zapisuje to dodatkowe zatwierdzenie i wykonuje wszystkie zmiany tylko w twoim katalogu roboczym.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.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.
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ć.
źródło
Cofa zatwierdzenie. Wygląda na to, że uważasz, że
git revert
dotyczy 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.
źródło
jeśli popełnisz zły plik w swoich ostatnich zatwierdzeniach, postępuj zgodnie z instrukcją:
źródło