Git-rebase重复补丁检测实现

Git-rebase重复补丁检测实现,git,rebase,Git,Rebase,我遇到了一个有趣的问题,在这个问题上,我的主人试图赶上一个上游分支。然而,我想在沿途的特定点上测试我的master,所以我确保我只在某些点上向上游重设master 假设以下状态: --F--G--H--> master / / ----A--B--C--D--E--I--J--> upstream 我想先重新设置C和D的基址,然后进行测试。因此,我: $ git checkout upstream $ git checkout

我遇到了一个有趣的问题,在这个问题上,我的主人试图赶上一个上游分支。然而,我想在沿途的特定点上测试我的master,所以我确保我只在某些点上向上游重设master

假设以下状态:

          --F--G--H--> master
         /
        /
----A--B--C--D--E--I--J--> upstream
我想先重新设置C和D的基址,然后进行测试。因此,我:

$ git checkout upstream
$ git checkout D
$ git checkout -b upstreamD
$ git rebase -i master
$ git checkout master
$ git merge upstreamD
这显示了要重新设置基址的C和D。成功重设基础后,我有:

          --F--G--H--C--D--> master
         /
        /
----A--B--C--D--E--I--J--> upstream
             ^
         upstreamD
然后我删除了上游,因为我在测试时不再需要它,等等(因为我总是可以得到它)

我做我的测试,因为一切都很好,我回去抓住我的上游使用一个新创建的远程和把它的主分支上游

所以,现在我想我有一些类似的东西(注意master和上游有更多的提交):

我想重新设置一点基准,因此我执行上面相同的过程:

$ git checkout upstream
$ git checkout J
$ git checkout -b upstreamJ
$ git rebase -i master
然而,现在我要重新设定一些东西,比如:C,E,I,J。奇怪的是,我只希望E,I,J。C已经在master中了(即使在不同的SHA1下,因为历史是不同的)

我引用其中的话:

如果上游分支已经包含您所做的更改(例如。, 因为你发了一个补丁,应用在上游),那么 将跳过提交

我找不到任何地方可以解释git是如何执行这种跳过的。它如何检查C是否已经在master中,为什么它决定C应该重新设置基址而D不应该重新设置基址?

来自:

请注意,任何头部提交都会引入与头部提交相同的文本更改。。省略(即,将跳过上游已接受的具有不同提交消息或时间戳的补丁)

(这似乎是通过
git格式补丁
实现的,特别是
——如果在上游
选项中则忽略。)

这意味着修补程序必须在文本上完全相同(只有修补程序,而不是提交元数据或SHA id等),以便rebase自动跳过它们

在上面的例子中,我怀疑commit C可能有冲突,您必须解决冲突;因此,修补程序会有所不同。若提交D并没有冲突,那个么它在文本上仍然是相同的,所以为什么rebase在不跳过C的情况下跳过了它

在我看来,处理这种情况的最佳方法是使用
--on
选项来
git-rebase
,如下所示:

git rebase --onto master D
其中D是您重定基础的最后一个提交。还有其他方法;交互重定基址和删除已知已存在的提交是其中之一

我认为<代码> Git ReBase<代码>的自动跳过逻辑是一个“最佳努力”;当它起作用时是很好的,但正如你所看到的,当它不起作用时,你必须做好准备

HTH.

来自:

请注意,任何头部提交都会引入与头部提交相同的文本更改。。省略(即,将跳过上游已接受的具有不同提交消息或时间戳的补丁)

(这似乎是通过
git格式补丁
实现的,特别是
——如果在上游
选项中则忽略。)

这意味着修补程序必须在文本上完全相同(只有修补程序,而不是提交元数据或SHA id等),以便rebase自动跳过它们

在上面的例子中,我怀疑commit C可能有冲突,您必须解决冲突;因此,修补程序会有所不同。若提交D并没有冲突,那个么它在文本上仍然是相同的,所以为什么rebase在不跳过C的情况下跳过了它

在我看来,处理这种情况的最佳方法是使用
--on
选项来
git-rebase
,如下所示:

git rebase --onto master D
其中D是您重定基础的最后一个提交。还有其他方法;交互重定基址和删除已知已存在的提交是其中之一

我认为<代码> Git ReBase<代码>的自动跳过逻辑是一个“最佳努力”;当它起作用时是很好的,但正如你所看到的,当它不起作用时,你必须做好准备


HTH.

很好的解释。有道理。谢谢,很好的解释。有道理。谢谢
git rebase --onto master D