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.
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
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
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
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
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: -)
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
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).
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