首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并意外分割提交

合并意外分割提交
EN

Stack Overflow用户
提问于 2014-10-01 20:33:59
回答 1查看 51关注 0票数 2

我有这样一段历史(按数字/字母排序):

代码语言:javascript
复制
c1a - c1b - c2a - c2b - c4 - c5 - c6 - c8 (master)
                   |               \     
                   |                c9 (branch2)
                    \
                      c3 - c10 (branch3)
                       \
                        c7 - c11 (branch4)

我想压缩提交c2a en c2b,但是我找不到独立于分支的方法,所以我不得不重新定位4次,而不是我所期望的结果(星星表示由于重基而产生的副本):

代码语言:javascript
复制
c1a - c1b - c2ab - c4 - c5 - c6 - c8 (master)
      ||\     
      || c2ab* - c4* - c5* - c6* - c9 (branch2)
      |\ 
      | c2ab** - c3 - c10 (branch3)
      \
       c2ab*** - c3* - c7 - c11(branch4)

代替

代码语言:javascript
复制
c1a - c1b - c2ab - c4 - c5 - c6 - c8 (master)
              |               \     
              |                c9 (branch2)
               \
                c3 - c10 (branch3)
                 \
                  c7 - c11 (branch4)

对历史的所有修改都是本地的和远程的。

我的问题是:

  • 如何修复我的历史记录,以便将所有副本合并为一个提交?
  • 如何在不重新创建问题的情况下,将c1a和c1b压缩为一次提交?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-01 21:08:08

1)对于分支2、3和4,至少需要再运行3次git rebase

2)你不能。如果你改变了一个提交,你必须重写每一个后代提交,以及所有与这些提交相关的参考文献(通过重基)。这是无可奈何的。

您的中间图表明,您原来的重基尝试出了问题,所以这一次您将得到通常重基操作的两倍。

一般来说,如果你有一个已经发表的历史,有那么多的提交和参考,基于它,我建议不要混混它。

从最初的图表开始--您有3个SHAs,它们充当分支的锚。C2B通向硕士和Branch3,C3通向分支4,C6通向Branch2。一旦您为C2B重写了SHA,所有其他SHA也将发生变化,这使得整个过程非常复杂,很难在不直接跟踪中间SHA的情况下自动化。以下内容应适用于这一具体情况。

请注意,这要求您对各个分支的提交具有特定的知识。您可以尝试在没有提交限制器的情况下执行重基操作,但我偶尔也有过这样做的糟糕经验(在这种情况下,Git重新定位的次数比它应该的要多,最后我不得不退出它,然后中止并再次尝试)。

代码语言:javascript
复制
git checkout master 
git rebase -i HEAD~5
# edit rebase todo list to combine c2a/c2b
# once rebase has finished, master is OK.  Use git log to get the SHA that represents C2AB
git checkout branch2
git rebase --onto master~1 HEAD~1 # this will relocate the one unique commit on branch2 and hang it off of C6'
git checkout branch3
git rebase --onto C2AB_SHA HEAD~2 # this will take the two commits on branch3 and put them onto C2AB
git checkout branch4
git rebase --onto branch3~1 HEAD~2 # this will take the two commits on branch4 and put them on C3'  

通常,当你这样做的时候,你会把其他的分支重新定位到你的新分支顶端,而不是试图保留原始的亲缘关系。这样事情就容易多了。

您的恢复过程实际上是相同的,但略有不同-对和限制说明。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26150118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档