从原点拉出"git pull"命令之间的区别?

Ben*_*Gao 76 git

这些命令之间有什么区别?:

# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master
Run Code Online (Sandbox Code Playgroud)

mic*_*has 77

git pull是一个方便的命令,它同时做不同的事情.基本上它只是一个组合git fetch,它连接到远程存储库并获取新的提交,以及git merge(或git rebase)将新提交合并到您的本地分支中.由于涉及两个不同的命令,其含义git pull并不总是显而易见的.

您可以为本地分支配置上游.在一个新的克隆之后,你将有一个本地分支"master",一个远程"origin",你的主分支有"origin/master"作为上游.我假设下面这个设置.(您可以git branch -vv通过查看.git/config 查看上游配置.)

现在问你的问题:

  1. git pull= git fetch origin+ git merge origin/master(或者你的上游是什么)
  2. git pull origin= git pull(只要原点是您的上游远程)
  3. git pull origin master= git fetch origin master+git merge FETCH_HEAD
  4. git pull origin/master :无效,除非你有一个名为"origin/master"的遥控器
  5. git pull origin HEAD:master:尝试直接将本地主数据重置为原点上的HEAD点.(不要这样做.)

  • 为什么执行`git pull origin HEAD:master`是一个坏主意? (2认同)
  • 右侧应该是一个远程分支.请参阅手册页中的警告.如果你使用它,请确保你知道自己在做什么. (2认同)

Nou*_*him 17

A pull基本上是fetch(从远程存储库中获取一些提交和关联对象到您的),然后是将这些"应用"到您的工作副本中的操作.默认情况下,第二阶段是使用a完成的,merge但您可以将pull.rebase变量设置为true,然后它将重新定位.

pull命令会弹出两个问题.首先是,到底取得了什么?第二个是,它如何将这些更改应用到我的工作副本中?让我们从第一个开始吧.命令的完整形式是

git pull [options] [repository] [<refspec>...]
Run Code Online (Sandbox Code Playgroud)

options是控制行为的标志(如--rebase使pull工作作为fetch+ rebase哪怕pull.rebasefalse).

repository 是要获取的远程的名称(或URL).

refspecs 是一种简洁的方法,用于指定要获取的远程数据库上的哪些引用以及您希望将它们放在当前工作副本中的哪个位置.

让我们先采用最明确的形式.

 git pull origin branch1:branch2
Run Code Online (Sandbox Code Playgroud)

这基本上说,拉动被branch1调用的远程引用的更改origin,然后将它们合并(或重新绑定)到本地分支branch2.例如,如果我说git pull origin master:dev,我会得到一个本地分支dev,它将指向同一个提交master.如何指定refspecs的细节在这里.您可以使用a *来表示多个refspec.例如,git pull origin refs/heads/*:refs/heads/*将所有分支(存储在其下heads)拉入本地存储库,并将它们合并到具有相同名称的本地分支中.

现在,让我们逐个删除参数,讨论默认工作的方式.首先,我们可以从refspec中删除目的地,然后简单地说git pull origin branch1.这首先fetch是远程分支branch1到本地存储库.它将作为临时引用提供FETCH_HEAD.之后,它将运行git merge FETCH_HEAD,将此分支合并到您当前的活动分支(即HEAD).当您在本地分支中并希望将远程更改提取到该分支时,通常会执行此操作.

现在,让我们branch1完全放弃,只是说git pull origin.现在,git知道从哪里获取(origin)但不知道要获取什么.它有一些默认值.最常见的情况是配置文件有一个branch.<name>.merge选项(这是一个merge在类似的部分内调用的条目[branch "master"]).如果是这样,它将使用那里的refspec进行操作.

如果我们origin完全放弃并简单地说git pull,它将检查配置以查看是否有branch.<name>.remote指定哪个遥控器来自哪个.与上面的内容一起告诉你要拉什么.

您的第4点和第5点不是正常的用例.如果你有一个origin/master不太可能的遥控器,第一个是有道理的.origin/master通常用于跟踪本地参考master遥控器上的分支origin.第二个将尝试获取HEAD远程(通常是默认分支master)上的更改,然后将它们合并到您的本地master.虽然这可能是你想要定期做的事情,但这个命令是非常规的,并不是我经常看到的.

我已经跳过了一些细节,但这些应该足以让您在日常工作中保持安全和舒适.有关所有血腥细节,您可以查看手册页git pull.