Chcę cofnąć zmiany wprowadzone przez określone zatwierdzenie tylko w danym pliku.
Czy mogę użyć do tego polecenia git revert?
Czy jest jakiś inny prosty sposób?
git
version-control
revert
Lakshman Prasad
źródło
źródło
Odpowiedzi:
Najczystszy sposób, w jaki widziałem, jest opisany tutaj
Podobny do odpowiedzi VonC, ale używający
git show
igit apply
.źródło
fatal: unrecognized input
-3
flagę, aby git ubiegał się o trójdrożne scalanie, gdy łatka się nie powiedzie, ponieważ zwykle poprawiam zmianę nieco wstecz.some_file.c
zawiera ścieżkę do pliku, jeśli istnieje, w przeciwnym razie po cichu niczego nieZakładając, że zmiana historii zmian jest w porządku, oto przepływ pracy umożliwiający cofnięcie zmian w pojedynczym pliku we wcześniejszym zatwierdzeniu:
Na przykład chcesz cofnąć zmiany w 1 pliku (
badfile.txt
) w zatwierdzeniuaaa222
:Ponownie wykonaj podstawowe zatwierdzenie, popraw zatwierdzenie problemu i kontynuuj.
1) Uruchom interaktywną rebase:
2) Zaznacz zatwierdzenie problemu do edycji w edytorze, zmieniając
pick
nae
(do edycji):3) Przywróć zmiany w złym pliku:
4) Dodaj zmiany i popraw zatwierdzenie:
5) Zakończ rebase:
źródło
edit
nie były wyświetlane jako zmienione. Alegit show -- badfile.txt | git apply -R
udzielili odpowiedzi, której potrzebowałem <3git revert
dotyczy całej zawartości pliku w zatwierdzeniach.W przypadku pojedynczego pliku możesz go skryptu :
(Z narzędzi git-shell-scripts od smtlaissezfaire )
Uwaga:
inny sposób jest opisany tutaj, jeśli jeszcze nie zatwierdziłeś swojej bieżącej modyfikacji.
git checkout
ma kilka opcji dla pliku, modyfikując plik z HEAD, nadpisując zmiany.Dropped.on.Caprica wspomina w komentarzach :
źródło
git revert-file <hash> <file-loc>
i przywrócić ten konkretny plik. Podniosłem się z tej odpowiedzi (chociaż musiałem wprowadzić kilka zmian, aby działać poprawnie). Możesz znaleźć kopię mojego.gitconfig
i zredagowanego skryptu tutaj: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438Po prostu skorzystałbym z
--no-commit
opcji,git-revert
a następnie usunąłbym pliki, których nie chcesz przywrócić z indeksu, zanim ostatecznie go zatwierdzę. Oto przykład pokazujący, jak łatwo przywrócić tylko zmiany w foo.c w drugim ostatnim zatwierdzeniu:Najpierw
git-reset
„usuwa ze sceny” wszystkie pliki, abyśmy mogli dodać z powrotem tylko jeden plik, który chcemy przywrócić. Finałgit-reset --hard
pozbywa się pozostałych plików, których nie chcemy zachować.źródło
O wiele prostsze:
następnie
i wtedy
plik zniknął i zatwierdzenie skrótu, komunikatu itp. jest takie samo.
źródło
git checkout -- path/to/file/to/revert
kroku , aby uzyskać kompletność ? Nie jest też prawdą, że potem hasz jest taki sam, prawda? Ostatnie zdanie mogłoby być lepsze jako coś w rodzaju: „W rezultacie ostatnie zatwierdzenie jest zastępowane nowym, różniącym się tylko tym, że nie zawiera zmian w przywróconym pliku”.Powyższe polecenie usunie plik z zatwierdzenia, ale zostanie odzwierciedlone w
git status
.Powyższe polecenie cofnie zmiany (w rezultacie otrzymasz plik taki sam jak HEAD).
(Przejdź
--amend
do zmiany zatwierdzenia).Dzięki temu plik, który jest już w zatwierdzeniu, jest usuwany i przywracany.
Powyższe kroki należy wykonać z gałęzi, w której dokonywane jest zatwierdzenie.
źródło
Możesz wykonać tę procedurę:
git revert -n <*commit*>
(-n
cofnij wszystkie zmiany, ale ich nie zatwierdzi)git add <*filename*>
(nazwa pliku / plików, które chcesz przywrócić i zatwierdzić)git commit -m 'reverted message'
(dodaj wiadomość do przywrócenia)źródło
Jeśli chcesz zresetować zmiany w pliku z ostatniego zatwierdzenia, tego zwykle używam. Myślę, że to najprostsze rozwiązanie.
Zwróć uwagę, że plik zostanie dodany do obszaru przemieszczania.
Mam nadzieję, że to pomoże :)
źródło