以下是用例
然后我从开发部门撤出 我进行了一些代码更改,然后按下
几天后,我又回到了git状态,这表明我比master分支提前1次提交,显然我已经好几天没有从master撤回了
现在,在进行更改之前,我决定使用rebase进行git pull,git pull --rebase原始主机
问题是:我在本地repo分支中提交的提交会在master之上,还是因为我已经推送了它,所以我只会到达全局master / remote分支的顶端?
我对重新定级的概念是陌生的,所以请帮忙解释一下。
答案 0 :(得分:1)
让我们考虑以下问题。
D---E---F origin/master
/
A---B---C---X master
^
origin/master in your repository
几天前,您的本地主服务器和原始服务器/主服务器都处于同步状态,并且分别具有提交A
,B
和C
。在某个时候,您在本地主服务器中提交了X
。同时,其他人将D
,E
和F
的提交推送到源/主服务器。
在这一点上,如果您运行git pull --rebase origin master
,将按原样从原始服务器/主机中提取所有提交,并且提交X
将在F
上方重放,并提供新的提交ID将生成X'
。
新的提交图将如下所示:
origin/master
/
A---B---C---D---E---F---X' master
^
origin/master in your repository
所以,是的,旧的提交X
将在本地主目录的顶部重新设置为提交X'
。
编辑:
在这个用例中的问题是,如果我先推X然后再做D,E,F,那现在我用rebase执行拉时,我的本地分支看起来又如何呢?
在这种情况下,在推送提交X之后,本地存储库和原始服务器/主服务器将保持同步。
origin/master
/
A---B---C---X master
^
origin/master in your repository
几天后,其他人将提交D
,E
和F
推送到原始主机。提交图将如下所示:
D---E---F origin/master
/
A---B---C---X master
^
origin/master in your repository
现在,如果您运行git pull --rebase origin master
,它将为git pull origin master
命令提供相同的结果,因为没有任何可作为基础的内容。您在原始/母版之前没有任何提交。在此命令的结尾,您的图形将如下所示:
origin/master
/
A---B---C---X---D---E---F master
^
origin/master in your repository
由于您的提交X
已经在原始服务器/主服务器中,因此不会在D
,E
和F
的顶部重放。
答案 1 :(得分:0)
问题是:我在本地repo分支中提交的提交会在master之上,还是因为我已经推送了它,所以我只会到达全局master / remote分支的顶端?
如果用“全局”表示“远程”,那么是的,您的本地分支将基于origin/master
重新建立。请参阅下面的详细说明。
根据您的问题,您的存储库开始看起来像这样:
o---o--------------o
^ ^
master development
origin/master origin/development
您的本地master
分支与远程origin/master
分支同步;另外,您有一个本地development
分支,其中有1次提交,您将该分支推送到了远程存储库,从而创建了origin/development
。
现在,假设您当前的分支是development
(如果您运行)
git pull --rebase origin master
Git将从origin
远程获取任何新对象,并更新您的远程跟踪分支origin/master
:
origin/master
⌄
o---o---o
/
o---o--------------o
^ ^
master development
origin/development
然后,它将在更新后的development
分支之上重置您当前的分支(在这种情况下为origin/master
):
origin/master development
⌄ ⌄
o---o---o--------------o'
/
o---o--------------o
^ ^
master origin/development
请注意,您的本地master
分支仍指向以前的提交,这是因为git pull
的第二部分(合并或变基)始终在当前分支< / em>,对于您的情况是development
。
现在,如果在完成拉操作之后要推送本地development
分支,则将更新origin/development
远程跟踪分支以指向重新提交:
origin/development
origin/master development
⌄ ⌄
o---o---o--------------o'
/
o---o
^
master
同样,您的本地master
会一直保持不变,直到您这样做:
git checkout master && git merge origin/master
git pull
命令是一门复杂的野兽,因为它会根据调用时所处的分支以及传递给它的参数而做不同的事情。
文档the form with three arguments的内容如下:
将远程分支合并到当前分支中:
$ git pull origin next
这会在
FETCH_HEAD
中暂时保留next的副本,并更新远程跟踪分支origin/next
。
我还建议阅读this answer,以详细了解git pull
在不同情况下的行为。