我有一个功能分支和一个主分支。
Master 分支已经发展,我的意思是让这些更新尽可能少地与 master 分支分开。
所以我在两个分支中都是 git pull
, git checkout feature/branch
,最后是 git rebase master
。
现在在这里,我要么希望一切顺利,要么在继续 rebase 之前需要解决冲突,直到所有主提交都成功地重新应用到功能分支上为止。
现在在我的情况下真正发生的是我不明白的事情:
$>git rebase master
First, rewinding head to replay your work on top of it...
Applying: myFirstCommitDoneOnTheBranch
Applying: myOtherCommitDoneOnTheBranch
$>git status
On branch feature/branch
Your branch and 'origin/feature/feature' have diverged,
and have 27 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean
$>git pull
*load of conflicts*
现在,据我所知, pull 后他有很多冲突;我不明白需要 pull 。从逻辑上讲,它应该在分支时回滚到 master,保存在分支上所做的提交,转发到 master 上的最新提交,然后应用保存的提交。
我不明白
Applying
消息指的是什么:什么是在哪个版本上应用提交? 最佳答案
TL;博士你应该上的master
上衍合feature
之前更新git pull
和git pull --rebase
与feature
和master
。 没有必要做一个 git pull
之后的分支 0x25181921134142 上的 0x25181921134142 之后的分支 0x25181921134142 上有你的 20134134134134134134134134414re243134414re2134142后
根据您当前的工作流程,feature
告诉您的原因是:
是因为你的重建基础master
分公司目前拥有 25 新提交不是来自git status
可达(因为它们从底垫来到feature
)加 2 提交是从origin/feature
到达,但有不同的提交的ID。这些提交包含相同的更改(即它们是补丁等效的),但它们具有不同的 SHA-1 哈希值,因为它们基于 master
中的不同提交,而不是您在本地存储库中重新基于它们的提交。
这是一个例子。让我们假设这是您在 origin/feature
上执行 origin/feature
之前的历史记录:A - B - C (master)
\
D - E (feature)
在 git pull
之后, master
得到提交 git pull
:A - B - C - F (master, origin/master)
\
D - E (feature)
在这一点上,您将 master
重新设置在 F
之上,这适用于 feature
和 master
:A - B - C - F (master, origin/master)
\
D - E (feature)
同时,远程分支 D
仍然基于提交 E
:A - B - C - F (master, origin/master)
\ \
\ D' - E' (feature)
\
D - E (origin/feature)
如果您在origin/feature
做C
,Git会告诉你,你git status
Twig 已从feature
分歧分别 3 (feature
,origin/feature
,F
)和 2 (D'
,E'
)提交。
解决方案是在 0x2518122231343141 和 D
上执行 E
,然后再将 git pull
重新设置为 0x251812223131331313131313133131313131313131313131313131313131331313131331313133131313313131331313131331313131之前。但是,由于您可能在 master
上提交了尚未推送到 feature
的提交,因此您需要执行以下操作:git checkout feature && git pull --rebase
避免在 feature
和本地 master
之间创建 merge 提交。
更新重新定位的后果:
根据 this comment ,我扩展了发散的分支。之所以feature
报道称,重订后origin
和origin/feature
发散是由于重定基带来新提交到feature
,再加上它改写了以前推到git status
在提交的事实。
考虑 pull 之后但 rebase 之前的情况:A - B - C - F (master)
\
D - E (feature, origin/feature)
此时,feature
和 origin/feature
指向同一个提交 feature
——换句话说,它们处于“同步”状态。在 origin/feature
基础上重新设置 feature
之后,历史将如下所示:A - B - C - F (master)
\ \
\ D' - E' (feature)
\
D - E (origin/feature)
如您所见, origin/feature
和 E
已经发生分歧,它们的共同祖先是 commit feature
。这是因为现在master
包含新提交feature
从origin/feature
加C
和feature
(读作“d黄金”和“E黄金”),这是提交F
和应用上的master
顶部D'
。即使它们包含相同的更改,Git 也会认为它们不同,因为它们具有不同的提交 ID。同时, E'
仍然引用 D
和 E
。
在这一点上,您已经改写了历史:您通过重新设置现有提交修改了它们,有效地创建了"new"提交。
现在,如果您要在 F
上运行 origin/feature
,将会发生以下情况:A - B - C - F (master)
\ \
\ D' - E'- M (feature)
\ /
D - E - (origin/feature)
由于 D
执行 E
+ git pull
,这将导致创建 merge 提交 feature
,其父项是 0x2235143141 和 0x2235143143
相反,如果您运行 git pull
(即 git fetch
+ git merge
),那么 Git 将:M
移动到提交 E'
(E
和 0x2518122313439 的共同祖先)23134914314314git pull --rebase
和 git fetch
来自 git rebase
feature
、 C
和 feature
然而,注意到 origin/feature
和 D
包含与 E
和 origin/feature
相同的变化,Git 会像这样丢弃它们,导致历史看起来像这样:A - B - C - F (master)
\
D - E - F' (feature)
^
(origin/feature)
注意提交 F
之前是如何从 D'
到达的,它是如何应用到 E'
之上的,结果是 D'
。此时,E'
会告诉你:
该提交当然是 D
。
关于git pull *after* git rebase?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42861353/