git pull origin master
将数据从远程服务器提取到本地的origin / master。然后它将origin / master与master分支合并。
git push如何在这种情况下工作?它是否首先更新origin / master中的commit ref,然后将origin和origin中的ref对象一起发送回远程?
答案 0 :(得分:0)
答案 1 :(得分:0)
TL; DR版本:不,这是另一个订单。下面的完整答案很长。
首先,一些小调:
git pull origin master
将数据从远程服务器提取到本地的origin / master。然后它将origin / master与master分支合并。
在一些技术方面,这有点不对劲。由于你的问题是关于参考更新,这些可能很重要,所以让我们简要介绍一下。
pull
脚本首先运行fetch
,然后按照指示运行merge
或rebase
。
fetch
步骤首先打开为origin
列出的网址,从远程检索ref-names和SHA-1配对,并带来所需的所有对象对于名称为master
的SHA-1。也就是说,如果遥控器显示refs/heads/master
为1234...feed
并且您的本地git没有1234...feed
,则会将1234...feed
添加到您的本地存储库。然后你的git可以检查1234...feed
的父ID和树;如果缺少那些,它也可以带来那些。这重复(通常是优化的:使用智能协议,比如git://或ssh://,有一个传递,他们的git只是遍历提交图和树给你的git SHA-1),直到你的git和他们的git达到一些共享SHA-1,你的git停止需要它们的对象。
更新的起始点信息(在这种情况下,您的git带来了master
1234...feed
的{{1}})存储在FETCH_HEAD
中的.git
文件中}目录。
在较新版本的git(1.8.4左右)中,您的本地git然后也更新其自己的origin/master
本地副本。在旧版本的git中,此更新被省略。显然,如果你有一个老年人,这很重要。
最后,使用FETCH_HEAD
中的信息而不是origin/master
进行合并(或rebase)。如果你的git相当老,那么这些可能会有所不同。 (也许有一天,整个FETCH_HEAD
事情可能会消失,但可能还没有很长时间。)
git push如何在这种情况下工作?它是否首先更新origin / master中的commit ref,然后将origin和origin中的ref对象一起发送回远程?
我们在此注意push
与fetch
相对应,而不是pull
。它仍然不是很对称,但它更接近:pull
是fetch
- 然后 - merge/rebase
,而push
从不做任何合并或变基。
与fetch
一样,push
首先通过互联网调用名为origin
的远程列表中列出的网址(如果有的话,则为“pushurl”,否则为普通网址) 。然而,它的对话略有不同:它首先发送(而不是检索)一些SHA-1和一些引用名称。和以前一样,两个gits然后必须交谈才能找到常见的SHA-1,这样你的git就只能发送你没有的提交对象,树和blob。
一旦提交(和任何其他对象)在远程,远程然后运行任何git挂钩以查看是否允许更新。如果没有git hook,则默认的非--force
“允许更新”测试分支名称 - 例如,您的git通过cafe...dada
发送refs/heads/master
的情况,例如 - 只是“将根据要求调整该参考是一个快进操作”。
如果遥控器允许更新,它会进行更新并告诉你的git“我做了”。如果没有,它会拒绝更新并告诉您的git“我拒绝此更新<填写空白原因>”。
如果您的git发现他们的git接受了更新,那就是您的git更新自己的origin/master
。