繁体   English   中英

如何仅合并两个提交并压缩一个提交即可合并到另一个分支?

[英]How to merge to another branch with only two commits and with one commit squashed?

我已经创建了一个开发分支,其中包含一些无用的提交。 现在,我想将提交合并到主线分支。 我在origin / master分支中想要的唯一提交是最新的提交,另一个将第一提交压缩为第二最新提交的提交。

编辑:很抱歉,如果不清楚,所以让我尝试使其更清楚。 假设我在dev分支中有5个commit。 我想将所有在dev分支中所做的更改合并到origin / master分支中。 问题是我想将1-4号提交压缩为一次提交,然后将该提交和5号提交合并到origin / master分支中。

根据该分支上的提交数量,尤其是要删除的那些“无用”提交,您可以进行交互式重新设置以删除不需要的提交,或者可以简单地挑选两个提交实际想保留:

# check out master and update it first
git checkout master
git merge origin/master

# cherry-pick the latest commit from the development branch
git cherry-pick dev-branch

# cherry-pick the other commit (use the hash from the log)
git cherry-pick theothercommitshash

之后,您可以将这两个提交干净地mastermaster之上,并且可以使用软重置或交互式变基来压缩它们。

问题是我想将1-4号提交压缩为一次提交,然后将该提交和5号提交合并到origin / master分支中。

这实际上是交互式重新基准的完美用例。

从dev分支开始,然后运行git rebase -i dev~5以启动编辑器,并为后5次提交提供交互式的git rebase -i dev~5计划。 它看起来应该像这样:

pick <hash1> Commit 1
pick <hash2> Commit 2
pick <hash3> Commit 3
pick <hash4> Commit 4
pick <hash5> Commit 5

将内部的三个pick更改为squash ,如下所示:

pick <hash1> Commit 1
squash <hash2> Commit 2
squash <hash3> Commit 3
squash <hash4> Commit 4
pick <hash5> Commit 5

squash基本上是指“接受提交但将其融合到先前的提交中”。 因此,在这种情况下,将按原样选择提交1,然后将提交2、3和4依次压入其中。 因此,您最终将获得一个包含所有4个提交更改的单个提交。

保存计划并退出编辑器以启动交互式重定基础,并在Git提示您执行此操作时针对已压缩的提交调整提交消息。 最终,您将只在分支上进行两次提交:压缩的提交,并在此基础上重新提交5个提交。

最后,您只需将分支合并到master中就可以了。

如果您不想将临时分支中的所有更改合并到master中,则可以使用git cherry-pick

git checkout master
# Create a new commit in branch master which is equal to the latest
# commit in my_dev_branch
git cherry-pick my_dev_branch

如果要从my_dev_branch挑选两个提交并将其压入master单个提交中,则需要--no-commit

git checkout master
git cherry-pick --no-commit <some-commit>
git cherry-pick --no-commit <another-commit>
# Now that all changes are in index, create a new commit
git commit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM