Git cofanie zmian w niektórych plikach [duplikat]

To pytanie ma już odpowiedź tutaj:

Podczas kodowania dodałem instrukcje print do niektórych plików, aby śledzić, co się dzieje.

Kiedy skończę, czy można cofnąć zmiany w niektórych plikach, ale zatwierdzić plik, nad którym pracowałem?

Say I dodałem print w pliku A, ale zmodyfikowałem plik B. B jest tym, co chcę zatwierdzić I A, chcę wrócić do starego stanu.

Author: S H, 2009-06-01

6 answers

Istnieją trzy podstawowe sposoby, aby to zrobić, w zależności od tego, co zrobiłeś ze zmianami w pliku A. Jeśli nie dodałeś jeszcze zmian do indeksu lub nie zatwierdziłeś ich, po prostu chcesz użyć polecenia checkout - zmieni to stan kopii roboczej, aby pasował do repozytorium:

git checkout A

Jeśli dodałeś go już do indeksu, użyj reset:

git reset A

Jeśli go popełniłeś, To używasz polecenia revert:

# the -n means, do not commit the revert yet
git revert -n <sha1>
# now make sure we are just going to commit the revert to A
git reset B
git commit

Jeśli z drugiej strony, miałeś zatwierdzono go, ale commit dotyczył raczej wielu plików, których nie chcesz również przywrócić, wtedy powyższa metoda może obejmować wiele poleceń "reset B". W takim przypadku możesz użyć tej metody:

# revert, but do not commit yet
git revert -n <sha1>
# clean all the changes from the index
git reset
# now just add A
git add A
git commit

Kolejna metoda ponownie wymaga użycia polecenia rebase-i. Ten może być przydatny, jeśli masz więcej niż jeden commit do edycji:

# use rebase -i to cherry pick the commit you want to edit
# specify the sha1 of the commit before the one you want to edit
# you get an editor with a file and a bunch of lines starting with "pick"
# change the one(s) you want to edit to "edit" and then save the file
git rebase -i <sha1>
# now you enter a loop, for each commit you set as "edit", you get to basically redo that commit from scratch
# assume we just picked the one commit with the erroneous A commit
git reset A
git commit --amend
# go back to the start of the loop
git rebase --continue
 284
Author: 1800 INFORMATION,
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-06-01 07:39:50

Źródło: http://git-scm.com/book/en/Git-Basics-Undoing-Things

Git checkout -- modifiedfile.java


1) $ Git status

Zobaczysz zmodyfikowany plik

2)$git checkout -- modifiedfile.java

3) $ Git status

 18
Author: dekdev,
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
2013-09-11 21:07:36
git add B # Add it to the index
git reset A # Remove it from the index
git commit # Commit the index
 7
Author: Stefan Mai,
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-06-01 02:16:56

Man git-checkout: git checkout A

 6
Author: Nicolas Dumazet,
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-06-01 02:11:04

TAK;

git commit FILE

Zatwierdzi tylko plik. Następnie możesz użyć

git reset --hard

Aby cofnąć lokalne zmiany w innych plikach.

Mogą być też inne sposoby, o których Nie wiem...

Edit: lub, jak powiedział NicDumZ, git-checkout tylko te pliki, na których chcesz cofnąć zmiany (najlepsze rozwiązanie zależy od tego, czy jest więcej plików do zatwierdzenia lub więcej plików do cofnięcia: -)

 3
Author: Jay,
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-06-01 02:13:49

Dlaczego nie możesz po prostu zaznaczyć jakie zmiany chcesz wprowadzić w commicie używając " git add "(lub nawet "git add --interactive", lub "Git gui", który ma opcję interaktywnego comittingu), a następnie użyć "git commit" zamiast "git commit-a"?

W twojej sytuacji (dla Twojego przykładu) byłoby to:

prompt> git add B
prompt> git commit

Tylko zmiany w pliku B będą dodawane, a plik A będzie pozostawiony "brudny", tzn. z tymi instrukcjami print w wersji obszaru roboczego. Kiedy chcesz usuń te instrukcje drukowania, wystarczy użyć

prompt> git reset A

Lub

prompt> git checkout HEAD -- A

Aby powrócić do wersji comitted (wersja Z HEAD, tzn." GIT show HEAD:a " version).

 1
Author: Jakub Narębski,
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-06-02 12:14:12