【问题标题】:Git pull --rebase generating a conflict loopgit pull --rebase 生成冲突循环
【发布时间】:2018-10-14 11:21:43
【问题描述】:

我确定我做错了什么,但这就是正在发生的事情。

我的团队有一个 develop 分支,我们从该分支创建feature 分支。

我正在开发一个功能,每次我尝试从开发中提取 --rebase 时都会遇到一堆冲突。

我解决了所有冲突并尝试推送功能。一条消息说我的分支的尖端在功能的后面,我应该从中拉出来。

  hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
    hint: before pushing again.

我从中提取(没有变基)并遇到更多冲突,我解决了。

现在我可以推送功能了。

此时,一切都已同步并且工作正常。但是,如果我从事一些本地工作并尝试 pull --rebase from develop,我会再次遇到大量冲突,包括我已经解决的一些冲突(我确实有 rerere on)。

我在这里搞砸了什么?

【问题讨论】:

  • 如果您可以向我们展示真正的 Git 命令和消息,这将更容易回答。特别是“消息说我的指针落后于功能,我应该从中拉出来”,我认为这是失误。
  • @Schwern 你是对的。用正确的消息更新它

标签: git


【解决方案1】:

我会尝试将命令拼凑起来。

  • git checkout feature
  • git pull --rebase origin develop
  • 修复冲突,完成变基
  • git push

此时你会得到类似的东西。

To github.com:org/repo.git
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to push some refs to 'git@github.com:org/repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

提示错误,这里的git pull 是错误的。 您应该用自己的 git push --force 覆盖上游 feature。这是因为您重写了 feature 分支,并且它与上游分支分歧

以下是更详细的情况。一开始,事情看起来像这样。请注意,上游 origin/feature 和您本地的 feature 处于同一提交状态。

                      [origin/develop]
A - B - C - D - E - F [develop]
            \
             G - H - I [feature]
                       [origin/feature]

git pull --rebase origin develop 并修复所有冲突后,您的存储库看起来像这样。

                    [origin/develop]
                    [develop]
A - B - C - D - E - F - G1 - H1 - I1 [feature]
            \
             G - H - I [origin/feature]

rebase 不会重写提交。它创造了新的,并假装它一直都是这样。现在featureorigin/feature分歧意味着一个不是另一个的祖先。

当你尝试git push 你的feature Git 拒绝。将origin/feature 沿几个提交移动并不是一件简单的事情,称为“快进”。需要合并,出于安全原因,git push 不会这样做。您的作品似乎与其他人的作品分歧push 可能会影响其他人在同一分支上的工作。

这就是为什么git push --force 是必要的。它告诉 Git 无论如何都要这样做,将origin/feature 放在提交I1 处。在git push --force 之后你会得到这个。

                    [origin/develop]
                    [develop]
A - B - C - D - E - F - G1 - H1 - I1 [feature]
            \                        [origin/feature]
             G - H - I

现在一切都好。你的feature 工作就好像它一直在develop 之上。

如果您再次git pull --rebase origin develop,并且develop 上没有新的提交,则不会发生任何事情。如果有新的提交,您只需处理这些。

【讨论】:

  • @TimBiegeleisen 是的,我们都在解释 Git 的工作原理。
【解决方案2】:

当你在另一个分支上变基一个分支时,你通常重写那个分支的历史。结果,正常推送将失败,因为 Git 会认为您的分支与远程分支不同。而不是这样做:

git push origin feature

你应该这样做:

git push --force origin feature

强制推送可能会产生不好的副作用,但是如果你是唯一一个在这个特性分支上工作的人,那么它是可以的。

就图表而言,为了更好地理解这里发生的事情,请考虑以下几点:

develop: ... A -- B
              \
feature:        C

由于您从develop 分支feature,因此您添加了一个新的C 提交。此外,其他人(也许你也是)向develop 添加了B 提交。现在,你将feature 重新设置为develop

develop: ... A -- B
                   \
feature              C'

将新的feature 与重新定位之前的feature 进行比较。你的新C' 提交现在位于一个新的基础之上,B 提交,当你去推送时,Git 会拒绝它。 Git 将看到常见的A 提交祖先,但它不知道如何应用新提交,而不是没有合并,这会破坏 rebase 的点。

【讨论】:

  • 从开发变基时必须再次解决所有冲突怎么办?
  • @Souljacker 不知道你在问什么。一旦你解决了 rebase 中的冲突,你强制 push feature 并且你完成了,没有更多的冲突。
  • 我是这么想的,但是如果我编辑一些东西并尝试从开发中变基,我会再次遇到冲突。不过,我没有尝试使用--force。将尝试并报告
  • 好的,强制推送成功了!有人想,如果我有更多的人在这个分支上工作,这将是解决方案吗?
  • @Souljacker 您可以简单地让其他所有人共享分支获取,然后将他们的分支重置为任何重新定位的版本(请参阅the accpeted answer here)。基本上,他们必须强制更新他们的本地分支机构。或者,他们可以删除本地分支,获取并签出新副本。
猜你喜欢
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2021-11-17
相关资源
最近更新 更多