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?
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?
Odpowiedzi:
Najczystszy sposób, w jaki widziałem, jest opisany tutaj
git show some_commit_sha1 -- some_file.c | git apply -R
Podobny do odpowiedzi VonC, ale używający git show
i git apply
.
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 nie
Zakł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 zatwierdzeniu aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Ponownie wykonaj podstawowe zatwierdzenie, popraw zatwierdzenie problemu i kontynuuj.
1) Uruchom interaktywną rebase:
git rebase -i aaa111
2) Zaznacz zatwierdzenie problemu do edycji w edytorze, zmieniając pick
na e
(do edycji):
e aaa222
pick aaa333
3) Przywróć zmiany w złym pliku:
git show -- badfile.txt | git apply -R
4) Dodaj zmiany i popraw zatwierdzenie:
git add badfile.txt
git commit --amend
5) Zakończ rebase:
git rebase --continue
edit
nie były wyświetlane jako zmienione. Ale git show -- badfile.txt | git apply -R
udzielili odpowiedzi, której potrzebowałem <3
git revert
dotyczy całej zawartości pliku w zatwierdzeniach.
W przypadku pojedynczego pliku możesz go skryptu :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
(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 -- filename
git checkout
ma kilka opcji dla pliku, modyfikując plik z HEAD, nadpisując zmiany.
Dropped.on.Caprica wspomina w komentarzach :
Możesz dodać alias do git, aby móc to zrobić
git revert-file <hash> <file-loc>
i przywrócić ten konkretny plik.
Zobacz to sedno .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
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/5b67ec0021371a0ad438
Po 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:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
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ć.
O wiele prostsze:
git reset HEAD^ path/to/file/to/revert
następnie
git commit --amend
i wtedy
git push -f
plik zniknął i zatwierdzenie skrótu, komunikatu itp. jest takie samo.
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”.
git reset HEAD^ path/to/file/to/revert/in/commit
Powyższe polecenie usunie plik z zatwierdzenia, ale zostanie odzwierciedlone w git status
.
git checkout path/to/file/to/revert/in/commit
Powyższe polecenie cofnie zmiany (w rezultacie otrzymasz plik taki sam jak HEAD).
git commit
(Przejdź --amend
do zmiany zatwierdzenia).
git push
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.
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)