Удалить коммиты перед конкретным коммитом - PullRequest
20 голосов
/ 17 июня 2010

Есть ли способ удалить все коммиты до указанного коммита и использовать этот коммит в качестве начального?

Ответы [ 2 ]

23 голосов
/ 17 июня 2010

Допустим, хэш нового самого старого коммита - X, и мы можем временно использовать «oldroot» и «newroot»:

git checkout -b oldroot X
TREE=`git write-tree`
COMMIT=`echo "Killed history" | git commit-tree "$TREE"`
git checkout -b newroot "$COMMIT"
git rebase --onto newroot oldroot master
# repeat for other branches than master that should use the new initial commit
git checkout master
git branch -D oldroot
git branch -D newroot
git gc # WARNING: if everything's done right, this will actually delete your history from the repo!

Это создаст коммит «newroot» с тем же содержимым, что и «oldroot»коммит, но без родителей.Затем он перемещает все остальные ветви в новый корень, который должен быть в истории всех из них.

РЕДАКТИРОВАТЬ: проверено и исправлено;Чуть позже уточнил немного

0 голосов
/ 27 октября 2016

Более простое решение: если учесть, что изначально ваша ветвь имеет коммит main , и вы сделали коммит first , теперь вы также сделали коммит second onвершина первая .Итак, у вас есть что-то вроде:

main->first->second

Теперь вы хотите иметь секунду поверх main , а не поверх first .Что-то вроде:

main->second->first or main->second

Вы можете просто сделать,

git rebase -i main

Это даст вам интерактивную оболочку, в которой вы сможете изменить порядок коммитов или удалить любой коммит по вашему выбору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...