Если вы уже выдвинули свои коммиты к источнику, то другие решения, описанные здесь (с использованием git reset
или git checkout
, за которыми следует git commit
), являются вашим единственным вменяемым вариантом.
Однако, , если вы еще не отправили свои изменения, и , если вы хотите удалить все следы, которые когда-либо были зафиксированы в файлах, хорошим вариантом является интерактивная перебазировка. Используйте следующую команду для отмены двух последних коммитов:
git rebase --interactive HEAD~2
Откроется редактор, показывающий ваши два коммита. Вы хотите отредактировать файл, чтобы показать следующее, затем сохранить; в частности, вы хотите изменить pick
перед первым коммитом на edit
:
edit b743075 Commit 1
pick 791962d Commit 2
Затем Git переведет нас в состояние, в котором мы можем редактировать первый коммит (не касаясь второго). В нем говорится, что вы можете изменить коммит с помощью git commit --amend
, но мы на самом деле хотим сбросить коммит перед заголовком и полностью отменить его:
git reset HEAD^
Это поместит изменения из Commit 1 обратно в ваше рабочее дерево. Затем git add
только те файлы, которые вы хотите сохранить, и повторите их, используя git commit
:
git add dir1/file1.cpp
git add dir1/file1.h
git commit -m "Commit 1"
Наконец, сделайте полный сброс, чтобы удалить файлы, которые вы не хотите сохранять из рабочего дерева, и завершите ребаз:
git reset --hard
git rebase --continue
Когда перебазирование будет завершено, ваш репозиторий будет иметь обе фиксации, но никаких следов file2.*
файлов не будет.