合并/其他提交交错后的交互式变基

Posted

技术标签:

【中文标题】合并/其他提交交错后的交互式变基【英文标题】:Interactive rebase after merging/other commits interleaving mine 【发布时间】:2015-12-25 21:13:33 【问题描述】:

我典型的 git 工作流程是从我们的 master 分支创建一个功能分支,进行少量提交,同时定期从 master 合并以跟上。

然后我在 github 上打开一个拉取请求,当它被接受时,我将删除分支。我想以交互方式进行更多的变基,但是当我这样做时,我会遇到合并提交和其他人的提交与我自己的交错。我不确定如何/是否可以单独压缩这些提交或分组/压缩我的提交?

例如,我的分支的 git 日志在 rebase 时可能如下所示:

merge commit
someone else's commit
one of my commits
another one of my commits
another merge commit
another person's commit
one of my commits, the first one after branching

在进行交互式 rebase 以及压缩和重新排序提交时,我无法确定什么是可能的,什么是不可能的。鉴于上述工作流程,您会推荐什么?

【问题讨论】:

你使用rebase有什么原因吗? @ilj 其他团队成员喜欢尽可能保持干净的历史记录,因此保持提交历史记录合理。我个人不介意一段相当闲聊的历史(并非完全不合时宜) 【参考方案1】:

我们在我的办公室使用的过程是在合并您的拉取请求之前重新定位到 master 分支(或您希望合并到的任何分支)。这可确保您的提交优先于当前位于 master 中的所有其他提交,从而消除了您的提交与其他提交的交错:

> git fetch upstream master
> git rebase upstream/master

【讨论】:

我明白了,谢谢。所以我定期从 master 变基,而不是合并它。【参考方案2】:

我不确定如何/是否可以单独压缩这些提交或分组/压缩我的提交?

只压缩你的提交而不是其他人!

最近,我遇到了同样的问题,我的拉取请求有 41 次提交,我的分支有合并冲突,我的拉取请求已经过时。我不得不处理你现在面临的一些问题。我只会碰一些我已经实现的东西。

one of my commits
another one of my commits
one of my commits, the first one after branching

我建议只压缩你的提交(如果你愿意,可以全部压缩)。

例如,如果您有 3 个提交,您可以使用交互式 rebase 将它们压缩并合并为一个。请参阅以下命令:

$ git rebase -i HEAD~n

例如,您想要压缩 3 个提交:

$ git rebase -i HEAD~3

现在,您会看到一个交互式 rebase 界面,您可以在其中编写 reword/pick 在第一次提交和其余部分压缩。请观看此视频以更好地理解。

Squashing commits

merge commit
someone else's commit
another merge commit
another person's commit 

变基到其他(其他人)提交

这是大家在使用 git 时都会遇到的常见问题。想象一下,您正在处理本地存储库。工作一段时间后,你做了一些提交,现在你想将它们推送到原始远程存储库。酷,你做了这个git pushmerge commit 问题。

您知道其他人可能也提交了同一个远程仓库,该仓库现已更新。由于您的本地存储库未更新为远程存储库,因此有merge commit problem。 现在如果我们解决这个问题呢?我们可以将本地机器的存储库更新为您原来的远程存储库吗?有可能吗?

是的,有可能,你可以通过变基来做到这一点。怎么样?

当你这样做时:

git pull --rebase

这里发生了什么? Git 会回退(撤销)你所有的本地提交,拉下远程提交,然后在新拉的远程提交之上重放你的本地提交。如果出现任何 git 无法处理的冲突,您将有机会手动合并提交,然后只需运行 git rebase --continue 即可继续重播本地提交。

查看blog post了解更多详情

如果你想将你的分支合并到master?

Best (and safest) way to merge a git branch into master

【讨论】:

以上是关于合并/其他提交交错后的交互式变基的主要内容,如果未能解决你的问题,请参考以下文章

Excel 文件阻止我在 IntelliJ Idea 中进行交互式变基

使用 git 和 meld 进行交互式变基的 3 路合并中的三个文件是啥?

如何修复“损坏的”交互式变基?

git 交互式 rebase squash 进入下一个提交

git 交互式变基 - 编辑与中断

删除选择提交并合并或变基并添加重要提交