2016-01-28 4 views
2

Примечание: Я знаю, что это переписывание истории, изменение всех хэшей и уничтожение всех остальных.Удалить родителя фиксации, тем самым сделав его начальным фиксатором

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

Как это сделать? (Я мог бы, конечно, изменить объект фиксации, но тогда коммиты не будут указывать друг на друга.) Кроме того, я хотел бы сделать это на новой ветке (что означает, что в настоящее время существует две истории: исходная , а другое, где совершают начальное обязательство.)

+0

Если вы хотите полностью отключить фиксацию от своего родителя и не иметь истории, почему бы просто не скопировать все файлы и создать новое репо? –

+0

@ EdCottrell, потому что я хочу, чтобы дети/потомки выжили. – PyRulez

+0

Итак, я не уверен на 100%, это поможет - я больше похож на Меркуриального парня, чем на git, но посмотрю http://stackoverflow.com/questions/9844082/how-to-create-a- new-git-repository-from-an-existing-one –

ответ

2

мерзавца перебазироваться -i HEAD ~

Затем в редакторе, который выскакивает после указанного терминала CMD Изменить начало ребенка совершить линию из кирки в сквош. Или 'p' и 's' соответственно. Запишите файл и выйдите из редактора, который появился по вышеуказанной команде.

Редактировать: Предполагая, что две коммиты являются самыми последними. Если нет, то вы можете проверить ребенка ребенка совершить хэш и использовать мерзавца перебазироваться -i HEAD ~ 2 вместо

edit2: или вы могли бы просто мерзавец перебазироваться -i parentcommithash и верхней части списка должен быть родителем

0

Предположим, вы хотите, чтобы ваша новая начальная фиксация была 123456.

git checkout -b new_master 
git filter-branch --commit-filter ' 
    if git merge-base --is-ancestor 123456 $GIT_COMMIT ; 
    then 
    git commit-tree "[email protected]"; 
    else 
    skip_commit "[email protected]"; 
    fi' HEAD 

Todo (для тех, кто): Edit в объяснении

2
git checkout -b newbranch 
git rev-parse @ >.git/info/grafts # any equivalent for @ will work e.g. HEAD or newbranch 
git filter-branch 
rm .git/info/grafts 

(редактирование: добавлено rm Без этого, это репо по-прежнему отражает привитую родословную для оригинальной фиксации.)

+0

спасибо за добавление' rm', I был смущен, посмотрев историю после переписывания commit :) – shreyas