2013-02-12 94 views
11

在开发过程中,我经常需要提交和推送“中间”提交,即提交的代码不可编译或者在更改某些内容等时发生。我不想做这样的提交,但是这是为了让我的工作从办公室到家庭继续工作所必需的,有时候让其他开发人员可以让他们开始工作。Git合并时不包含从一个分支到另一个分支的提交

我想我已经找到了这个问题的解决方案:

  1. 我创建一个单独的“开发”分支,让所有中间的提交。

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

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

但这不起作用。当我进行合并时,不仅合并提交包含在master中,而且还包括来自“dev”分支的所有“中间”提交。因此,删除“dev”分支不会产生任何效果,其“中间”提交将保留在那里。

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

回答

16

当你合并你的“开发”分支成主,尽量

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之间的差异。

+0

考虑到他与其他开发人员共享这些提交,是不是一个好主意? – jszakmeister 2013-02-12 09:49:24

+1

+1提及'git rebase -i'。然后人们真的不知道本地开发分支。 – 2013-02-12 14:34:43

+1

@jszakmeister,因为他正在将本地开发分支的更改合并到当地的主人结帐中,所以没关系。当他推动他的改变时,对其他开发者来说,就好像他的改变是一个巨大的提交。换句话说,挤压可以让你有一个承诺说,“添加新功能”,而不是多个“Oops。Fix typo”承诺。 – 2013-02-12 14:44:58

-1

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

+0

请解释您的downvote。 – wRAR 2013-02-12 03:50:35

2

你想要的是一个“西葫芦”合并:

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

0

添加另一个名为RC(分发候选)的分支。该分支只会合并完成的功能分支。你可以让开发者一起尝试未完成的分支。您只能集成到主要发布候选版本,其中不包含任何内容,但合并完成的功能。

相关问题