我有一个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
,那么我已经注意到我会遇到一些没有意义的冲突。有人说要强迫推,但我对此感到紧张。 强制将我的主题分支推送到原点是否正常?只要没有其他人使用该分支?
答案 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-feature
和origin/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 simple
与rbind
)
答案 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)