Выборочно вернуть или изменить изменения в файле в Git?

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

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

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

Ответ 1

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

git add -p <path>

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

git checkout -- <path>

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

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

git reset -- <path>

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

Ответ 2

С git version >= 1.7.1 я могу

git checkout -p

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

Ответ 3

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

Ответ 4

Сколько коммитов вам нужно, чтобы вернуться и выбрать? Если это один, возможно, возьмите ветку непосредственно перед ней, проверьте файл, который вы совершили, а затем используйте 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.