git如何在遥控器/原点的上下文中工作?

时间:2015-08-24 20:47:24

标签: git

git pull origin master将数据从远程服务器提取到本地的origin / master。然后它将origin / master与master分支合并。

git push如何在这种情况下工作?它是否首先更新origin / master中的commit ref,然后将origin和origin中的ref对象一起发送回远程?

2 个答案:

答案 0 :(得分:0)

这应该回答你的问题。

git push

  

使用本地引用更新远程引用,同时发送必要的对象   完成给定的参考。

来自the git docs

答案 1 :(得分:0)

TL; DR版本:不,这是另一个订单。下面的完整答案很长。

首先,一些小调:

  

git pull origin master将数据从远程服务器提取到本地的origin / master。然后它将origin / master与master分支合并。

在一些技术方面,这有点不对劲。由于你的问题是关于参考更新,这些可能很重要,所以让我们简要介绍一下。

pull脚本首先运行fetch,然后按照指示运行mergerebase

fetch步骤首先打开为origin列出的网址,从远程检索ref-names和SHA-1配对,并带来所需的所有对象对于名称为master的SHA-1。也就是说,如果遥控器显示refs/heads/master1234...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对象一起发送回远程?

我们在此注意pushfetch相对应,而不是pull。它仍然不是很对称,但它更接近:pullfetch - 然后 - 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