我们说我有一个名为FeatureA
的功能分支,它与它所基于的(远程)development
不同步。通常我会通过调用git rebase development
来修改我的分支(在用origin/development
自然地同步我的本地开发之后)。
今天,我做的与众不同,而是从我的功能分支中调用git pull --rebase origin development
。现在,有什么区别?
答案 0 :(得分:13)
git pull --rebase origin development
是这些命令的快捷方式:
git fetch origin development
git rebase origin/development
即,获取origin/development
,然后在其上重新定位当前分支。
<强>更新强>
正如@torek所指出的那样:
是的,除了fetch 1.8.3或更早版本中fetch 1.8.3或更早版本的两参数版本没有更新。 (rebase结果是相同的,但原点/开发不会移动。)
答案 1 :(得分:9)
简短版本:如果rebase顺利,它可以正常工作。如果没有,它仍然可以正常工作,它可能在图形查看器中有点混乱。
与往常一样,git pull
基本上是git fetch
,后跟......嗯,在这种情况下,git rebase
而不是git merge
。所以:
origin
development
分支并将其放入FETCH_HEAD
git merge <commit-ID-from-FETCH_HEAD>
git rebase
因此,假设您的本地树中的提交图看起来像这样(我们假设您在某些时候运行了git fetch
,并使用其提交origin/development
和{{更新了E
1}}):
F
并且,让我们进一步假设在 C - D <-- FeatureA
/
A - B <-- development
\
E - F <-- origin/development
上,现在还有一个名为origin
的分支上的提交。 development
- 来自原点的步骤会将其选中并使fetch
指向该值,因此我们将其作为节点FETCH_HEAD
绘制:
G
(如果您的git足够新,1.8.4或更高版本, C - D <-- FeatureA
/
A - B <-- development
\
E - F <-- origin/development
\
G <-- FETCH_HEAD
此时也会更新,指向节点origin/development
。如果不是,则为G
的本地副本存储在development
中的1}}滞后。对于rebase而言,它只会改变你在origin/development
视图或图形提交中看到结果的方式 - 树查看器。)
现在git log --graph
将以常规方法复制您的rebase
提交以进行rebase,并使FeatureA
指向副本,放弃原始提交。我们会打电话给那些有争议的人FeatureA
和C'
:
D'
如果此时运行普通 C - D [abandoned]
/
A - B <-- development
\
E - F <-- origin/development
\
G <-- FETCH_HEAD
\
C' - D' <-- FeatureA
,或者你有更新的git以便git fetch
移动;如果我们删除“废弃”部分并简化绘图,它就变成了:
origin/development
如果您快速合并本地分支标签A - B <-- development
\
E - F - G <-- origin/development
\
C' - D' <-- FeatureA
以匹配development
,则绘制起来更简单(将扭结从B降至E并放置origin/development
以及指向development
)的箭头右侧的origin/development
。