我创建了一个开发分支,它有一些无用的提交。现在我想将提交合并到主线分支。我想要在 origin/master 分支中的唯一提交是最新的提交和另一个将第一个提交压缩到第二个最新提交的提交。
编辑:对不起,如果这不清楚,让我试着让它更清楚。假设我在 dev 分支中有 5 个提交。我想将 dev 分支中所做的所有更改合并到 origin/master 分支。问题是我想将提交 #1-4 压缩为一个提交并将该提交和提交 #5 合并到 origin/master 分支。
我创建了一个开发分支,它有一些无用的提交。现在我想将提交合并到主线分支。我想要在 origin/master 分支中的唯一提交是最新的提交和另一个将第一个提交压缩到第二个最新提交的提交。
编辑:对不起,如果这不清楚,让我试着让它更清楚。假设我在 dev 分支中有 5 个提交。我想将 dev 分支中所做的所有更改合并到 origin/master 分支。问题是我想将提交 #1-4 压缩为一个提交并将该提交和提交 #5 合并到 origin/master 分支。
根据该分支上的提交数量,尤其是那些您想要摆脱的“无用”提交,您可以执行交互式 rebase 以摆脱那些您不想要的提交,或者您可以简单地挑选您想要的两个实际上想保留:
# 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
之后,您将这两个提交干净地放在上面,master
您可以使用软重置或交互式 rebase 来压缩它们。
问题是我想将提交 #1-4 压缩为一个提交并将该提交和提交 #5 合并到 origin/master 分支。
这实际上是交互式变基的完美用例。
从 dev 分支开始并运行git rebase -i dev~5
以启动编辑器,其中包含最后 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