在git rebase之后,我的本地分支和远程分支发生了分歧

时间:2015-11-19 22:19:40

标签: git git-rebase git-pull

我有一个my-feature分支,它被推送到原点进行代码审查。 不共享。最终它会合并到我的develop分支机构中,在我的团队中共享。我想将我的develop分支重新定义为my-feature以保持历史记录更清晰,然后将我的功能分支合并到develop中。这就是我一直在做的事情:

$ git checkout my-feature
// do some work. make commits.

$ git rebase develop
// fix some conflicts

$ git add .

$ git rebase --continue

成功修改后,我会检查状态:

$ git status
On branch my-feature
Your branch and 'origin/my-feature' have diverged,
and have 155 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

$ git what do I do here?

我必须知道该怎么做。如果我git pull,那么我已经注意到我会遇到一些没有意义的冲突。有人说要强迫推,但我对此感到紧张。 强制将我的主题分支推送到原点是否正常?只要没有其他人使用该分支?

3 个答案:

答案 0 :(得分:8)

首先,你可以在这个阶段做git push --force而不用担心:你说你的分支没有被分享。
因此,在服务器端更改其历史记录不会影响任何其他用户。

其次,当您重新分支某个分支时,您可以使用其远程跟踪分支(origin/xxx)更改其共同祖先

git rebase develop之前,你有

d--d--d (develop)
    \
     x--x--x--x--x--X--y--y--y (my-feature)
                    |
       (origin/my-feature)   

X是原点/功能和功能之间的共同祖先,这只是意味着您在my-feature分支中添加了一些提交。) git状态将返回如下内容:

On branch my-feature
Your branch is ahead of 'origin/my-feature' by 3 commit.

但是当您在develop之上重新定位该分支时,您会在开发my-feature

之上重播所有 HEAD的提交
        X--X--X--X--X--X--Y--Y--Y  (my-feature)
       /
d--D--d (develop)
    \
     x--x--x--x--x--X
                    |
       (origin/my-feature)   

这一次,my-featureorigin/my-feature之间的共同祖先不再是一些添加的提交,而是my-feature的完整历史记录,加上develop的一些提交! (D这里)

因此状态

Your branch and 'origin/my-feature' have diverged,
and have 155 and 1 different commit each, respectively.

由于您的分支机构尚未共享,因此简单的git push --force origin my-feature将完成操作:

        X--X--X--X--X--X--Y--Y--Y  (my-feature, origin/my-feature)
       /
d--D--d (develop)

(如果my-feature有上游分支,git push --force就足够git rev-parse --abbrev-ref --symbolic-full-name @{u}了。 default push policy push.default is set to simplerbind

答案 1 :(得分:2)

您所看到的是my-feature确实与origin/my-feature不同(您上次检查时我的功能在原点上看起来像是什么),因为您刚刚更改了my-feature (当你做了变形时,你正在使用我的功能)。

当您进行改造时,您需要更改分支的历史记录,这样您以后几乎总是需要--force推送。如果它是您的分支并且没有任何合作者使用该分支,那就没关系了。

如果此功能分支确实有合作者,那么您就不应该开始使用。一般的经验法则是不改变共享分支的历史。如果是这种情况,您需要撤消rebase,您可以参考this post获取帮助。

答案 2 :(得分:1)

假设你有以下git-commit-structure:

A--B--C--D--E(origin/my-feature)
 \
  F--G--H--I(someotherbranch)

如果您现在在origin/my-feature上重新someotherbranch,那么您有以下情况:

A--B--C--D--E(origin/my-feature)
 \
  F--G--H--I(someotherbranch)
            \
             B'--C'--D'--E'(my-feature)

这是diverging情况。 my-feature位于origin/my-feature以外的另一个分支上,您无法fast-forward任何一个分支。现在如果origin/my-feature没有被任何人拉过,你可以push -f。但如果有人拉了它,如果那个人继续在那个分支上工作,你可能会遇到问题。检查是否有人将您的错误origin/my-feature弄错了是否已将分支的头部更改为新强制提交。

  

始终遵循以下规则:不要 rebase 任何推送的提交。

糟糕的情况:

              J--K--G(origin/otherperson)
             /
A--B--C--D--E(origin/my-feature)
 \
  F--G--H--I(someotherbranch)
            \
             B'--C'--D'--E'(my-feature)

然后应将其更改为:

A--B--C--D--E(origin/my-feature) (orphaned if push-f)
 \
  F--G--H--I(someotherbranch)
            \
             \               J'--K'--G'(origin/otherperson)
              \             /
               B'--C'--D'--E'(my-feature)
相关问题