Skip to content

git-pull

从另一个仓库或本地分支获取并集成。

概要

bash
git pull [<options>] [<repository> [<refspec>...]]

描述

将远程仓库的更改集成到当前分支中。

首先,git pull 使用相同的参数(排除合并选项)运行 git fetch 以获取远程分支。然后决定要集成哪个远程分支:如果不带参数运行 git pull,默认为当前分支的上游。然后将该分支集成到当前分支中。

集成远程分支有 4 个主要选项:

  1. git pull --ff-only 仅执行"快速前进"更新:如果您的本地分支已与远程分支分叉,则失败。这是默认值。
  2. git pull --rebase 运行 git rebase
  3. git pull --no-rebase 运行 git merge
  4. git pull --squash 运行 git merge --squash

您也可以设置配置选项 pull.rebasepull.squashpull.ff 来指定您首选的行为。

如果在合并或变基期间出现您不想处理的合并冲突,可以用 git merge --abortgit rebase --abort 安全地中止。

选项

<repository>

:要从中拉取的"远程"仓库。这可以是 URL(参见下面的 GIT URLS 部分)或远程的名称(参见下面的 REMOTES 部分)。默认为当前分支配置的上游,或 origin

<refspec>

:要获取并集成到当前分支的分支或其他引用,例如 git pull origin main 中的 main。默认为当前分支配置的上游。这可以是分支、标签或其他引用集合。

-q, --quiet

传递给底层 git-fetch 以在传输期间抑制报告,传递给底层 git-merge 以在合并期间抑制输出。

-v, --verbose

--verbose 传递给 git-fetch 和 git-merge。

--recurse-submodules[=(yes|on-demand|no)], --no-recurse-submodules

此选项控制是否应获取已填充子模块的新提交,以及是否应更新活动子模块的工作树。

与合并相关的选项

--commit, --no-commit

执行合并并提交结果。使用 --no-commit 时,在创建合并提交之前停止。请注意,快速前进更新不会创建合并提交。

--edit, -e, --no-edit

在提交成功的机械合并之前调用编辑器以进一步编辑自动生成的合并消息。

--cleanup=<mode>

:此选项确定合并消息在提交前如何清理。

--ff, --no-ff, --ff-only

指定当合并的历史已经是当前历史的后代时如何处理合并。--ff 是默认值。 使用 --ff 时,如果可能将合并解决为快速前进。使用 --no-ff 时,始终创建合并提交。使用 --ff-only 时,仅允许快速前进合并。

--gpg-sign[=<key-id>], --no-gpg-sign

对结果合并提交进行 GPG 签名。

--log[=<n>], --no-log

除了分支名称外,用最多 <n> 个实际合并提交的单行描述填充日志消息。

--signoff, --no-signoff

在提交日志消息末尾添加提交者的 Signed-off-by 尾部。

--stat, -n, --no-stat

在合并结束时显示差异统计。

--squash, --no-squash

生成工作树和索引状态,如同发生了真正的合并,但实际上不创建提交。

--verify, --no-verify

默认情况下,运行 pre-merge 和 commit-msg 钩子。给出 --no-verify 时,这些被绕过。

-s <strategy>, --strategy=<strategy>

使用给定的合并策略。

-X <option>, --strategy-option=<option>

将合并策略特定选项传递给合并策略。

--verify-signatures, --no-verify-signatures

验证正在合并的侧面分支的提示提交是否用有效密钥签名。

--autostash, --no-autostash

在操作开始前自动创建临时存储条目,并在操作结束后应用它。

--allow-unrelated-histories

:允许合并不共享公共祖先的历史。

-r, --rebase[=(true|merges|false|interactive)]

  • true:获取后将当前分支变基到上游分支之上。如果存在对应的远程跟踪分支且上游分支自上次获取后已变基,变基使用该信息以避免变基非本地更改。这是默认值。
  • merges:使用 git rebase --rebase-merges 变基,以便本地合并提交包含在变基中。
  • false:将上游分支合并到当前分支。
  • interactive:启用变基的交互模式。 请参阅 git-config(1) 中的 pull.rebasebranch.<name>.rebasebranch.autoSetupRebase,如果您想让 git pull 始终使用 --rebase 而不是合并。 注意:这是一种潜在的危险操作模式。它重写了历史,当您已经发布该历史时这不是好兆头。除非您已仔细阅读 git-rebase(1),否则不要使用此选项。

--no-rebase

:这是 --rebase=false 的简写。

与获取相关的选项

--all, --no-all

获取所有远程,除了设置了 remote.<name>.skipFetchAll 配置变量的远程。这覆盖配置变量 fetch.all

-a, --append

将获取的引用的引用名和对象名追加到 .git/FETCH_HEAD 的现有内容中。没有此选项时,.git/FETCH_HEAD 中的旧数据将被覆盖。

--atomic

:使用原子事务更新本地引用。要么所有引用都被更新,要么在出错时不更新任何引用。

--depth=<depth>

:将获取限制为从每个远程分支历史的提示开始的指定数量的提交。

--deepen=<depth>

:类似于 --depth,只是它指定从当前浅层边界而不是从每个远程分支历史的提示开始的提交数。

--shallow-since=<date>

:加深或缩短浅层仓库的历史以包含 <date> 之后的所有可达提交。

--shallow-exclude=<ref>

:加深或缩短浅层仓库的历史以排除从指定远程分支或标签可达的提交。

--unshallow

:如果源仓库是完整的,将浅层仓库转换为完整仓库,移除浅层仓库施加的所有限制。如果源仓库是浅层的,获取尽可能多的内容以使当前仓库与源仓库具有相同的历史。

--update-shallow

:默认情况下从浅层仓库获取时,git fetch 拒绝需要更新 .git/shallow 的引用。此选项更新 .git/shallow 并接受此类引用。

--negotiation-restrict=(<commit>|<glob>)

--negotiation-tip=(<commit>|<glob>):默认情况下,Git 向服务器报告从所有本地引用可达的提交以尝试查找公共提交,从而减少要接收的包文件大小。如果指定,Git 将仅报告从给定提示可达的提交。

--dry-run

:显示将执行的操作,而不做任何更改。

--porcelain

:以脚本易于解析的格式将输出打印到标准输出。

--filter=<filter-spec>

:使用部分克隆功能并请求服务器根据给定的对象过滤器发送可达对象的子集。

-f, --force

git fetch<src>:<dst> refspec 一起使用时,它可能拒绝更新本地分支。此选项覆盖该检查。

-k, --keep

保留下载的包。

--prefetch

:修改配置的 refspec 以将所有引用放入 refs/prefetch/ 命名空间。

-p, --prune

获取前,移除远程上不再存在的任何远程跟踪引用。

--no-tags

:默认情况下,从远程仓库下载的对象的标签会被获取并存储在本地。此选项禁用此自动标签跟踪。

--refmap=<refspec>

:获取命令行上列出的引用时,使用指定的 refspec 将引用映射到远程跟踪分支,而不是远程仓库的 remote.<name>.fetch 配置变量的值。

-t, --tags

从远程获取所有标签(即将远程标签 refs/tags/* 获取到具有相同名称的本地标签中),除了其他本来会被获取的内容。

-j <n>, --jobs=<n>

将所有形式的获取并行化,一次最多 <n> 个作业。

--set-upstream

:如果远程获取成功,添加上游(跟踪)引用,供无参数的 git-pull(1) 和其他命令使用。

--upload-pack <upload-pack>

:给定时,且要获取的仓库由 git fetch-pack 处理,--exec=<upload-pack> 传递给命令以指定另一端运行的命令的非默认路径。

-4, --ipv4

仅使用 IPv4 地址,忽略 IPv6 地址。

-6, --ipv6

仅使用 IPv6 地址,忽略 IPv4 地址。

-o <option>, --server-option=<option>

使用协议版本 2 通信时将给定字符串传输到服务器。

--show-forced-updates, --no-show-forced-updates

默认情况下,git 在获取期间检查分支是否被强制更新。

GIT URLS

通常,URL 包含有关传输协议、远程服务器地址和仓库路径的信息。根据传输协议,其中一些信息可能不存在。

Git 支持 ssh、git、http 和 https 协议(此外,ftp 和 ftps 可用于获取,但这效率低下且已弃用;不要使用它们)。

本机传输(即 git:// URL)不进行认证,在不安全的网络上应谨慎使用。

以下语法可与它们一起使用:

  • ssh://[<user>@]<host>[:<port>]/<path-to-git-repo>
  • git://<host>[:<port>]/<path-to-git-repo>
  • http[s]://<host>[:<port>]/<path-to-git-repo>
  • ftp[s]://<host>[:<port>]/<path-to-git-repo>

也可以使用 scp 类似的语法:

  • [<user>@]<host>:<path-to-git-repo>

此语法仅在第一个冒号之前没有斜杠时才被识别。这有助于区分包含冒号的本地路径。

ssh 和 git 协议还支持 ~<username> 展开:

  • ssh://[<user>@]<host>[:<port>]/~<user>/<path-to-git-repo>
  • git://<host>[:<port>]/~<user>/<path-to-git-repo>
  • [<user>@]<host>:~<user>/<path-to-git-repo>

对于本地仓库,也由 Git 本机支持:

  • /path/to/repo.git/
  • file:///path/to/repo.git/

git clonegit fetchgit pull(但不是 git push)也将接受合适的 bundle 文件。参见 git-bundle(1)

REMOTES

以下之一的名称可用作 <repository> 参数代替 URL:

  • Git 配置文件中的远程:$GIT_DIR/config
  • $GIT_DIR/remotes 目录中的文件
  • $GIT_DIR/branches 目录中的文件

这些都允许您从命令行省略 refspec,因为它们各自包含 git 默认使用的 refspec。

配置文件中的命名远程

您可以选择使用 git-remote(1)git-config(1) 或手动编辑 $GIT_DIR/config 文件先前配置的远程名称。此远程的 URL 将用于访问仓库。当您在命令行上不提供 refspec 时,此远程的 refspec 将默认使用。

$GIT_DIR/remotes 中的命名文件

您可以选择提供 $GIT_DIR/remotes 中文件的名称。此文件中的 URL 将用于访问仓库。当您在命令行上不提供 refspec 时,此文件中的 refspec 将用作默认值。

$GIT_DIR/branches 中的命名文件

您可以选择提供 $GIT_DIR/branches 中文件的名称。此文件中的 URL 将用于访问仓库。

上游分支

Git 中的分支可以选择具有上游远程分支。Git 默认使用上游分支进行远程操作,例如:

  • 这是不带参数的 git pullgit fetch 的默认值。
  • 这是不带参数的 git push 的默认值,但有一些例外。
  • 各种命令(包括 git checkoutgit status)将向您显示自您从它分叉以来已添加到当前分支和上游的提交数。

上游存储在 .git/config 中的 "remote" 和 "merge" 字段中。例如,如果 main 的上游是 origin/main

[branch "main"]
   remote = origin
   merge = refs/heads/main

您可以用 git push --set-upstream <remote> <branch> 显式设置上游分支,但 Git 通常会自动为您设置上游。

默认行为

通常人们不带任何参数使用 git pull。传统上,这等同于说 git pull origin。但是,当在分支 <name> 上时存在配置 branch.<name>.remote,则使用该值而不是 origin

示例

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

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

    $ git pull origin next

另请参阅

git-fetch(1)git-merge(1)git-config(1)

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布