FeatureA
的功能分支,它与基于它的(远程)development
不同步。通常情况下,我会通过调用git rebase development
(自然地将我的本地开发与origin/development
同步后)来变基我的分支。今天,我做了不同的事情,从我的功能分支中调用
git pull --rebase origin development
。那么,这有什么区别呢?FeatureA
的功能分支,它与基于它的(远程)development
不同步。通常情况下,我会通过调用git rebase development
(自然地将我的本地开发与origin/development
同步后)来变基我的分支。git pull --rebase origin development
。那么,这有什么区别呢?git pull --rebase origin development
是以下命令的快捷方式:
git fetch origin development
git rebase origin/development
即,获取 origin/development
分支,然后在当前分支之上进行变基。
更新
正如@torek所指出的:
是的,除了在 Git 1.8.3 或更早版本中,fetch 的两个参数版本不会更新 origin/development 分支。(变基结果相同,但 origin/development 不会移动。)
简述:如果rebase顺利完成,它就能正常工作。如果没有,它仍然能够正常工作,只是在图形化查看器中可能会有些混淆。
一如既往,git pull
基本上是执行git fetch
,然后……在这种情况下,使用的是git rebase
而不是git merge
。所以:
origin
获取development
分支获取,并将其放入FETCH_HEAD
git rebase
而非git merge <commit-ID-from-FETCH_HEAD>
假设您的本地树中的提交图表如下(我们将假设您在某个时候运行了git fetch
以更新origin/development
与他们的提交E
和F
):
C - D <-- FeatureA
/
A - B <-- development
\
E - F <-- origin/development
假设在origin
上,他们的分支development
现在有一个更多的提交。执行从origin
获取的步骤将会捡起它并且使得FETCH_HEAD
指向它,所以我们把它画成节点G
:
而且,假设在origin
上,他们的分支development
现在有一个更多的提交。执行从origin
获取的步骤将会捡起它并且使得FETCH_HEAD
指向它,所以我们把它画成节点G
:
C - D <-- FeatureA
/
A - B <-- development
\
E - F <-- origin/development
\
G <-- FETCH_HEAD
如果您的git足够新,1.8.4或更高版本,则此时也会更新origin/development
,指向节点G
。如果不是这样,则您本地存储的他们的development
在origin/development
中落后。对于rebase来说这并不重要,它只会改变您在git log --graph
视图或图形提交树查看器中查看结果的方式。
现在,rebase将按照常规方法复制您FeatureA
的提交,并使FeatureA
指向这些副本,放弃原始提交。我们将重新命名这些提交为C'
和D'
:
C - D [abandoned]
/
A - B <-- development
\
E - F <-- origin/development
\
G <-- FETCH_HEAD
\
C' - D' <-- FeatureA
如果你此时运行一个普通的git fetch
,或者你拥有足够新的git版本使得origin/development
已经移动;并且如果我们删除“abandoned”部分并简化绘图,它会变成:
A - B <-- development
\
E - F - G <-- origin/development
\
C' - D' <-- FeatureA
如果你将本地分支标签development
快进合并到匹配的origin/development
,那么绘图会更简单(从B向下拉动曲线到E,并将development
和origin/development
放置在指向G
的箭头右侧)。
fetch
的两个参数版本不会更新origin/development
。(变基结果相同,但origin/development
不会移动。) - torek