不包含一个分支中的提交,进行Git合并

17

在开发过程中,我经常需要提交和推送"中间"的提交,即代码不能编译或正在更改的提交等。我不想这样做,但这对于轻松地从办公室继续我的工作到家里,有时是为其他开发人员获取他们可以开始工作的基础是必需的。

我认为我已经找到了解决这个问题的方法:

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

  2. 一旦代码处于良好状态,就将其合并到主分支。因此,主分支将不包含"中间"提交,而只包含“正常”的提交。

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

但是这行不通。当我进行合并时,主分支不仅包括合并提交,还包括“dev”分支中的所有“中间”提交。因此删除“dev”分支没有任何效果,它的“中间”提交仍然在那里。

因此问题是:是否可能以一种方式进行合并,使得主分支仅包括自己的提交+合并提交,而不包括第二个分支的提交?如果不可能,您能否建议我如何实现我的目标-具有临时保存中间结果的能力,但也可以轻松地稍后删除它们?

5个回答

24
当您将“dev”分支合并到主分支时,请尝试执行以下操作。
git checkout master
git merge --squash dev
git commit -m "Add new feature."

--squash选项将把所有中间更改压缩成一个大更改。

如果您需要更精细的控制(例如重新排序提交和执行多个小压缩),也可以使用git rebase --interactive此答案解释了git merge --squashgit rebase --interactive之间的区别。


鉴于他要与其他开发人员共享这些提交,挤压是一个好主意吗? - John Szakmeister
1
如果提到 git rebase -i,那么人们就真的不会知道本地开发分支了。 - Mike Monkiewicz
2
@jszakmeister,由于他正在将本地开发分支的更改合并到主分支的本地检出中,这是可以的。当他推送他的更改时,对其他开发人员来说,它们会看起来像是一个巨大的提交。换句话说,压缩允许您只有一个提交,而不是多个“糟糕。修复拼写错误。”的提交。 - Garrett Hyde
他有点自相矛盾。在开头的段落中,他说:“我不想进行这样的提交,但这是为了方便我从办公室到家继续我的工作,有时还能为其他开发人员提供基础,让他们开始他们的工作……” 我理解后半部分的意思是他可能会分享这个中间状态,但仍然想稍后修复它。 - John Szakmeister
@jszakmeister,是的,有时我会分享中间状态,但一旦我知道我和其他开发人员都不再需要这些提交,我就会删除它们。 - Aleksey Shubin

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提交命令创建合并提交。这允许您在当前分支之上创建一个单独的提交,其效果与合并另一个分支(或更多分支,如果是章鱼合并)相同。

0

添加一个名为RC(发布候选)的分支。该分支仅包含已完成功能分支的合并。您可以保留dev以尝试未完成的分支。您只需要将合并完成的功能集成到主要的发布候选版本中。


0

-1

在合并期间,您无法删除提交。您可以压缩中间提交,但这是一个不好的想法,因为您可能会发布它们,而这种方法可能不适用于您。您还可以将它们压缩到主分支中,而不进行合并(git merge --squash,然后是 git commit),然后将主分支合并到开发分支。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接