在 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-feature
在 origin/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-feature
和origin/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 that 与 git rev-parse --abbrev-ref --symbolic-full-name @{u}
)
我有一个 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-feature
在 origin/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-feature
和origin/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 that 与 git rev-parse --abbrev-ref --symbolic-full-name @{u}
)