我的git分支是如何忘记它的父母的?

时间:2012-11-30 18:46:35

标签: git

我以通常的方式创建了一个git功能分支:

git checkout develop
git checkout -b new_feature_branch

当将功能合并回主开发分支时,合并产生了大量冲突(由于主线没有太大变化,因此比预期更多)。

在调查中,似乎我的功能分支已经设法成为孤儿的父母。历史记录中缺少对此分支的前24个提交,主线的初始分支也是如此。

我知道它正好是24次提交,因为它们列在git reflog --all | grep new_feature_branch

由于缺少这些早期提交,分支现在似乎从整个存储库的副本开始,当我尝试将其合并回开发时会产生大量冲突。

这是怎么发生的?

如何恢复丢失的提交?

3 个答案:

答案 0 :(得分:2)

  

这是怎么发生的?

  • 您从develop分支出来 - 您确定本地副本(而不是说origin/develop)在您分支时是最新的吗?
  • 绝对是develop您想要的父分支(不是master或其他东西)?
  • 你是否在分支后重新定位develop?这可能会重写develop中的父提交,但不会重写new_feature_branch的历史记录。
  • 您是否曾在某个时候重新定位new_feature_branch,并且意外地在您的分支点之前重新编写了父提交?
  

如何恢复丢失的提交?

只需将您的分支重新绑定到所需的分支点(请参阅this questionthis book等)。

答案 1 :(得分:0)

好的,所以这就是我要做的事情来解决它:

  1. 运行git reflog --all | grep <new_feature_branch>以获取功能分支上的完整提交列表,包括历史记录中缺少的早期提交。
  2. 打开.git/logs/HEAD并搜索最早的可见提交,以查找其原始父级(hat tip)的完整SHA。
  3. 签出父提交(现在从分支的历史记录中丢失的提交),然后从此提交中签出新的“恢复”分支以创建新的基础。执行此操作后,作为恢复分支的一部分,“丢失”提交重新出现在树中,并从开发分支中正确分叉。
  4. 使用'孤立'分支中最旧的提交运行git cherry-pick <SHA>,将该分支的基础复制到恢复分支的顶端。解决合并冲突。
  5. 查看孤立的分支。
  6. 运行git rebase --onto <new-parent> <old-parent>其中new-parent是我刚刚复制到恢复分支上的提交,而old-parent是我复制该提交的孤立分支上最早的提交。完整的分支历史记录成功移植,冲突极小。

答案 2 :(得分:0)

要恢复,只需使用graft or a replace,它允许您重新指定孤立分支的基础(根)的父级。

如果你的功能分支一旦合并就不需要保留它,那么一个简单的移植就足以让你看到正确的分支结构。

然而,合并中的父链接仍将保留孤立分支,并且您的repo将具有两个root提交[可能不是您想要的]。

简单的改进是在移植后做rebase(你的孤儿在其正确的分支点上)或filter-branch

听起来你不小心检查了原始分支点的特定提交,而不是创建一个分支(提示),以便你有一个detached HEAD的情况,并在一些不合适的订单后做了你的修复错误信息 - 这很容易做到。