Git отменить изменения в некоторых файлах

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

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

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

Ответ 1

Существует три основных способа сделать это в зависимости от того, что вы сделали с изменениями в файле 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

Ответ 4

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

Ответ 5

Да;

git commit FILE

сделает только FILE. Затем вы можете использовать

git reset --hard

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

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

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

Ответ 6

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

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

prompt> git add B
prompt> git commit

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

prompt> git reset A

или

prompt> git checkout HEAD -- A

чтобы вернуться к завершенной версии (версия от HEAD, т.е. "git показать HEAD: A" ).