从主分支合并后压缩功能分支提交

17

我试图在一个分支中压缩提交,以便在它最终合并到主分支(在拉取请求获得批准后)时,提交历史记录看起来干净。因此,在发起拉取请求之前,我会执行以下操作:

git rebase -i

并重写历史。

然而,在开发功能分支时,我不得不将主分支的内容合并到该分支中,因为主分支通常会因为其他功能分支的合并而前进。

我发现一旦我将主分支合并到功能分支中,就无法再使用交互式变基来压缩提交。这会导致拉取请求期间出现异常差异,即从主分支合并而来的更改。

在这种情况下,最好的方法是压缩提交?

3个回答

33

如果你只想压缩所有内容,那么你有一种更简单的方法来完成,而不需要依赖交互式变基。你可以对主分支执行软重置,然后提交这些更改:

git reset --soft master
git commit -m 'All changes from my branch squashed'

这基本上将分支指针重置为master分支,而不更改工作目录中的任何内容。因此,结果是您在索引中拥有所有这些更改,然后可以一次性提交。


4
这个答案很棒。我过去总是查看Git日志,找到我不想合并的最后一次提交哈希值,然后对该提交进行软重置。即使你将其他分支合并到你的分支中,并且Git日志很混乱,这种解决方案也能够得到我想要的结果。我的同事过去总是使用交互式变基方法,但在我告诉他这种方法后,他也打算转换使用。效果非常好。谢谢! - Nathan Loyer
这个操作是否也会将主分支上最新的更改合并到你的压缩提交中?也就是说,如果我的分支是"my_commit1 -> my_commit2",而与主分支合并后会变成"my_commit1 -> your_commit -> my_commit2",那么最终的结果是"all_three_commits_in_one"还是"your_commit -> all_of_my_commits"? - undefined
2
@Him 这个解决方案没有考虑到主分支上尚未合并到你的分支的任何更改。在软重置到主分支之后,你的工作目录中将会有与之前相同的内容,并且你将提交这些差异到主分支。基本上,你会提交git diff master所看到的所有内容。如果主分支上有一个你不想还原的新提交,你应该先将这些更改暂时合并到你的分支,然后再进行软重置。 - undefined

8
如果您想让特性分支位于主分支的顶部,以便您的拉取请求包含来自其他特性分支合并的更改。您可以使用以下命令:
git checkout feature
git pull origin master --rebase

这将在从远程主分支获取后,将功能分支变基于主分支顶部。

2
我正在尝试压缩分支中的提交,以便在最终合并到主分支之前(经过批准的拉取请求后)提交历史记录看起来干净整洁。
您可以使用“软重置”来压缩分支(例如,“feature”)。假设您在“feature”分支上有5个提交。现在您需要5个提交= 1个新提交。
$ git checkout feature
$ git log              # see how many commits do you need to squash

$ git reset --soft HEAD~4  # note: if you have N commits then HEAD~{N-1}
Or, git reset --soft <first-commit> # reset to first commit of your branch

$ git add .               # add the files  
$ git commit --amend -m 'Squash all commits' # squash all the commits

$ git push -f origin feature  # force(-f) push to remote since git history is changed  

现在,请拉取主分支的更改。
$ git pull origin master

现在可以使用GitHub GUI(浏览器)创建拉取请求。

4
这是否意味着您的本地提交必须是最后4个?如果您定期与主分支合并,那么这很可能不是这种情况。 - Tim N
“--amend” 是必要的吗?它在这里有什么作用? - BoltzmannBrain
1
--amend 是将当前本地更改与上一个提交(第一次提交)合并。实际上,Git 会采取:最后一次提交 + 当前本地更改 = 生成全新的提交(提交哈希/引用已更改)!@BoltzmannBrain - Sajib Khan

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