使用以下git命令有什么区别
git pull origin master
git pull origin master:master
一些观察
1)第一个告诉我是否有任何冲突,但另一个简单地说“拒绝-非快进”
2)第二个不会更新我的远程指针,即源/主控,如果它失败
这有点棘手,所以让我们一次处理一下。
git pull 像这样滚动
获取给定参考文献1(在你的例子的第二个参数,这被称为操作的Refspec - “参考规范”的portmaneu)(在您的示例的第一个参数)从给定的遥控器。
如果缺少远程参数,Git会尝试使用branch.<name>.remote本地存储库中的配置变量来获取它,其中<name>是当前签出分支的名称。
如果缺少refspec参数,Git会尝试使用branch.<name>.merge本地存储库中的配置变量来获取它,这<name>意味着与上述相同。
将所有获取的引用合并到当前检出的分支中,因此@ Oznerol256不正确。
现在,让我们解释一下refspec master和master:master何时涉及到git pull…… 的区别。
git pull将refspec直接传递给git fetch,并以以下方式解析refspec:“从远程获取与左侧左侧规格匹配的所有ref,:并可能使用它们来更新本地存储库中由规格指定的匹配ref。在“的右侧:。这里的关键点是,如果:refspec中没有内容,或者它的右边没有任何内容,则由解释为“无更新” git fetch。
现在让我们更深入地研究。根据refspecs的解释规则,裸露的“ master”(在大多数情况下为2)解释为refs/heads/master,意思是“名为“ master”的分支”。
好的,现在应该清楚git pull origin master:
调用从指示的远程git fetch origin master获取refs/heads/master,origin并且仅将获取的对象存储在数据库中(还要更新特殊ref FETCH_HEAD)。它不会更新本地存储库中的任何分支或标记。
git merge FETCH_HEAD尝试refs/heads/master将从远程存储库提取的状态合并到当前已检出分支的调用。
显然,这可能会导致冲突,这就是您在第一种情况下要观察的内容。
现在让我们更深入地进行挖掘。现在应该很清楚,master:masterrefspec(通常为2)扩展为refs/heads/master:refs/heads/master,因此git pull origin master:master滚动如下:
它调用git fetch origin master:master其
refs/heads/master从远程和 refs/heads/master通过获取的对象更新本地。
如果本地“主机”未完全包含在远程服务器的“主机”中,则这可能会因“非快进”错误而失败,这就是您要观察的内容。
在这一点上,因为第一步产生了错误,所以没有尝试合并。
应当注意,您的示例均未正确更新本地引用:第一个示例未尝试尝试更新本地引用,第二个示例尝试更新了据称错误的引用-正确的调用git pull origin +refs/heads/master:refs/remotes/origin/master将强制(因此+)更新正确的引用。远程分支,然后尝试将获取的内容合并到当前签出的分支中。
要了解为什么使用这种“奇怪”的refspec,让我们看看Git在调用时使用什么refspec- git fetch origin因为在这种情况下,它读取remote.<remotename>.fetch本地存储库中的配置变量(此变量由git remote add或创建git clone):
$ git config --local --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)
如您所见,它告诉git fetch您强制更新和更新远程分支。
到现在git pull为止可以看出,它经常被无意识地过度使用,而实际上并没有了解其内部工作原理。我认为,最好使用两步操作而不是拉动:
git fetch origin —更新远程分支。git merge origin/master —将“源”上最后一次看到的“主”状态合并到当前检出的分支中。
如果将当前签出的分支设置为跟踪要合并的远程分支,则Git调用将变得更加简单:
git merge @{u}
Run Code Online (Sandbox Code Playgroud)我也建议阅读这篇文章。
1在Git中,“ ref”是一个命名实体,指向一个提交(简单或直接ref)或另一个ref(符号ref — HEAD是符号ref)。分支和标记是简单引用的示例,HEAD可能两者都有:当您签出分支时,它是一个符号引用;当您签出其他任何内容(因此处于“分离头”状态)时,它就是一个简单引用。
2如果有一个标签和一个名为“ master”的分支,则refspec将被解析为标签的名称-标签优先。在这种情况下,可以使用完整的ref名称来指定分支。
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |