Git:pull 命令

Oct 20, 2021

目录


ref: https://git-scm.com/docs/git-pull


命令


1git pull [<options>] [<repository> [<refspec>…]]

git-pull - Fetch from and integrate with another repository or a local branch


描述


将远程仓库的修改并入到当前分支。 如果当前分支落后于远程,那么默认情况下它将快进当前分支以匹配远程。如果当前分支和远程分支分叉(diverged), 用户需要使用 --rebase 或者 --no-rebase 来指定如何调和分支的不同。

更确切地说, git pull 会首先使用指定的参数调用 git fetch,然后根据配置的选项或者命令行标志来调用 git rebase 或者 git merge 来调和分支的不同。

<repository> 应该是远程仓库的名称,就像在 git-fetch 中的用法。 <refspec> 可以指定任意的远程引用(例如,tag 的名字)或者甚至是具有相应远程跟踪分支的refs集合(例如,refs/heads/*:refs/remotes/origin/*), 但是通常情况下它指定一个远程仓库的分支名称。

<repository>和<branch>的默认值是从 git-branch 设置的当前分支的"remote"和"merge"配置中读取的。

假定存在一下历史记录,并且当前分支是 master:

1
2      A---B---C master on origin
3     /
4    D---E---F---G master
5        ^
6        origin/master in your repository

如果此时你使用 git pull, git 将会获取远程修改,并且同步远程修改到当前本地分支 master 上, 直到 commit C 被合并到当前 master 分支上。 它的结果将是: 产生一个新的 commit H,它有两个父commit,分别是 C 和 G. 还有一个用户指定的日志消息。

1      A---B---C origin/master
2     /         \
3    D---E---F---G---H master

See git-merge[1] for details, including how conflicts are presented and handled.

在 Git1.7.0 之后的版本中,如果需要取消合并分支,使用 git reset --merge。 在更旧的版本中,不推荐使用 git pull 如果本地当前分支中有未提交的修改。

如果远程任何更改与本地未提交的更改重叠,合并将被自动取消,工作树(the work tree)也将保持不变。


选项


-q, –quiet

这个选项将被传递给底层 git-fetch 和 git-merge,用于屏蔽掉这两个命令产生的输出

-v, –verbose

同 -q 选项,会被传递给 git-fetch 和 git-merge,来输出更多的日志信息

–[no-]recurse-submodules [=yes|on-demand|no]

这个选项控制是否应该获取子模块的新提交,以及是否应该更新活动子模块的工作树. 参考 git-fetch, git-config, gitmodules

如果 checkout 是通过 rebase 完成的,则本地子模块提交也将被 rebase。

如果更新是通过 merge 完成的,那么子模块中的冲突也会被解决并 checkout。


默认行为


通常人们直接使用 git pull 命令,不带任何参数。 传统上来说,这等同于 git pull origin。 但是,当你如果你的分支的 branch.<name>.remote 配置了另外一个值,这个值将取代 origin。

此命令会使用 remote.<origin>.url 作为远程仓库的 URL 来获取远程仓库信息。 如果这个参数没有配置,会使用 $GIT_DIR/remotes/<origin>

如果使用命令时没有指定 refspec 参数, 此命令会使用 remote.<rogin>.fetch 来作为远程分支(如果这个值配置了的话)。 如果 remote.<rogin>.fetch 没有配置, 会使用 $GIT_DIR/remotes/<origin> 配置下的 Pull: 行。 除了在选项部分描述的 refspec 格式之外,你还可以使用 globbing refspec,它看起来像这样:

1refs/heads/*:refs/remotes/origin/*

一个 globbing refspec 必须有一个非空的 RHS, 他的 LHS 和 RHS 必须以 /* 结尾。上述 refspec 指定所有本地远程分支都使用 refs/remotes/origin/ 层次结构中的远程跟踪分支以相同的分支名称进行跟踪。

为了不破坏向后兼容性,确定在获取后合并哪个远程分支的规则有点复杂。

如果在 git pull 的命令行中给出了明确的 refspecs,那么它们都会被合并。

如果在 git pull 的命令行中没有指定 refspecs,那么 git pull 使用配置文件中指定的 refspec 或者 $GIT_DIR/remotes/<origin>。 在这种情况下,规则如下:

  • 如果当前分支的配置项 branch.<name>.merge 存在,那么同名的远程分支将被合并进来
  • 如果 refspec 是一个 globbing refspec, 什么都不合并
  • 否则,第一个 refspec 指定的远程分支被合并进来。

例子


  • 更新克隆的仓库的远程跟踪分支,然后将其中一个合并到当前分支中:
1git pull
2git pull origin

通常,被合并到当前分支的是远程仓库的 HEAD。 但是这通常由 branch.<name>.remote 和 branch.<name>.merge 选项决定。 参考 git-config。

  • 将远程分支 next 合并到当前分支:
1git pull origin next

END!!!


Tags