#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
, которую я изменяю.