git selective odwraca lokalne zmiany z pliku

W moim Git repo, który śledzi repo svn, dokonałem kilku zmian w jednym pliku.

Teraz chcę przywrócić te zmiany (jak svn revert), ale tylko fragmenty pliku.

Chcę mieć możliwość przeglądania różnic w pliku, odrzucania (przywracania) zmian, których nie chcę i zachowywania zmian, których chcę.

The

git add -i 

Command wydaje się mieć taką możliwość, ale nie chcę tego jeszcze wystawiać.

Author: p.campbell, 2009-07-10

6 answers

Możesz to zrobić bezpośrednio za pomocą git checkout -p. Zobacz odpowiedź Daniela Stutzbacha poniżej.


stara odpowiedź (przed checkout -p została wprowadzona):

Możesz to zrobić tak:

git add -i

(wybierz te, które chcesz zachować)

git commit -m "tmp"

Teraz masz commit z tylko zmianami, które chcesz zachować, a reszta jest nieaktywna.

git reset --hard HEAD

W tym momencie niezatwierdzone zmiany zostały odrzucone, więc masz czysty katalog roboczy, ze zmianami chcę pozostać zaangażowana na szczycie.

git reset --mixed HEAD^

Usuwa to ostatni commit ('tmp'), ale zachowuje modyfikacje w katalogu roboczym, bez zmian.

EDIT: zamieniono --soft na --mixed, aby oczyścić miejsce postoju.

 80
Author: Paolo Capriotti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:50

Wierzę, że można to zrobić najprościej:

git checkout -p <optional filename(s)>

Ze strony Man:

   −p, −−patch
       Interactively select hunks in the difference between the <tree−ish>
       (or the index, if unspecified) and the working tree. The chosen
       hunks are then applied in reverse to the working tree (and if a
       <tree−ish> was specified, the index).
       This means that you can use git checkout −p to selectively discard
       edits from your current working tree.
 291
Author: Daniel Stutzbach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 22:55:57

Możesz uruchomić git diff na pliku, zapisać wynikowy diff, edytować go, aby usunąć zmiany, które chcesz zapisać, a następnie uruchomić go przez patch -R, aby cofnąć Pozostałe diffy.

git diff file.txt >patch.tmp
# edit patch.tmp to remove the hunks you want to keep
patch -R <patch.tmp
 3
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-10 11:44:36

Wygląda na to, że chcesz

 git revert --no-commit $REVSISON 

Możesz użyć

 git diff --cached

Aby zobaczyć, jakie zmiany zostaną wprowadzone przed zatwierdzeniem ( ponieważ cofanie jest tylko zatwierdzeniem w kierunku do przodu, które replikuje odwrotność zmiany w przeszłości )

Jeśli korzystałeś z czystego repozytorium Git, możesz, w zależności od swoich celów, użyć interaktywnej rebase (git rebase -i), aby wrócić do zmian, które Ci się nie spodobały i edytować je z mocą wsteczną, tak aby zmiany, które Ci się nie podobają, nigdy się nie wydarzyły, ale to zazwyczaj tylko dla Jeśli wiesz nie będziesz chciał tego więcej zobaczyć.

 2
Author: Kent Fredric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-11 09:33:11

Ponowne czytanie pytania brzmi tak, jakbyś chciał cofnąć zmiany, które są w twoim drzewie roboczym, a nie zmiany, które zostały wcześniej popełnione, ale niektóre inne odpowiedzi sprawiają, że brzmi to tak, jakby moje czytanie mogło być błędne. Możesz to wyjaśnić?

Jeśli zmiany są tylko w Twojej kopii roboczej, najprostszym sposobem na to jest ustawienie zmian, które chcesz zachować:

git add -i <file>

Następnie odrzuć zmiany, których nie chcesz zachować, sprawdzając indeks wersja:

git checkout -- <file>

Następnie wycofaj zmiany, jeśli nie chcesz ich jeszcze wystawić:

git reset -- <file>

Ten przepis przywraca tylko wybrane zmiany do pliku (lub plików, które podałeś) i nie tworzy żadnych tymczasowych zmian, które wymagają przywrócenia.

Jeśli chcesz selektywnie zastosować tylko niektóre zmiany wprowadzone w poprzednich zatwierdzeniach, możesz najpierw zresetować plik do poprzedniego stanu zatwierdzonego:

git reset <commit_before_first_unwanted_change> -- <file>

Następnie możesz zastosować poprzedni przepis git add -i <file>, Aby ustawić te zmiany, które chcesz zachować, git checkout -- <file> aby wyrzucić niechciane zmiany i git reset -- <file> aby "usunąć" zmiany.

 1
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-10 15:43:47

Opcje wiersza poleceń opisane w odpowiedziach są przydatne, gdy plik znajduje się na serwerze, do którego uzyskuję dostęp przez terminal ssh. Jednak, gdy plik jest na mojej lokalnej maszynie, preferuję następujący sposób:

Otwórz plik w edytorze netbeans (który jest wyposażony w obsługę Gita). Netbeans umieszcza czerwone/zielone / niebieskie znaki na numerach linii, aby wskazać, gdzie rzeczy zostały usunięte/dodane/zmodyfikowane (odpowiednio).

Kliknięcie prawym przyciskiem myszy dowolnego z tych znaków daje możliwość cofnięcia tego zmiana. Ponadto możesz kliknąć prawym przyciskiem myszy na czerwone i niebieskie znaki, aby znaleźć starą wersję w wyskakującym okienku.

 0
Author: Abhishek Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-07 05:05:38