Выборочно отменить или оформить изменения в файле в Git? - PullRequest
84 голосов
/ 21 апреля 2009

Существует ли команда, позволяющая частично отменить изменения файла (или файлов) в рабочем каталоге?

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

Я предполагаю опцию для git checkout, которая работает так же, как git add -p, то есть она проходит через файл через ханк и спрашивает, хотите ли вы сохранить его или нет.

Ответы [ 4 ]

110 голосов
/ 27 января 2011

С версией git> = 1.7.1 Я могу

git checkout -p

Я не уверен, когда эта функция была введена.

80 голосов
/ 21 апреля 2009

Вы можете использовать

git add -p <path>

для размещения фрагментов, которые вы хотите сохранить в определенном файле, затем

git checkout -- <path>

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

Наконец, вы можете использовать

git reset -- <path>

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

8 голосов
/ 21 апреля 2009

git checkout $file возвращает состояние файла $file к последнему принятому состоянию. Я думаю, что вы можете использовать git checkout SHA-1 -- $file для возврата файла к фиксации, определенной SHA-1.

1 голос
/ 21 апреля 2009

Сколько коммитов нужно вернуться и выбрать из? Если это всего лишь один, возможно, возьмите ветку перед ней, извлеките файл, который вы зафиксировали, и затем используйте git add -p, чтобы добавить его так, как вы этого хотели. Затем вы можете вернуться туда, где вы были, и извлечь файл из вашей временной ветки.

то есть:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp

Другие альтернативы включают возвращение и редактирование коммита с помощью git rebase -i (пометка коммита как edit, затем выполнение git reset HEAD^ и повторный коммит при возврате в оболочку).

Если изменения, из которых вы хотите выбрать, распространяются на серию коммитов, может быть лучше извлечь их как патчи (или патч, охватывающий все из них) и отредактировать патч вручную, убрав нужные изменения сохранить и подать остаток в git apply --reverse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...