Git合并时不包括从一个分支到另一个分支的提交

时间:2013-02-12 02:20:05

标签: git

在开发过程中,我经常需要提交并推送“中间”提交,即提交代码不可编译或更改内容等等。我不想做这样的提交,但这是简单的必需继续我的工作从办公室到家,有时为其他开发人员提供他们可以开始工作的基础。

我以为我找到了解决这个问题的方法:

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

  2. 一旦代码处于良好状态,请合并为主。因此,master不会包含“中间”提交,只会包含“正常”提交。

  3. 删除所有中间提交的“dev”分支。

  4. 但这不起作用。当我进行合并时,不仅包括合并提交到master,还包括来自“dev”分支的所有“中间”提交。所以删除“dev”分支什么都没有,它的“中间”提交就在那里。

    所以问题是:是否有可能以master只包含自己的提交+合并提交的方式进行合并,而不包括第二个分支的提交?如果这是不可能的,你能否告诉我如何实现我的目标 - 能够临时保存中间结果,还能在以后无缝删除它们?

5 个答案:

答案 0 :(得分:22)

将“dev”分支合并为master时,请尝试

git checkout master
git merge --squash dev
git commit -m "Add new feature."

--squash选项会将您的所有中间变更压缩为一个重大变化。

如果您需要更多有限控制(例如reordering commits并执行多个小南瓜),您也可以使用git rebase --interactiveThis answer解释了git merge --squashgit rebase --interactive之间的差异。

答案 1 :(得分:4)

你想要的是“壁球”合并:

git checkout master
git merge --squash dev
git commit -m 'current stable work from dev branch'

这样做是在工作树中创建与常规合并相同的状态,但不创建包含所有中间提交作为祖先的合并提交。中间提交不会成为master分支历史的一部分。 git merge联机帮助页中的此选项文档说明:

  

生成工作树和索引状态,就像发生了真正的合并一样   (合并信息除外),但实际上并未提交   或移动HEAD,也不记录$GIT_DIR/MERGE_HEAD以导致下一个git   commit命令用于创建合并提交。这允许您创建一个   单个提交在当前分支之上,其效果与之相同   合并另一个分支(或者章鱼的情况下更多)。

答案 2 :(得分:0)

添加另一个名为RC(发布候选版)的分支。此分支仅包含已完成功能分支的合并。你可以让开发人员一起尝试未完成的分支。您只能集成到包含合并完成功能的主要版本候选版本。

答案 3 :(得分:0)

您可以使用GitHub中的.patch,例如https://github.com/rails/rails/pull/123.patch

git apply 123.patch
# review changes, edit files etc.
git add .
git commit -m "committing #123"

答案 4 :(得分:-1)

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