在开发过程中,我经常需要提交并推送“中间”提交,即提交代码不可编译或更改内容等等。我不想做这样的提交,但这是简单的必需继续我的工作从办公室到家,有时为其他开发人员提供他们可以开始工作的基础。
我以为我找到了解决这个问题的方法:
我创建了一个单独的“dev”分支并进行所有中间提交。
一旦代码处于良好状态,请合并为主。因此,master不会包含“中间”提交,只会包含“正常”提交。
删除所有中间提交的“dev”分支。
但这不起作用。当我进行合并时,不仅包括合并提交到master,还包括来自“dev”分支的所有“中间”提交。所以删除“dev”分支什么都没有,它的“中间”提交就在那里。
所以问题是:是否有可能以master只包含自己的提交+合并提交的方式进行合并,而不包括第二个分支的提交?如果这是不可能的,你能否告诉我如何实现我的目标 - 能够临时保存中间结果,还能在以后无缝删除它们?
答案 0 :(得分:22)
将“dev”分支合并为master时,请尝试
git checkout master
git merge --squash dev
git commit -m "Add new feature."
--squash
选项会将您的所有中间变更压缩为一个重大变化。
如果您需要更多有限控制(例如reordering commits并执行多个小南瓜),您也可以使用git rebase --interactive
。 This answer解释了git merge --squash
和git 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分支。