Выборочно вернуть или изменить изменения в файле в 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
.