2

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

git checkout develop
git checkout -b new_feature_branch

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

经过调查,我的功能分支似乎以某种方式从它的父级变成了孤儿。历史中缺少该分支的前 24 次提交,主线的初始分叉也是如此。

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

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

这怎么发生的?

如何恢复丢失的提交?

4

3 回答 3

2

这怎么发生的?

  • 你从develop- 你确定你的本地副本(而不是 say origin/develop)在你分支时是最新的吗?
  • 绝对develop是您想要的父分支(不是master或其他)?
  • develop分支后你变基了吗?这可能会重写 's 中的父提交,develop而不是new_feature_branch's 中的历史记录。
  • 你是否在某个时候变基new_feature_branch,并在你的分支点之前不小心重写了父提交?

如何恢复丢失的提交?

只需将您的分支重新定位所需的分支点(请参阅此问题本书等)

于 2012-11-30T21:20:49.003 回答
0

To recover, simply use either a graft or a replace which allows you to re-specify the parents of the base(root) of your orphaned branch.

If you do not need to keep your feature branch once it has been merged, then a simple one off graft could be sufficient for you to see the right branching structure.

However the parent linkage at the merge will still keep the orphaned branch and your repo will the have two root commits [probably not what you desire].

The simple improvement is to do a rebase (of your orphan onto its proper branch point) or a filter-branch after the graft.

It sounds like you had accidentally checked out the specific commit at the original branch point rather than creating a branch (tip) so that you had a detached HEAD situation, and did your fix ups in an inappropriate order after some error message - it's easy to do.

于 2012-12-01T11:03:09.487 回答
0

好的,这就是我修复它的方法:

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