【问题标题】:Git: should merged branch be always deleted?Git:是否应该始终删除合并的分支?
【发布时间】:2013-04-02 10:48:53
【问题描述】:

我有一个与 git 合并工作流相关的问题。

当我们将一个分支合并到另一个分支时,AFAIK 可能会发生两件事:要么在目标分支上创建单个提交(在非快进情况下),要么将来自合并分支的提交应用到“之上”在目标分支上提交。

我对第一个案例特别感兴趣。在第二种情况下,所有更改历史记录都被转移到目标分支,在第一种情况下,历史记录被“压缩”为单个提交。结果,如果我们删除合并的分支,我们只有一个提交合并了该分支的所有更改。 另一方面,如果合并分支恰好来自目标分支 AFAIK,则目标分支的每个 rebase 都需要合并分支的 rebase 以保持它们同步。

我的问题是:我们应该总是删除合并的分支,还是有办法保留合并的分支并防止每次“根”分支被重新定位时重新定位它?

保留合并分支的理由是,在这种情况下,我们可以深入了解对该分支所做更改的详细历史记录。

【问题讨论】:

    标签: git git-branch git-merge


    【解决方案1】:

    除非您在git merge 调用中使用--squash 选项,否则合并分支的分支信息将被保留。新创建的 merge 提交只有两个(或更多,在章鱼合并的情况下)父提交,而不是一个。第一个父级对应于您合并到的分支,其他父级代表合并的分支。

    您可以使用例如gitk 工具,或通过例如使用

    git log --pretty=oneline --abbrev-commit --graph --decorate
    

    因此,在正常合并的情况下(非压缩,无论是快进还是非快进),您都可以轻松保留原始分支并继续使用它进行开发。如果您进行了 squash,未来的非 squash 合并可能会给后人带来极大的困惑,因此最好使用git reset --hardgit rebase,以防您已经有了新的更改。

    【讨论】:

    • 谢谢!如果保留合并的分支,您能否推荐任何变基策略?有什么方法可以防止合并的分支连同它们的派生分支一起变基?
    • 对不起,我不太明白你想要什么...变基基本上将补丁序列应用于不同的起点,仅此而已。我认为git-rebase(1) 很好地解释了这一点。
    • 我在考虑这样一种情况,当我们有一些“base”分支时,我们从中派生“work”分支,然后,一段时间后,我们将“work”分支合并回“base” " 以非快进方式。在这种情况下,AFAIK,每次“基础”重新定位为 .e.g.上游,这也需要重新设置“工作”分支,即使我们没有对该分支进行任何进一步的工作,并且它已合并到“基础”分支。我想知道如果我们想在合并后保留它,是否有任何方法可以防止这种对“工作”分支进行变基的必要性。
    • 不,您不能自动执行此操作。我不确定TopGit 在这里是否有帮助。 StackedGit 当然可以让你很容易地变基,但是,用它维护的分支首先不适合合并......
    • 我认为您可能使用错误的变基。您永远不应该对已推送或以其他方式在本地存储库之外共享的任何内容进行变基。如果您这样做,所有其他克隆将处于非常混乱的状态。 git-scm.com/book/ch3-6.html#The-Perils-of-Rebasing
    【解决方案2】:

    合并时,您可以选择将其压缩或保持原样。

    我想说的是,如果您将其压扁,只需先删除分支,因为它显然已经完成了它被压扁后的一部分。

    如果您保持分支完好无损(没有挤压),您可以留下它并在需要时重新使用它。

    一般来说,我只会在历史无用甚至错误的情况下压缩提交。我已经完成了提交无法构建稍后修复的开发。这些提交应该在合并之前被压扁。

    【讨论】:

    • 谢谢!实际上我最近所做的是以非快进方式合并分支(即使它通常会合并为快进),因为我希望在目标分支上具有编译/工作状态,同时能够看到提交完成在合并的分支上。
    • Tomek,你说得对,我总是在合并时使用 --no-ff。实际上,有一种方法可以在全局设置中设置 --no-ff,这样你就永远不会使用快进。我也喜欢看过去的车道变化。
    【解决方案3】:

    在我工作的地方,我们使用this 作为我们的工作流模型。当我们实施更改时,我们会创建一个功能分支并放入一个空提交来描述该分支。

    git checkout -b feature1
    git commit --allow-empty -m "Create branch to add a menu."
    

    当我们完成这项工作,或者到达一个好的停止点时,我们合并到特性分支(非快进)并删除特性分支。

    git checkout develop
    git merge --no-ff feature1
    git branch -d feature1
    

    分支历史仍然保留为 gitk 下的“换道”。这使我们可以很好地了解该功能的更改内容,但避免弄乱我们拥有的分支列表。

    【讨论】:

    • 非常感谢!我不知道gitk的这个“换道”功能。
    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2017-01-24
    • 2019-07-08
    • 2020-11-13
    相关资源
    最近更新 更多