pull 基本上是一个fetch(它将一些提交和相关对象从远程存储库获取到您的存储库中),然后是一个将这些“应用”到您的工作副本的操作。第二阶段默认使用merge 完成,但您可以将pull.rebase 变量设置为true,然后它将改为变基。
pull 命令会弹出两个问题。首先是,究竟获取了什么?第二个是,它如何将这些更改应用于我的工作副本?让我们从第一个开始。命令的完整形式是
git pull [options] [repository] [<refspec>...]
options 是控制行为的标志(例如 --rebase 使 pull 工作为 fetch + rebase,即使 pull.rebase 是 false)。
repository 是要从中获取的远程的名称(或 URL)。
refspecs 是一种简洁的方式,用于指定要获取远程上的哪些引用以及要将它们放在当前工作副本中的哪个位置。
让我们首先采用最明确的形式。
git pull origin branch1:branch2
这基本上是说,将引用branch1 中的更改拉到名为origin 的远程服务器上,然后将它们合并(或变基)到本地分支branch2。例如,如果我说git pull origin master:dev,我将获得一个名为dev 的本地分支,它将指向与master 相同的提交。如何指定 refspecs 的详细信息是here。您可以使用* 来指示多个参考规范。例如,git pull origin refs/heads/*:refs/heads/* 会将所有分支(存储在heads 下)拉到本地存储库中,并将它们合并到具有相同名称的本地分支中。
现在,让我们一个一个去掉参数来讨论默认值是如何工作的。首先,我们可以从 refspec 中删除目标,然后简单地说 git pull origin branch1。这将首先将fetch 远程分支branch1 放入您的本地存储库。它将作为名为@987654350@ 的临时参考提供。之后,它将运行git merge FETCH_HEAD,这会将这个分支合并到您当前的活动分支中(即HEAD)。这通常在您位于本地分支并希望从远程获取更改到该分支时完成。
现在,让我们完全放弃branch1,直接说git pull origin。现在,git 知道从哪里获取 (origin) 但不知道要获取什么。它对此有一些默认值。大多数情况是当您的配置文件有一个branch.<name>.merge 选项时(这是一个名为merge 的条目,位于[branch "master"] 之类的部分内)。如果是这样,它将使用那里的 refspecs 进行操作。
如果我们完全删除origin 并简单地说git pull,它将检查配置以查看是否有branch.<name>.remote 指定要从哪个遥控器提取。连同上面的内容告诉你要拉什么。
您的第 4 点和第 5 点不是正常用例。如果您有一个名为origin/master 的遥控器,那么第一个是有意义的,这不太可能。 origin/master通常是跟踪远程origin 上的master 分支的本地引用。第二个将尝试获取远程HEAD 上的更改(默认分支通常是master),然后将它们合并到本地master。虽然这可能是您想要定期执行的操作,但该命令非常不合常规,并且不是我经常看到的。
我跳过了一些细节,但这些应该足以让您在日常工作中保持安全和舒适。有关所有血腥细节,您可以查看git pull 的手册页。