git: удаление изменений, внесенных серией плохих коммитов - PullRequest
3 голосов
/ 06 декабря 2010

скажем, у меня есть git-репо с такой историей коммитов: ABCDE

Теперь я вдруг осознаю, что коммиты B и C совершенно ошибочны и не нужны.Также, скажем, у меня есть полная свобода переписывать историю проекта (возможно, я работаю над проектом в одиночку).

У меня есть другая ветка, указывающая на коммиты B и C, поэтому их потеря не является проблемой.Если мне действительно нужны эти изменения, я могу проверить эту ветку и увидеть их.

Но для основной ветви я бы хотел, чтобы история была A-D'-E ', где D и Eне только имеют измененный список родителей, но и не содержат изменений, внесенных коммитами B и C.

Возможно ли это сделать?И если да, то как?

Ответы [ 3 ]

5 голосов
/ 06 декабря 2010

git rebase -i HEAD~5

Затем удалите нежелательные коммиты из списка коммитов

2 голосов
/ 06 декабря 2010

Я собираюсь предположить, что есть 5 коммитов.

В этом случае вы сделаете:

git rebase -i HEAD~5

Затем вы удалите 2 строки, относящиеся к коммитам Bи C.

Наконец, вы сделаете:

git rebase --continue
1 голос
/ 06 декабря 2010
git rebase --onto <i>$commit_A</i> <i>$commit_C</i> <i>$commit_E</i>

Здесь написано «возьмите все коммиты после C, вплоть до E, и включите их воспроизведение поверх A».

Конечно, вы можете использовать любые обозначения для коммитов, на которые вы ссылаетесь. Например. если master находится на E, и у вас есть ветвь, указывающая на C, скажем backup, вы также можете сказать это:

git rebase --onto <i>$commit_A</i> backup master

Это еще удобнее, поскольку у вас останется HEAD, указывающий на master, а master, в свою очередь, направленный на переписанный E.

...