2015-03-02 69 views
3

我想了解更多关于我们团队最近拥有的git问题。我们有分支机构的几层:在现有提交哈希已更改时重新编址

-> Master 
    |-> Feature Branch 
     |-> Individual developer branches 

小开发组工作过一个特性分支,我们有几个不同的特性分支去一次。

当其中一个与Master合并时,功能分支所有者将rebase他们的功能分支。每隔一段时间,他们都会将合并到单个开发人员的功能分支中的任何工作与冲突合并。

修复合并冲突通常会在变基期间更改提交哈希。

当个人开发者则不会关注的分支衍合到他们的开发分支,目前在技术上已经2犯中修正了该项目的哈希值:

  • 老犯哈希(预变基/合并冲突)仍然保留在开发者分支上
  • 新的提交哈希(post-rebase)现在存在于功能分支上。

当此开发人员尝试与功能分支进行比较时,旧提交被视为一项新工作,并“拉扯”拉取请求。

我可以通过让他们从最新的功能分支创建一个新的分支并挑选他们的工作来轻松“解决方法”。这会丢弃旧的提交哈希,但这不是有效的。

有没有什么办法可以改变我们的练习或rebase的不同,这样我们就可以在开发者分支中排除“改变”的提交散列?

+0

你提到了一个拉请求,你对这些使用什么? Github上?你可以通过“弄脏请求”来扩展你的意思吗? – Schwern 2015-03-02 20:02:34

+0

我们使用github企业,但这与问题无关。开发者分支和功能分支的比较会显示一个已经存在的提交列表 - 这仅仅是git不能识别提交散列。 – helion3 2015-03-02 20:09:48

回答

1

TL; DR版本:有没有人使用git pull --rebase


如果我理解正确,就有这种情况。

A - B - C [m] 
    \ 
     D - E - F [f] 
      \ 
      G - H - I [d] 

m为主,f为特征分支,d为开发分支。您希望能够将f重新分配给m,并将其重新分配给新的f。

     G1 - H1 - I1 [d] 
        /
      D1 - E1 - F1 [f] 
     /
A - B - C [m] 
    \ 
     D - E - F 
      \ 
      G - H - I 

答案是有大家git pull --rebase这相当于一个git fetch加上git rebase。这是如何工作的。这是存储库在推送到主服务器之后的样子(提交C)的样子。

origin 
A - B - C [m] 
    \ 
     D - E - F [f] 
      \ 
      G - H - I [d] 

feature branch maintainer 
A - B [m][o/m] 
    \ 
     D - E - F [f][o/f] 
      \ 
      G - H - I [o/d] 

dev branch maintainer 
A - B [m][o/m] 
    \ 
     D - E - F [o/f] 
      \ 
      G - H - I [d][o/d] 

特征分支维护者决定更新它的时间,所以他们git pull --rebase origin master。这是一个git fetch origin加上git rebase origin/master。造成这种情况。

feature branch maintainer 
      D1 - E1 - F1 [f] 
      /
A - B [m]- C [o/m] 
    \ 
     D - E - F [o/f] 
      \ 
      G - H - I [o/d] 

然后,他们git push origin(我相信他们会需要强制),这是结果。

origin 
      D1 - E1 - F1 [f] 
      /
A - B - C [m] 
    \ 
     D - E 
      \ 
      G - H - I [d] 

feature branch maintainer 
      D1 - E1 - F1 [f][o/f] 
      /
A - B [m]- C [o/m] 
    \ 
     D - E 
      \ 
      G - H - I [o/d] 

dev branch maintainer 
A - B [m][o/m] 
    \ 
     D - E - F [o/f] 
      \ 
      G - H - I [d][o/d] 

现在开发分支维护人员想要更新,幸福地不知道任何事情发生在功能分支。他们git pull --rebase相当于git fetch origingit rebase origin/feature。取回后它看起来像这样。

dev branch maintainer 
      D1 - E1 - F1 [o/f] 
      /
A - B [m]- C[o/m] 
    \ 
     D - E 
      \ 
      G - H - I [d][o/d] 

然后git rebase origin/feature

dev branch maintainer 
         G1 - H1 - I1 [d] 
         /
      D1 - E1 - F1 [o/f] 
      /
A - B [m]- C[o/m] 
    \ 
     D - E 
      \ 
      G - H - I [o/d] 

他们可以推动,可能与--force

你会注意到开发分支在F1上,而不是E1,因为它原来是。如果你想保持,你必须专门到E1。


如果混帐无法弄清楚,d和E是不是真正的Dev分支的一部分,你可能会风与此。

dev branch maintainer 
         D2 - E2 - G1 - H1 - I1 [d] 
         /
      D1 - E1 - F1 [o/f] 
      /
A - B [m]- C[o/m] 
    \ 
     D - E 
      \ 
      G - H - I [o/d] 

的Git应该能想出解决办法使用“修补程序ID”,这就像提交身份证,但他们只检查剩下的内容和无法比拟的。如果不行,请尝试更新Git并查看是否有帮助。如果它仍然无法做到,那么你在git-rebase文档中称之为“困难的情况”。你必须拼出Git,你需要使用--onto来兑换。幸运的是,reflog将特征分支的前一个位置包含为f @ {1},您可以将其用作参考。

git rebase --onto f [email protected]{1} 

即说变基当前分支(d)到女,但从d只变基至f @ {1}(这是其中f曾经是)。


我已经git pull --rebase别名为git repull。我几乎完全这样做,这是相当安全的,通常是正确的。您可以使用git config --global pull.rebase true将其配置为默认值。

欲了解更多信息,请参阅Recovering From An Upstream Rebase in the git-rebase docs

+0

我不确定这是否解决了核心问题。我们已经在使用'git fetch [remote]'和'rebase [remote/branchname]'。当git rebase时,它需要确定哪些提交是“新工作”,并且尚未存在于正在从中进行更改的“上游”分支上。因为提交哈希已经发生了变化,因为提交已经在两者上都存在,git认为这是一个新的提交,并试图“重新应用”这些更改。显然,合并冲突比比皆是。 – helion3 2015-03-02 20:31:49

+0

@ helion3 Git应该可以使用修补程序ID来完成此操作,修补程序ID就像提交ID一样,但只涉及内容更改。我所描述的是git-rebase文档中的“简单案例”。你正在描述“困难的情况”。你使用的是什么版本的Git?在[Pro Git *]的Rebasing部分查看“Rebasing的风险”和“Rebase When You Rebase”(http://www.git-scm.com/book/en/v2/Git-Branching-Rebasing) 。 – Schwern 2015-03-02 20:36:47

+0

@ helion3我已经更新了答案,以解释如何处理“困难的情况”。 – Schwern 2015-03-02 20:46:43