16

在开发过程中,我经常需要提交和推送“中间”提交,即提交代码不可编译或正在更改某些内容等。我不想进行此类提交,但这对于轻松继续我的工作是必需的从办公室到家,有时让其他开发人员让他们成为他们可以开始工作的基础。

我以为我已经找到了解决该问题的方法:

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

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

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

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

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

4

5 回答 5

24

当您将“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

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

于 2013-02-12T02:28:06.880 回答
0

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

于 2013-02-12T03:47:23.330 回答
0

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

git apply 123.patch
# review changes, edit files etc.
git add .
git commit -m "committing #123"
于 2017-05-24T00:38:50.273 回答
-1

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

于 2013-02-12T02:28:03.993 回答