Czy można cofnąć tylko jeden plik lub pewne zmiany w pliku przy zatwierdzaniu wielu plików?
Cała historia Popełniłem kilka plików. Kilka zatwierdzeń później ktoś, kto pozostanie bezimienny (JACK !!!), skopiował plik do swojego repozytorium i zatwierdził kilka plików, nadpisując niektóre ze zmian, które zrobiłem. Chcę przywrócić jeden plik, który został zbity lub jeszcze lepiej, wejść i cofnąć dwie zmiany w tym pliku. Będzie to musiało być oddzielnym zatwierdzeniem przywrócenia, ponieważ zostało wyciągnięte i wypchnięte.
--3way
powoduje konflikty scalania zamiast niepowodzenia w zastosowaniu poprawek.Odpowiedzi:
Możesz cofnąć zatwierdzenie bez tworzenia nowego, dodając opcję „--no-commit”. Spowoduje to pozostawienie wszystkich przywróconych plików w obszarze przemieszczania. Stamtąd wykonałem miękki reset i dodałem zmiany, których naprawdę chciałem. Przykładowy przepływ pracy:
źródło
git add -p
rozpocząć interaktywną sesję, która pozwala selektywnie dodawać fragmenty plików zamiast całych plików. (Istnieje równieżgit reset -p
możliwość wybiórczego wycofywania zmian. Dobrze wiedzieć, ale prawdopodobnie nie to, co chcesz w tym scenariuszu.)revert
,reset
,stash -p
(zapas „anuluje, że nie chcę, aby właściwie make”),add
reszta,commit
Możesz interaktywnie zastosować starą wersję pliku za pomocą
checkout
polecenia.Na przykład, jeśli wiesz,
COMMIT
gdzie kod do dodania został usunięty, możesz uruchomić następujące polecenie:Git poprosi cię o dodanie porcji, których brakuje w bieżącej wersji pliku. Możesz użyć,
e
aby utworzyć łatkę zmiany przed jej ponownym zastosowaniem.źródło
git checkout -p path/to/file
Możesz po prostu ręcznie sprawdzić starą, dobrą zawartość plików, które chcesz przywrócić
git checkout
. Na przykład, jeśli chcesz powrócićmy-important-file
do wersji, która była w wersjiabc123
, możesz to zrobićTeraz masz starą zawartość z
my-important-file
powrotem i możesz ją nawet edytować, jeśli masz na to ochotę, i zatwierdzić jak zwykle, aby dokonać zatwierdzenia, które przywróci zmiany, które wprowadził. Jeśli są tylko niektóre części jego zatwierdzenia, które chcesz cofnąć, użyj,git add -p
aby wybrać tylko kilka porcji z poprawki, którą zatwierdzasz.źródło
revert
, po prostu przywracasz starą wersję pliku. Właściwyrevert
usunie złe zmiany w pliku, nawet jeśli był modyfikowany kilka razy od tego złego zatwierdzenia, a nie chcesz stracić tych modyfikacji.git checkout -p
.Znalazłem sposób na zrobienie tego na liście mailingowej Git:
Źródło: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
Wariacje
To polecenie kończy się niepowodzeniem (nie powodując żadnych zmian), jeśli łatka nie działa prawidłowo, ale
--3way
zamiast tego pojawiają się konflikty, które można następnie rozwiązać ręcznie (w tym przypadku odpowiedź Casey może być bardziej praktyczna):Możesz również użyć tego do częściowego cofnięcia wielu zatwierdzeń, np .:
aby przywrócić pliki ze zmianami pasującymi
<string>
do dowolnego zatwierdzenia. To jest dokładnie to, czego potrzebowałem w moim przypadku użycia (kilka oddzielnych zatwierdzeń wprowadziło podobne zmiany w różnych plikach, a także zmiany innych plików w niepowiązany sposób, którego nie chciałem cofać).Jeśli
diff.noprefix=true
ustawiłeś w swoim~/.gitconfig
to musisz dodać-p0
dogit apply
polecenia npźródło
git show ... > foo.txt
(2) edytując,foo.txt
aby usunąć różnice, których nie chciałem cofać (3),git apply --reverse foo.txt
aby przywrócić różnice wciąż wymienione wfoo.txt
.