保持提交历史记录所需的git rebase'magic'

时间:2011-07-08 04:30:29

标签: git

我该怎么做:

master: A - B - C - D -------------- F - G - H
                     \             /  \
feature:               A' - B' - C'     D' - F' - G'

为:

master: A - B - C - D -------------- F - G - H
                     \             /          \
feature:               A' - B' - C'            D' - F' - G'

?基本上删除了A'-C'-F历史,将D'-G'从F变为H,然后将其加回。这将是如此有用。

以下是我想要这个的更多细节。我工作时使用功能分支。 我的工作流程:

master: A - B - C - D
             \    
feature:      A' - B' - C'

当我完成了我的功能后,我会git rebase master然后git rebase -i master或者来自主git merge --squash feature,然后将其作为一个很好的提交推送到掌握。

我明白了:

master: A - B - C - D - F
                     \    
feature:              A' - B' - C'

其中F只是A',B'和C'压扁在一起。 一切都很好。但后来我想继续在同一个功能分支上工作。我还没想出怎么做。我能做到:

feature2:                  D' - E' - F'
                         / 
master: A - B - C - D - F
                     \    
feature(archive):      A' - B' - C'

哪个很烦人。合并--squash然后合并master和feature将得到:

master: A - B - C - D -------------- F - G - H
                     \             /  \
feature:               A' - B' - C'     D' - F' - G'

帮我解决这个问题:

master: A - B - C - D -------------- F - G - H
                     \             /          \
feature:               A' - B' - C'            D' - F' - G'

那么我就可以推动掌握:

master: A - B - C - D -------------- F - G - H ------------ I
                     \             /          \            /
feature:               A' - B' - C'            D' - F' - G'

并重复循环。

最后的数字,评论。

master: A - B - C - D -------------- merge - F - G - H
                     \              /    \
feature:               A' - B' - C' ---- merge - D' - F' - G'`

2 个答案:

答案 0 :(得分:4)

我认为你过度思考事物。只需在功能分支上执行git rebase master即可轻松完成第一个示例。 A' B' C'位是常见历史记录,因此rebase忽略它。

问题可能是你要挤压来创建F。如果您想在历史记录中保留A' - B' - C',请不要压缩 - git merge。如果你想要摆脱中间提交,那么,继续进行压缩,但是你必须丢弃这些提交并在功能分支上git reset --hard master返回到可以与主服务器合并的历史记录

答案 1 :(得分:1)

OP Mihai评论:

  

有没有办法让它双向进行?对于拥有稳定和稳定的高手来说,这将是非常棒的。逻辑提交,但能够保留自己的详细信息。

为什么是,理论上存在(尽管Blair Holloway已经给出了令人信服的理由不去;))。 你需要记住,Git永远不会改变/擦除/覆盖提交的历史记录。它只会生成 new

所以如果:

  • 改为压缩/合并压缩您的feature分支,您重新绑定或合并 feature-tmp 分支(您在feature所在的地方创建),您将仍然有feature分支!
    (因为features HEAD仍会在之前引用那些“旧”提交并重新加入或压制)
  • 然后你会git checkout feature(它仍在那里),git merge -s ours master回到feature(那种方式和后续的合并或重组只会考虑来自之后的功能提交/ em>第一次改组或合并)