所以假设我有一个主分支,我们称之为'master'。我做了一个分支,称为“新功能”。我在这个分支中做了很多提交,所以我可以及时回到过去,但是在开发这个功能时我已经做了很多来回的工作,所以提交日志非常混乱。
例如,如果我要查看 git diff master..new-feature 。
如果我只想在“master”上创建一个新的新提交,其中包括两个分支之间的所有更改,那么最有效的方法是什么?
git checkout master
git merge --squash new-feature
git commit
提交消息将开始显示正在合并/压缩的提交的整个列表,但您当然可以将其编辑为您想要的任何内容。
另一个可能对您更有效的选择是生成一个补丁文件,git diff --patch > "patch filename"
然后使用git apply "patch file name"
.
git-diff 的手册页(尤其是“使用 -p 生成补丁”): http ://www.kernel.org/pub/software/scm/git/docs/git-diff.html
git-apply 的手册页:http: //www.kernel.org/pub/software/scm/git/docs/git-apply.html
您可以为此使用交互式变基:git rebase --interactive
. 然后只需使用壁球选项。它仅使用来自提交的更新,但不创建提交。
使用 git rebase --interactive HEAD~(但是有很多提交想要压缩)。例如,git rebase --interactive HEAD~5。这将加载您最近的 5 次提交并打开一个带有消息的编辑器窗口。每条消息的开头都会有“pick”。转到最后一条消息,将“pick”更改为“squash”并退出。将打开一个新窗口,询问提交消息。这将是 squash 提交的新提交消息。退出,它会将所有的提交压缩成一个新的提交。
这里有一个例子: https ://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one
您可以提交功能分支中的所有内容,然后合并到 master 接受“他们的”所有更改。
这是一个 Stack Overflow 问题,对如何做到这一点有一个很好的答案: 是否有“git merge -s ours”的“他们的”版本?