Возврат части фиксации с помощью 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.