从master合并后的Squash功能分支提交

Nei*_*eil 9 git version-control merge rebase pull-request

我试图在一个分支中压缩提交,当它最终合并到主服务器(在拉取请求后如果被批准)提交历史看起来很干净.在提出拉取请求之前我做了一个

git rebase -i
Run Code Online (Sandbox Code Playgroud)

并重写历史.

然而,当在其分支中开发该特征时,我必须将主内容合并到分支上,因为由于其他特征分支被合并,主人通常会向前移动.

我看到我合并master到feature分支我不能压缩他使用交互式rebase再提交.它在拉取请求期间导致异常差异,即作为来自主合并的合并的一部分而发生的变化.

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

pok*_*oke 10

如果你只是想要sqaush所有东西,那么你有一种更简单的方法来做到这一点,而不依赖于使用交互式变基.您只需对主分支进行软重置,然后提交这些更改:

git reset --soft master
git commit -m 'All changes from my branch squashed'
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案很棒。我曾经查看 git 日志并找到我不想包含在我的壁球中的最后一件事的提交哈希,然后对该提交进行软重置。即使您已将其他分支合并到您的分支中并且 git 日志很乱,此解决方案也正是我想要的。我的同事曾经做过交互式 rebase,在我告诉他这个方法之后,他也打算转换。效果很好。谢谢! (3认同)
  • @Him这个解决方案没有考虑master上尚未合并到您的分支中的任何更改。软重置到 master 后,您的工作目录中将具有与之前相同的内容,并且您会将增量提交到 master。基本上,您可以使用“git diff master”提交您看到的所有内容。如果您不想恢复 master 上的新提交,则应首先暂时将这些更改合并到您的分支中,然后进行软重置。 (2认同)

Mar*_*Liu 6

如果您希望功能分支位于主分支的顶部,以便您的拉取请求包含来自合并的其他功能分支的更改。您可以使用以下命令:

git checkout feature
git pull origin master --rebase
Run Code Online (Sandbox Code Playgroud)

从原始 master 获取后,这将在 master 分支的顶部重新设置功能分支。


Saj*_*han 2

我试图将分支中的提交压缩为最终合并到主分支时(如果已批准拉取请求后),提交历史记录看起来很干净

您可以使用它soft reset来压缩您的分支(例如feature)提交。假设您在分支中有 5 个提交feature。现在您需要 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  
Run Code Online (Sandbox Code Playgroud)

现在,拉取主分支更改。

$ git pull origin master
Run Code Online (Sandbox Code Playgroud)

现在使用 GitHub GUI(浏览器)创建 Pull 请求。

  • 这不要求你的本地提交是最后 4 次吗?如果你定期与 master 合并,情况就不太可能了。 (4认同)