Git分支在重基后分叉

Git分支在重基后分叉,git,Git,我已在本地重新设置了一个分支的基础,该分支已被推送 Git表示,我的分支机构和remote存在分歧,并且: 并分别有109次和73次不同的提交 推送我的分支会解决这个问题吗?也就是说,在重新基址之后会出现这种情况吗?当您重新基址分支时,您必须为位于您要重新基址的分支中的提交之上的任何提交重写提交。这是因为提交的属性之一是它的父级(或多个父级)。当您重新设置基址时,您正在更改分支上最早的本地提交的父级,从而更改所有本地提交的提交哈希,因为此更改会在提交过程中以传递方式出现 因为您已经推送了分支,所

我已在本地重新设置了一个分支的基础,该分支已被推送

Git表示,我的分支机构和remote存在分歧,并且:

并分别有109次和73次不同的提交


推送我的分支会解决这个问题吗?也就是说,在重新基址之后会出现这种情况吗?

当您重新基址分支时,您必须为位于您要重新基址的分支中的提交之上的任何提交重写提交。这是因为提交的属性之一是它的父级(或多个父级)。当您重新设置基址时,您正在更改分支上最早的本地提交的父级,从而更改所有本地提交的提交哈希,因为此更改会在提交过程中以传递方式出现


因为您已经推送了分支,所以您应该合并到源分支中,而不是针对它重新调整。可以“强制推送”新分支(使用
-f
标志),但正常推送不起作用,因为分支历史的完整性将受到干扰。如果您在这个分支上与其他人合作,强制推进是一个坏主意,因为当其他合作者的历史突然不匹配时,它会导致他们变得非常困惑


TL;DR-如果您没有合作,请使用push-f推送分支。如果是,请将分支重置为以前的状态,然后合并到源分支中

您的所有提交都更改了ID,因此转移不是真正的分歧

要解决问题必须覆盖远程分支:

git push -f origin experiment

说明:

看看在这幅图中,C3是如何在重基后不作为C3,而是作为C3'放的。这是因为它不完全是C3,但它有其所有的代码更改

在另一张图片上,您可以看到当涉及遥控器时,会看到什么样的重基,以及为什么会出现转移

在任何情况下,在您执行强制推送之后,它会告诉您它执行了(强制更新),此时您应该没事了


签出顶部的链接,并搜索“git push--force”。您将看到一个更详细的解释。

我通过以下操作成功地实现了推送的重基分流:

git checkout mybranch
git pull
git push origin mybranch
拉力解决了分歧

拉前

牵引输出

通过递归进行合并。mypath/myfile.py | 12 +++++++++++-1个文件已更改,11个插入(+),1个删除(-)

后拉

您的分支比“origin/mybranch”提前3次提交

推后

mybranch在分支前3位,仍然有一个打开的拉取请求 添加到提交历史记录的合并消息将远程的mybranch合并到mybranch

我假设这可能是力推的作用,我还没有证实


正如其他人所说,如果您已经有一个开放的拉取请求,那么请避免重基。我提供的这个例子对我来说很有用。

无需用力,通过将目标分支重定为当前本地分支,切换到目标分支,然后将本地分支重定为目标分支,就可以解决这个问题。这不会产生分歧,因为可能丢失的提交已添加,不再需要创建。示例以便于解释:

  • 主要分支是发展
  • 您签出了一个新的分支功能/正在做的事情
  • 团队成员推动一项新的承诺,以发展
  • 如果您还没有更新开发分支,那么“git签出开发”和“git rebase功能/doing_stuff”将正常工作,因为自签出之后没有添加任何提交。但是,如果您已经签出了develope并撤销了新提交,那么如果您由于看到新提交而尝试重新设置基址,您将看到这种差异。无需强行推动的简单修复方法(在团队环境中通常不是一个好主意)是:

  • git签出功能/做事情
  • 吉特再基地开发
  • git签出开发
  • git rebase功能/做事
  • 第2步中的rebase将缺少的提交带到特性/操作中,因此当第4步出现时,它是最新的,不需要为更改创建新的提交


    我知道这是一个可行的解决方案,因为我刚刚遇到了这个问题,并完成了上面的步骤,从而在不强制的情况下成功地推动了开发。我在一个由50多名开发人员组成的团队中工作,因此除了我自己的测试分支之外,禁止强制推送任何东西,因此我必须找到解决方案。

    “既然你已经推送了分支,你应该合并到源分支中”-为什么会这样?@Hamiltonverisimo Jason的第一句话:“当您重新设置分支的基础时,您必须为任何高于要重新设置基础的分支中的提交的提交重写提交。”即使“上面”中捕获的更改“提交具有相同的逻辑内容,它们应用于不同的基,因此是具有不同哈希的不同提交。如果其他开发人员是从预重基分支工作的,那么使用git push-f将极大地破坏他们的工作流程。因此,由于该分支已被推送到公共源,因此他应该已经合并。如果您不确定是否有其他人已经推送了某些内容,您也可以使用push--force with lease。@jason lebrun合并上游更改不是缺点,您可以在没有警告的情况下覆盖自己的工作吗?是否以与重定基址相同的方式检测合并冲突?例如,如果我从分支中的文件中删除了一个节,因为它不再需要,但其他人对上游的同一节做了微小的更改,例如删除了一些空白或一些全局查找/替换操作,在我的分支上合并这个分支会不会取代我的删除,而代之以它们微不足道的更改版本?将另一个分支合并到你的分支上不是一个坏主意吗?E
    Your branch and 'origin/mybranch' have diverged,
    and have 2 and 1 different commit(s) each, respectively.