我以通常的方式创建了一个git功能分支:
git checkout develop
git checkout -b new_feature_branch
当将功能合并回主开发分支时,合并产生了大量冲突(由于主线没有太大变化,因此比预期更多)。
在调查中,似乎我的功能分支已经设法成为孤儿的父母。历史记录中缺少对此分支的前24个提交,主线的初始分支也是如此。
我知道它正好是24次提交,因为它们列在git reflog --all | grep new_feature_branch
。
由于缺少这些早期提交,分支现在似乎从整个存储库的副本开始,当我尝试将其合并回开发时会产生大量冲突。
这是怎么发生的?
如何恢复丢失的提交?
答案 0 :(得分:2)
这是怎么发生的?
develop
分支出来 - 您确定本地副本(而不是说origin/develop
)在您分支时是最新的吗?develop
您想要的父分支(不是master
或其他东西)?develop
?这可能会重写develop
中的父提交,但不会重写new_feature_branch
的历史记录。new_feature_branch
,并且意外地在您的分支点之前重新编写了父提交?如何恢复丢失的提交?
只需将您的分支重新绑定到所需的分支点(请参阅this question或this book等)。
答案 1 :(得分:0)
好的,所以这就是我要做的事情来解决它:
git reflog --all | grep <new_feature_branch>
以获取功能分支上的完整提交列表,包括历史记录中缺少的早期提交。.git/logs/HEAD
并搜索最早的可见提交,以查找其原始父级(hat tip)的完整SHA。git cherry-pick <SHA>
,将该分支的基础复制到恢复分支的顶端。解决合并冲突。git rebase --onto <new-parent> <old-parent>
其中new-parent
是我刚刚复制到恢复分支上的提交,而old-parent
是我复制该提交的孤立分支上最早的提交。完整的分支历史记录成功移植,冲突极小。答案 2 :(得分:0)
要恢复,只需使用graft
or a replace
,它允许您重新指定孤立分支的基础(根)的父级。
如果你的功能分支一旦合并就不需要保留它,那么一个简单的移植就足以让你看到正确的分支结构。
然而,合并中的父链接仍将保留孤立分支,并且您的repo将具有两个root提交[可能不是您想要的]。
简单的改进是在移植后做rebase
(你的孤儿在其正确的分支点上)或filter-branch
。
听起来你不小心检查了原始分支点的特定提交,而不是创建一个分支(提示),以便你有一个detached HEAD
的情况,并在一些不合适的订单后做了你的修复错误信息 - 这很容易做到。