Git合并,不包括从一个分支到另一个分支的提交 在开发过程中,我经常需要提交和推动“中间”提交,也就是说,代码不能编译,或者在改变某事物的过程中,等等。我不想做出这样的承诺,但这是为了使我的工作轻松地从办公室回到家里,有时,其他开发人员可以根据这些基础开始他们的工作

Git合并,不包括从一个分支到另一个分支的提交 在开发过程中,我经常需要提交和推动“中间”提交,也就是说,代码不能编译,或者在改变某事物的过程中,等等。我不想做出这样的承诺,但这是为了使我的工作轻松地从办公室回到家里,有时,其他开发人员可以根据这些基础开始他们的工作,git,Git,我想我已经找到了解决这个问题的办法: 我创建一个单独的“dev”分支并进行所有中间提交 一旦代码处于良好状态,就合并到master。因此,主服务器将不包含“中间”提交,而只包含“正常”提交 删除包含所有中间提交的“dev”分支 但这不起作用。当我进行合并时,不仅合并提交被包括到master,而且还包括来自“dev”分支的所有“中间”提交。所以删除“dev”分支没有任何意义,它的“中间”提交保持不变 所以问题是:是否有可能以主服务器只包含自己的提交+合并提交而不包含来自第二个分支的提交的方式进行合

我想我已经找到了解决这个问题的办法:

  • 我创建一个单独的“dev”分支并进行所有中间提交

  • 一旦代码处于良好状态,就合并到master。因此,主服务器将不包含“中间”提交,而只包含“正常”提交

  • 删除包含所有中间提交的“dev”分支

  • 但这不起作用。当我进行合并时,不仅合并提交被包括到master,而且还包括来自“dev”分支的所有“中间”提交。所以删除“dev”分支没有任何意义,它的“中间”提交保持不变


    所以问题是:是否有可能以主服务器只包含自己的提交+合并提交而不包含来自第二个分支的提交的方式进行合并?如果不可能,您能否建议我如何实现我的目标—能够临时保存中间结果,但也能在以后无缝地删除它们?

    您不能在合并过程中删除提交。您可以压缩中间提交,但这是一个坏主意,在您发布它们时,它可能不适合您。您也可以在不进行合并的情况下将它们压缩到主分支中(
    git merge--squash
    后跟
    git commit
    ),然后将主分支合并到dev分支中。

    您需要的是“压缩”合并:

    这会在工作树中创建与常规合并相同的状态,但不会创建将所有中间提交作为祖先的合并提交。中间提交不会成为
    主分支的历史记录的一部分。来自
    git merge
    手册页的此选项文档说明:

    生成工作树和索引状态,就像发生了真正的合并一样 (合并信息除外),但不实际进行提交 或移动
    ,或记录
    $GIT\u DIR/MERGE\u头
    ,以产生下一个GIT commit命令创建合并提交。这允许您创建一个 在当前分支上的单个提交,其效果与 合并另一个分支(如果是章鱼,则合并多个分支)

    当您将“dev”分支合并到master中时,请尝试

    git checkout master
    git merge --squash dev
    git commit -m "Add new feature."
    
    --squash
    选项将把所有中间更改压缩为一个大更改


    如果需要更多的有限控制(例如,进行多个小挤压),还可以使用git rebase--interactive
    。解释
    git merge--squash
    git rebase--interactive

    添加另一个名为RC(release candidate)的分支之间的区别。此分支将只合并已完成的要素分支。您可以让dev一起尝试未完成的分支。您只集成到只包含合并完成的功能的主版本候选版本。

    您可以使用GitHub的
    .patch
    ,例如


    考虑到squash正在与其他开发人员共享这些提交,这是一个好主意吗?+1用于提及
    git-rebase-i
    。那么人们就真的不知道本地开发分支了。@jszakmeister,因为他正在将本地开发分支的更改合并到本地主开发分支的签出中,所以没关系。当他推动他的更改时,其他开发人员会觉得他的更改是一个巨大的提交。换句话说,挤压允许你有一个“添加新功能”的提交,而不是多个“Oops.Fix typo”的提交。不过他有点自相矛盾。在开头的一段中,它说“我不想做出这样的承诺,但这是从办公室到家轻松地继续我的工作所必需的,有时是其他开发人员让他们能够开始工作的基础……”。我认为后者的意思是他可能会共享这个中间状态,但以后仍想修复它。@jszakmeister,是的,我有时会共享这个中间状态,但在我知道我和其他开发人员都不再需要这些提交后,仍然会删除它们。
    git checkout master
    git merge --squash dev
    git commit -m "Add new feature."
    
    git apply 123.patch
    # review changes, edit files etc.
    git add .
    git commit -m "committing #123"