Удалить последние 2 коммита (не отправлены) в Git, сохраняя изменения

Я пытаюсь удалить, а не revert, последние 2 коммита в ветке разработки моего репозитория Git. Коммиты не были выдвинуты.

Как бы я поступил так, не теряя изменений?

2 ответа

Решение

В развивающейся ветке вы бы использовали

git reset HEAD~2

Это сбросит указатель HEAD на коммит 2 до вашего текущего без потери изменений.

Вот выдержка из справки:

git reset [-q] [<tree-ish>] [--] <paths>...
       This form resets the index entries for all <paths> to their state
       at <tree-ish>. (It does not affect the working tree, nor the
       current branch.)

   --mixed
       Resets the index but not the working tree (i.e., the changed
       files are preserved but not marked for commit) and reports what
       has not been updated. This is the default action.

Таким образом, он только сбрасывает индекс, а не дерево. Изменения ваших файлов сохраняются и не добавляются в индекс. Если вы хотите, используйте --soft флаг:

   --soft
       Does not touch the index file nor the working tree at all (but
       resets the head to <commit>, just like all modes do). This
       leaves all your changed files "Changes to be committed", as git
       status would put it.

Я думаю, что вы хотите сделать, это раздавить последние 2 коммита. Вы можете сделать это путем интерактивного перебазирования.

git rebase -i HEAD~3

а затем пометить последние 2 коммитов как f (исправление) или s (сквош) соответственно.

Вот учебник по интерактивному перебазированию

Другие вопросы по тегам