在 git 变基后我的本地分支和远程分支发生分歧

after git rebase my local branch and remote branch have diverged

我有一个 my-feature 分支被推送到原始代码审查。 未共享。最终它将合并到我的 develop 分支中,该分支 在我的团队中共享 。我想将我的 develop 分支变基为 my-feature 以保持历史更清晰,然后将我的功能分支合并到开发中。这就是我一直在做的事情:

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

$ git rebase develop
// fix some conflicts

$ git add .

$ git rebase --continue

rebase成功后,查看状态:

$ 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,那么我注意到我会遇到一些没有意义的冲突。有人说要用力推,但我对此很紧张。 我的主题分支强制推送到源是否正常?只要没有其他人使用该分支就可以吗?

你看到的是 my-feature 确实不同于 origin/my-feature(你上次检查时我的特征在原点上的样子)因为你刚刚更改了 my-feature (您正在使用的我的功能)当您进行变基时。

当你做一个变基时,你正在改变一个分支的历史,所以你几乎总是需要 --force 之后推送。如果它是您的分支并且没有任何协作者使用该分支,那很好。

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

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

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

如果你现在在 someotherbranch 上变基 origin/my-feature 那么你会遇到以下情况:

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

也就是diverging的情况。 my-featureorigin/my-feature 之外的另一个分支上,您无法 fast-forward 这两个分支中的任何一个。现在,如果 origin/my-feature 没有被任何人拉走,你可以安全地 push -f。但是,如果有人将其撤下,如果该人继续在该分支上工作,您可能会遇到问题。检查任何拉错你的人 origin/my-feature 是否已将分支的负责人更改为你新强制提交。

Always follow the rule: Do not rebase any pushed commit.

糟糕的情况:

              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)

首先,你可以在这个阶段做一个 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 是 origin/feature 和特性之间的共同祖先,这仅仅意味着您在 my-feature 分支中添加了一些提交。
git 状态会 return 类似于:

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

但是,当您在 develop 之上重新设置该分支时,您会在 develop HEAD 之上重播 all my-feature 的提交

        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的完整历史,加上[=20=的一些提交]! (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就够了,前提是default push policy push.default is set to simple.
Check thatgit rev-parse --abbrev-ref --symbolic-full-name @{u})