由于不相关的上游文件更改而无法进行git push

时间:2018-10-18 04:46:52

标签: git github version-control gitlab

我们有一个中央存储库,其中有10多个开发人员。

我正在帮助我的好友(他的OOO)将其PR合并到master中。由于另一个PR首先被合并,因此他的PR现在存在合并冲突。我要做的就是检出他的分支,以当前的master为基础,解决所有冲突,将git push提交到他的远程功能分支,并更新PR,并合并它。

就是这么简单,让我发疯的是:每当我解决所有冲突之后,打git rebase --continue,然后我做git push,这给了我这个错误:

On branch this_is_cool_branch
Your branch and 'origin/this_is_cool_branch' have diverged,
and have 2698 and 2 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

我按照git pull的指示进行操作,然后提取了大量与我的更改/冲突无关的更改,这些更改实际上是其他团队的更改。然后它要求我

Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

我绝对不知道为什么会这样,请帮忙。

这是我的步骤:

  1. git clone master_branch
  2. git checkout this_is_cool_branchthis_is_cool_branch是我的好友在远程的分支)
  3. git rebase master
  4. 手动解决所有冲突
  5. git rebase --continue
  6. git status(令人讨厌的是,它给了我下面的错误)

    在分支上this_is_cool_branch 您的分支机构和“ origin / this_is_cool_branch”已分歧, 并分别具有2698和2个不同的提交。   (使用“ git pull”将远程分支合并到您的分支中)

    什么也没提交,工作树很干净

  7. git pull,发生了上述噩梦。大量无关的变更被拉进来,并要求我解决合并冲突。

我错过了哪一步?我用错了哪个git命令?

1 个答案:

答案 0 :(得分:2)

这是默认git提示与您所用的相反的少数情况之一。与git中的所有其他内容一样,它与您希望操作结束时的历史记录图一样。

简而言之,您需要在改组结束时执行git push --force,而不是git pull

这是为什么:

                 master
                    |
                    v
A -- B -- C -- D -- E
      \
       F -- G -- H
                 ^
                 |
    coolbranch, origin/coolbranch

在重新设置基准之前,您的历史记录如下所示。 A-E是主节点,由于拉动请求冲突,因此从B开始与您的分支不同。重新设置后,会发生以下情况:

                 master
                    |
                    v
A -- B -- C -- D -- E -- F' -- G' -- H'
      \                              ^
       F -- G -- H                   |
                 ^              coolbranch
                 |
        origin/coolbranch

如您所见,直接将本地coolbranch推送到服务器上的版本不再有意义。相反,您想告诉服务器接受您的重新提交的内容F'-H',并将coolbranch的分支标签移至H'。这正是push --force(或简称为-f)的作用。

如果您尝试在重新设置基准之后但在git pull之前执行git push -f,则将尝试将H合并到H'中,这将基本上撤消所有重新确定基准的更改

所以最后的过程应该是这样的:

  1. git checkout master
  2. git pull现在您有了新合并的PR
  3. git checkout coolbranch
  4. git pull coolbranch或您用来将本地coolbranch与好友的工作同步的任何方法。
  5. git rebase master
  6. 解决冲突,直到完成。
  7. 可选的git status。您显示的输出正确无误,并有望为您提供BHorigin/coolbranch之间的提交次数,以及新重新调整后的{{ 1}}。如果在这种情况下数字看起来很合理(例如,在冲突的PR中它们之间的提交次数不同),那么您的重新定位可能很好。
  8. B

之后,您应该准备提交无冲突的请求。每当H'从您身下变身时,只需重复这些步骤即可。