2013-03-21 22 views
6

Jak cofnąć część zmian zastosowanych do pliku, który wydarzył się przez jakiś czas. Mam następujące zobowiązuje i przypadkowych zmian zaszło między A i B do „plik.txt”Git cofnąć częściowe zmiany w pliku

...--A--B--... 

Mam poprawkę diff pliku w file.txt-B-A.patch który powraca wszystkie zmian. Jednak chcę tylko cofnąć pewnych zmian w file.txt, podobnie jak ręczne wybieranie zmian w konflikcie scalania. Czy istnieje sposób, aby to zrobić bez modyfikowania pliku poprawki?

+0

Patrz także [Q: ja częściowy szybko powrócić GIT] (http://stackoverflow.com/questions/5669358/can-i-do-a-partial-revert-in-git). – Totor

Odpowiedz

8

Jest to inny sposób, który nie wymaga w ogóle pliku łatki.

Problem się powiódł od A do B, więc najpierw należy zmienić zmiany w B, ale nie zatwierdzaj automatycznie.

$ git revert --no-commit <commit hash of B> 

Zmiany, które wykonałby git revert zostały przesunięte. Rozwiąż je.

$ git reset HEAD 

Następnie interaktywnie przejść file.txt i etapu jedynie zmiany, które chcesz zachować.

$ git add --patch file.txt 

Tylko wybrane przez ciebie powraca są teraz wystawiane. Poproście ich.

$ git commit 

Wreszcie oczyścić Unstaged resztki z git revert.

$ git reset --hard 
5

Wiele poleceń git ma opcję -p ("poprawka") lub -i ("interaktywna"), aby zrobić coś częściowo. W przypadku dowolnych różnic nie sądzę, aby było to obsługiwane, ale możesz zastosować poprawkę, a następnie selektywnie cofnąć zmiany niestabilne, używając git checkout -p -- <path(s)>, np. git checkout -p -- ., jeśli jesteś na najwyższym poziomie repozytorium.

+0

ale jest to na podstawie pliku, jednak chciałbym cofnąć poszczególne zmiany w jednym pliku (może to nie jest git związany per se). – camillobruni

+0

Więc zastosuj poprawkę, a następnie 'git checkout -p - file.txt'; wynik netto jest taki, że zastosowałeś łatę do pliku.txt, z wyjątkiem rzeczy, które usunąłeś w drugim kroku. Jeśli tego nie chcesz, nie rozumiem twojego pytania. –

+0

Poprawka będzie zawierać WSZYSTKIE zmiany między plikami, a nie tylko ich część. Powiedzmy, że chcę cofnąć zmiany, które miały miejsce po linii 500 w moim pliku. – camillobruni

Powiązane problemy