将Git分支的差异合并为一个新提交

19
假设我有一个名为“master”的主分支。我创建了一个名为“new-feature”的分支。在这个分支上,我做了大量的提交,所以我可以回到过去,但是因为在开发功能时来回切换,所以提交记录非常混乱。
例如,如果我要查看git diff master..new-feature。
如果我想在'master'上创建一个新的、包含两个分支之间所有更改的提交,最有效的方法是什么?
5个回答

40
git checkout master
git merge --squash new-feature
git commit
提交信息将开始显示被合并/压缩的所有提交记录列表,但您可以编辑它以便符合您的需求。

提交信息将开始显示被合并/压缩的所有提交记录列表,但您可以编辑它以便符合您的需求。


9

git apply... 有趣 :) 很好知道! - hhh

1
你可以使用交互式变基来实现这一点:git rebase --interactive。然后只需使用压缩选项。它仅使用提交的更新,但不创建提交。

这似乎需要大量的搜索替换,将pick替换为squash,或者我漏掉了什么? - hhh
另外,如果在过程中出现合并冲突,您将不得不再次执行所有操作,或者使用像git rerere这样的工具,但这并非普通人可以轻松掌握的。 - Peter V. Mørch

1
使用git rebase --interactive HEAD~(需要压缩的提交次数)。例如,git rebase --interactive HEAD~5。这将加载你最近的5个提交,并在编辑器中显示消息。每个消息开头都有“pick”。到达最后一个消息时,将“pick”更改为“squash”,然后退出。一个新窗口将打开并要求输入提交消息。这将成为合并提交的新提交消息。退出即可将所有提交压缩为一个新提交。
这里有一个例子:https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one

似乎这可能会带来一些问题,因为我是一个团队的一员,并且需要定期从其他团队成员那里拉取更改。还有,我宁愿不计算 :) - hhh
如果你正在开发一个新功能分支,我假设你是独自在那个分支上工作。如果不是的话,你和其他人可能会有自己的分支。如果别人已经拉取了你的代码,使用rebase通常是一个坏主意,因为它会导致问题,原因是你正在重写历史记录。 - Nick Mitchinson
那么 ~5 不会计算我拉取的主分支提交,只要我是唯一在该分支上提交的人?'5' 是指该分支中最后的五个独特提交,还是总共的最后五个提交? - hhh
我相信这将是你所在分支日志中的最后5条记录。因此,如果你有一个仅仅是“从主干合并”的提交,那也会被包含在内。我建议你跟着我发送的文章一起阅读,因为它可能比我更好地解释了这个问题。 - Nick Mitchinson

0

你可以将你的所有功能分支提交,然后合并到主分支,并接受所有更改的“theirs”版本。

这里有一个Stack Overflow问题,其中包含一个非常好的答案,告诉你如何做到这一点: 是否有“git merge -s ours”的“theirs”版本?


这会导致只有一个提交代表该特性分支吗? - hhh
如果您首先在特性分支上进行变基(就像William在上面所说的那样),那么它会生效,尽管这可能不可取。源代码控制的一个很好的方面是拥有您到达当前状态的历史记录。虽然我想这可能是个人偏好的问题!更多关于交互式变基的信息在此处 - Billy Lazzaro
是的,我也想要历史记录,但是不同的人有不同的想法 :) - hhh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接