Git отменить изменения в некоторых файлах [дубликат]


этот вопрос уже есть ответ здесь:

во время кодирования я добавил инструкции печати в некоторые файлы, чтобы отслеживать, что происходит.

когда я закончу, можно ли вернуть изменения в некоторых файлах, но зафиксировать файл I на самом деле работал?

скажем, я добавил печать в файл A, но я изменил файл B. B это то, что я хочу совершить и A, Я хочу вернуться к своему старому состоянию.

6 182

6 ответов:

есть три основных способа сделать это в зависимости от того, что вы сделали с изменениями в файле A. Если вы еще не добавили изменения в индекс или не зафиксировали их, то вы просто хотите использовать команду checkout - это изменит состояние рабочей копии в соответствии с репозиторием:

git checkout A

если вы уже добавили его в индекс, используйте reset:

git reset A

если вы совершили это, то вы используете команду 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

если на с другой стороны, вы совершили его, но фиксация включала довольно много файлов, которые вы также не хотите возвращать, тогда приведенный выше метод может включать в себя множество команд "reset B". В этом случае вы можете использовать этот метод:

# 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

другой метод снова требует использования команды rebase-i. Это может быть полезно, если у вас есть несколько фиксаций для редактирования:

# 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

Источник:http://git-scm.com/book/en/Git-Basics-Undoing-Things

git checkout -- modifiedfile.java


1) $ git status

вы увидите измененный файл

2) $ git checkout -- modifiedfile.java

3) $ git status

git add B # Add it to the index
git reset A # Remove it from the index
git commit # Commit the index

man git-checkout:git checkout A

да,

git commit FILE

зафиксирует только файл. Тогда вы можете использовать

git reset --hard

для отмены локальных изменений в других файлах.

могут быть и другие варианты, о которых я не знаю...

edit: или, как сказал NicDumZ, git-checkout только файлы, которые вы хотите отменить изменения (лучшее решение зависит от того, есть ли больше файлов для фиксации или больше файлов для отмены: -)

почему вы не можете просто отмечать, какие изменения вы хотите иметь в фиксации с помощью "git add "(или даже "git add -- interactive", или" Git gui", который имеет опцию для интерактивного comitting), а затем использовать" git commit "вместо"git commit-a"?

в вашей ситуации (для вашего примера) это будет:

prompt> git add B
prompt> git commit

будут внесены только изменения в файл B, а файл A останется "грязным", т. е. с этими операторами печати в рабочем режиме версия зоны. Когда вы хотите удалить эти инструкции печати, было бы достаточно использовать

prompt> git reset A

или

prompt> git checkout HEAD -- A

чтобы вернуться к версии comitted (версия из HEAD, т. е. "git show HEAD:a" версия).