Возврат части фиксации с помощью git
Я хочу вернуть конкретную фиксацию в git. К сожалению, наша организация по-прежнему использует CVS в качестве стандарта, поэтому, когда я вернусь к CVS, количество коммитов git сводится к одному. В этом случае я хотел бы выделить оригинальный git commit, но это невозможно.
Есть ли подход, похожий на git add --patch
, который позволил бы мне выборочно редактировать diffs, чтобы решить, какие части фиксации будут возвращены?
Ответы
Ответ 1
Используйте опцию --no-commit
(-n
) для git revert
, затем отключите изменения, затем используйте git add --patch
:
$ git revert -n $bad_commit # Revert the commit, but don't commit the changes
$ git reset HEAD . # Unstage the changes
$ git add --patch . # Add whatever changes you want
$ git commit # Commit those changes
Примечание. Файлы, которые вы добавляете с помощью git add --patch, - это файлы, которые вы хотите вернуть, а не файлы, которые вы хотите сохранить.
Ответ 2
Я успешно использовал следующее.
Сначала верните полную фиксацию (помещает ее в индекс), но не фиксируйте.
git revert -n <sha1> # -n is short for --no-commit
Затем интерактивно удалите возвращенные изменения GOOD из индекса
git reset -p # -p is short for --patch
Затем зафиксируйте обратный разброс плохих изменений
git commit -m "Partially revert <sha1>..."
Наконец, возвращенные изменения ХОРОШЕГО (которые были неустановлены командой reset) все еще находятся в рабочем дереве. Их нужно очистить. Если в рабочем дереве не осталось других незафиксированных изменений, это можно сделать с помощью
git reset --hard
Ответ 3
Решение:
git revert --no-commit <commit hash>
git reset -p # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- . # Don't forget to use it.
Ответ 4
Лично я предпочитаю эту версию, которая повторно использует автоматически сгенерированное сообщение фиксации и дает пользователю возможность редактировать и вставлять слово "Частично", прежде чем, наконец, совершить.
# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>
# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1
# interactively add reversions
git add -p
# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>
# reset the rest of the current directory working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .
Ответ 5
Вы можете использовать git -revert -n, а затем использовать add -patch для выбора hunks.