我该怎么做:
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'`
答案 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>第一次改组或合并)