2009-04-21 15 views
78

Czy istnieje polecenie, które pozwala częściowo cofnąć zmiany w pliku (lub plikach) w katalogu roboczym?Selektywnie powrócić lub sprawdzić zmiany w pliku w Git?

Załóżmy, że edytowałeś plik dużo, ale zdajesz sobie sprawę, że chcesz cofnąć niektóre zmiany z powrotem do stanu zatwierdzonego, ale nie inne zmiany.

Wyobrażam sobie opcję dla git checkout, która działa bardzo podobnie do git add -p, tzn. Przechodzi porcję pliku przez przystawkę i pyta, czy chcesz ją zachować, czy nie.

Odpowiedz

74

Można użyć

git add -p <path> 

wystawić te kawałki, które chcesz zachować w określonym pliku, a następnie

git checkout -- <path> 

aby odrzucić zmiany pracy drzewo, które nie chcą, aby utrzymać , sprawdzając wersję stage pliku.

Wreszcie, można użyć

git reset -- <path> 

aby przywrócić wystawił wersję pliku z najnowszą wersją popełnione pliku pozostaną Państwu zmiany Unstaged.

+0

Myślę, że właśnie tego szukam dzięki –

+0

W tym prostym przypadku użycia, który każdy inny system kontroli wersji po prostu wywołuje "przywrócić", dlaczego polecenie Git jest tak mało znane? –

+5

@ Jan Czy polecenie "revert" innych systemów kontroli wersji pozwala ci wybrać, które zmiany w pliku są cofane?Naprawdę pytam, ponieważ mam tylko doświadczenie z CVS i Git. W Git, 'git checkout - path/to/file' jest pojedynczym poleceniem, które przywraca wszystkie zmiany w tym pliku, ale to nie jest to samo co powyżej. – spacemanaki

8

git checkout $file Powoduje przywrócenie stanu pliku $file do ostatniego zatwierdzonego stanu. Myślę, że możesz użyć git checkout SHA-1 -- $file, aby przywrócić plik do zatwierdzenia zidentyfikowanego przez SHA-1.

+1

tak, nie dokładnie to, co chcę, ponieważ chcę zachować niektóre zmiany, które wprowadziłem w pliku i przywrócić pozostałe –

1

Ile aktów zatwierdzenia trzeba cofnąć i wybrać? Jeśli to tylko jeden, może wziąć gałąź tuż przed nią, sprawdź plik, który popełniłeś, a następnie użyj git add -p, aby dodać go w taki sposób, w jaki chciałeś. Następnie możesz wrócić do miejsca, w którym byłeś i odebrać plik z twojego oddziału tymczasowego.

czyli:

git checkout -b temp troublesome-commit^ 
git checkout troublesome-commit -- path/to/file 
git add -p path/to/file 
git commit -c troublesome-commit 
git checkout @{-1} 
git checkout temp -- path/to/file 
git commit path/to/file 
git branch -D temp 

Inne alternatywy obejmują wracając i edycji commit z git rebase -i (oznakowanie popełnić jak edit, następnie robi git reset HEAD^ i ponawianie commit kiedy spadł z powrotem do płaszcza).

Jeśli zmiany, które należy wybrać, są rozłożone na serię zatwierdzeń, lepszym rozwiązaniem może być wyodrębnienie ich jako poprawek (lub poprawki obejmujących je wszystkie) i ręczna edycja poprawki, eliminując zmiany chcesz zachować i karmić resztę w git apply --reverse.

+0

Nie chcę w rzeczywistości cofać niczego, co jest popełnione, chcę cofnąć zmiany, które są tylko w moim roboczym egzemplarzu. –

99

W wersji git> = 1.7.1 mogę

git checkout -p 

Nie jestem pewien, kiedy ta funkcja została wprowadzona.

+8

Warto wspomnieć, że można również wykonać polecenie 'git reset -p', aby selektywnie anulować zmiany w obszarze pomostowym/indeksie. Nie wiem też z góry, w jakiej wersji Gita to zostało wprowadzone. –

+0

To jest poprawna odpowiedź, dlaczego nie została zaakceptowana. – wukong

+0

@wukong, ponieważ ta odpowiedź została wysłana 2 lata po pytaniu. W tej chwili (2009) odpowiedź Charlesa była najlepszym rozwiązaniem – pomeh