跳至主要內容

git fetch

Sankgao约 1200 字大约 4 分钟命令集Git

描述

git fetch 用于从另一个存储库或本地分支获取(下载)对象和引用。这些对象通常包括提交、树、blob 和标签。获取到的数据被保存在本地的 .git/objects 目录中,但并不会自动合并或修改您当前的工作。

被获取的引用名称,以及它们所指向的对象名称,被写到 .git/FETCH_HEAD。 这些信息可以被脚本或其他 git 命令使用。

git fetch 不会改变您当前的工作目录或您所在的分支,它只是更新您的本地引用。

要将获取到的更改合并到您的当前分支,您需要使用 git mergegit rebase

git pull 相比,git fetch 更安全,因为它不会直接修改您的工作。您可以首先查看获取到的更改,然后再决定是否合并它们。

选项

选项描述
--all获取所有远程的最新信息
--dry-run只显示更新内容,而不做任何改变
--porcelain将输出结果以易于解析的格式打印到标准输出,供脚本使用
-p, --prune在获取之前,删除任何不再存在于远程的远程跟踪引用
-P, --prune-tags-p 选项一起使用,删除任何不再存在于远程的本地标签
-n, --no-tags禁用从远程仓库获取对象标签
-t, --tags从远程获取所有标签。将远程标签 refs/tags/* 获取为同名的本地标签
--set-upstream如果远程被成功获取,添加上游(跟踪)引用
-v, --verbose输出详细日志

示例

更新远程追踪的分支

例如:获取所有远程(origin)分支的最新提交到本地。origin 是远程仓库的默认名称。

git fetch origin
# 或
git fetch --all

From ssh://10.1.1.10/tests/test_demo
 * [new branch]      dev        -> origin/dev
 * [new branch]      test       -> origin/test
 * [new tag]         v1.0.0     -> v1.0.0
 * [new tag]         v1.0.1     -> v1.0.1
 * [new tag]         v1.0.0     -> v1.0.0
 * [new tag]         v1.0.1     -> v1.0.1

例如:获取指定远程 dev 分支的最新提交到本地 dev 分支。只下载 origin 仓库中 dev 分支的最新提交。

git checkout dev
git fetch origin dev

From ssh://10.1.1.10/tests/test_demo
 * branch            dev        -> FETCH_HEAD
 * [new branch]      dev        -> origin/dev

例如:获取指定远程 dev 分支的最新提交到本地 main 分支。

git fetch origin dev:main

From ssh://10.1.1.10/tests/test_demo
 * branch            dev        -> FETCH_HEAD
 * [new branch]      dev        -> origin/dev

如果不指定远程 dev 分支,只指定本地 test 分支且本地没有 test 分支,将创建本地分支。

git fetch origin :test

只显示更新内容

例如:使用 --dry-run 选项,只显示更新内容,而不做任何改变。

git fetch --dry-run origin

From ssh://10.1.1.10/tests/test_demo
 * [new branch]      dev        -> origin/dev
 * [new branch]      test       -> origin/test
 * [new tag]         v1.0.0     -> v1.0.0
 * [new tag]         v1.0.1     -> v1.0.1
 * [new tag]         v1.0.0     -> v1.0.0
 * [new tag]         v1.0.1     -> v1.0.1

简易输出

例如:使用 --porcelain 选项,将 git fetch 输出结果以易于解析的格式打印到标准输出,供脚本使用。

git fetch --dry-run --porcelain

  a6c6aa91ec80e18add652523bf225760270a18ff a159da180cd0ea822a03e81c29492a45e9828c53 refs/remotes/origin/main
* 0000000000000000000000000000000000000000 4637c7d9d5ed2aa5695366d1daa011bd57fc4fe9 refs/tags/v1.0.0
* 0000000000000000000000000000000000000000 adbc1dedd67dce934b0e77947c4df6936be318e3 refs/tags/v1.0.1
* 0000000000000000000000000000000000000000 4637c7d9d5ed2aa5695366d1daa011bd57fc4fe9 refs/tags/v1.0.0
* 0000000000000000000000000000000000000000 adbc1dedd67dce934b0e77947c4df6936be318e3 refs/tags/v1.0.1

删除不存在远程分支跟踪引用

使用 -p--prune 选项,在获取之前,删除任何不再存在于远程的远程跟踪引用。

例如:远程没有 test01 分支,删除本地的 remotes/origin/test01 远程跟踪引用。

git fetch -p

From ssh://10.1.1.10/tests/test_demo
 - [deleted]         (none)     -> origin/test01

删除不再存在远程的本地标签

使用 -P--prune-tags 选项与 -p 选项一起使用,在获取之前,将删除任何不再存在于远程的本地标签。

例如:远程没有 v1.0.1v1.1.0 标签,删除本地的 v1.0.1v1.1.0 标签。

git fetch -p -P

From ssh://10.1.1.10/tests/test_demo
 - [deleted]         (none)     -> v1.0.1
 - [deleted]         (none)     -> v1.1.0

禁用从远程仓库获取对象标签

默认情况下,指向从远程仓库下载的对象的标签会被获取并存储到本地。

例如:使用 -n--no-tags 选项,禁用从远程仓库获取对象标签。

git fetch -n

From ssh://10.1.1.10/tests/test_demo
 * [new branch]      dev        -> origin/dev
 * [new branch]      test       -> origin/test

添加上游引用

例如:使用 --set-upstream 选项,如果远程被成功获取,添加上游(跟踪)引用。

git fetch --set-upstream

输出详细日志

例如:使用 -v--verbose 选项,输出详细日志。

git fetch -v

From ssh://10.1.1.10/tests/test_demo
   a6c6aa9..a159da1  main       -> origin/main
 = [up to date]      dev        -> origin/dev
 = [up to date]      test       -> origin/test
 * [new tag]         v1.0.0     -> v1.0.0
 * [new tag]         v1.0.1     -> v1.0.1
 * [new tag]         v1.0.0     -> v1.0.0
 * [new tag]         v1.0.1     -> v1.0.1

查看获取到的提交

使用 git log 命令可以查看 FETCH_HEAD 中包含的提交。

git log FETCH_HEAD

或者,查看特定远程跟踪分支的提交:

git log origin/dev

与远程仓库同步

git fetch 通常与 git mergegit rebase 结合使用,以便将远程仓库的更新合并或重基于您的当前分支。例如:

git fetch origin
git merge origin/main

或者,使用 rebase

git fetch origin
git rebase origin/main