Как сохранить самую последнюю фиксацию после перебазирования

#git #version-control #git-merge #git-rebase

Вопрос:

Поэтому в настоящее время мое дерево фиксации выглядит примерно так

       D <- newFeature
     /
A-B-C-E <- mainline

 

После того, как я сделал это

 git checkout newFeature
git rebase mainline
 

Произошел конфликт слияния, и последнее дерево фиксации выглядит следующим образом

 A-B-C-E <- newFeature
 

Я действительно хочу сохранить обязательство D, как мне его не потерять и сделать дерево чем-то вроде

 A-B-C-E-D
 

Ответ №1:

Git ведет журналы того, куда указывали ссылки, поэтому после того, как вы перебазировали, newFeature@{1} это то место, где оно было непосредственно перед тем, как вы его перебазировали. Заброшенные коммиты не собираются в мусор до тех пор, пока они не будут полностью недоступны из любой ссылки в течение, по крайней мере, пары недель (возможно, существует чрезмерная сложность в том, как Git выбирает и настраивает интервалы защиты от gc, см. Документы, но две недели-это наименьший интервал безопасности, прежде чем Git сочтет заброшенную фиксацию безопасной для выбрасывания), вы можете получить их идентификаторы, проверив свои рефлоги и проверив их или добавив ссылку для них по идентификатору, или поиск в рефлоге, или что угодно, что работает, git tag newFeature{-before-rebase,@{1}}

Ответ №2:

В моем случае шаги следующие:

 git checkout newFeature
git rebase mainline
 

Разрешите все конфликты

 git add .
git commit
 

Я думаю, что фиксация не потеряна, она просто удерживается. Я не могу использовать git commit --amend , так как это будет фиксация E , которую я изменяю.