Git отменить изменения в некоторых файлах [дубликат]
этот вопрос уже есть ответ здесь:
во время кодирования я добавил инструкции печати в некоторые файлы, чтобы отслеживать, что происходит.
когда я закончу, можно ли вернуть изменения в некоторых файлах, но зафиксировать файл I на самом деле работал?
скажем, я добавил печать в файл A
, но я изменил файл B
. B
это то, что я хочу совершить и A
, Я хочу вернуться к своему старому состоянию.
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" версия).