HOWTO · Git

在 Git 中获取远程分支

本教程演示了如何使用不同的命令在 Git 中获取远程分支。

本页内容

获取远程分支会更新本地仓库中的远程跟踪引用;它不会把更改合并到当前分支,也不会更改工作区中的文件。想先检查其他分支,再决定是否在其上工作或将其集成时,可以使用 git fetch。

在以下命令中,将 origin 替换为远程仓库的名称,将 topic 替换为分支名称。origin/topic 是远程跟踪引用,记录该分支最近一次获取时的状态。它本身不是可用于提交的本地分支。

git fetch 如何更新远程跟踪引用

远程仓库是指向另一个仓库的命名连接。克隆仓库时,通常会配置名为 origin 的远程仓库,以及一个获取引用规格(refspec),将该远程仓库中的分支映射到诸如 refs/remotes/origin/main 这样的引用。成功获取后,Git 会更新获取请求涵盖的引用,并将获取到的提交记录在 FETCH_HEAD 中。已检出的分支和工作区保持不变。

在审查同事的工作、比较提交,或决定是否合并或变基之前,获取远程内容会很有帮助。本地有尚未提交的修改时也可以安全地获取:fetch 不会覆盖工作区中的这些文件。

获取指定的远程分支

要从远程仓库获取一个指定分支,请运行 git fetch origin topic。这会让 Git 从 origin 获取 topic。要查看本地已有的远程跟踪分支,请运行 git branch -r。

在列表中查找 origin/topic。该列表显示的是已获取到此仓库中的引用,不一定实时反映服务器上的所有分支。要检查已获取分支上的提交,可以运行 git log --oneline HEAD..origin/topic,将其与当前分支比较。显示的提交可以从 origin/topic 到达,但无法从 HEAD 到达。

如果列表中没有该分支,请用 git remote -v 检查拼写和远程仓库,然后重新获取。远程仓库的获取引用规格决定哪些远程跟踪引用会更新。即使自定义引用规格没有创建预期的 origin/topic 引用,fetch 仍可能将请求的提交记录在 FETCH_HEAD 中。

创建跟踪远程分支的本地分支

准备好在已获取的分支上工作时,可以创建一个跟踪其远程跟踪引用的本地分支。如果本地分支和远程分支都应命名为 topic,请使用 git switch --track origin/topic。Git 会创建本地 topic 分支并切换到该分支,同时将其配置为跟踪 origin/topic。如果希望本地分支使用其他名称,请用 git switch --track -c my-topic origin/topic 明确指定。

这种跟踪关系使 git status 等命令能够报告本地分支相对于其上游分支是领先还是落后,也为之后的 git pull 和 git push 命令设置默认上游分支。创建分支时,本地分支名称必须尚未被占用;如果该分支已经存在,请切换到它,而不要再次尝试创建。

运行以下自包含示例,创建一个本地远程仓库并获取其 topic 分支:

本节中的代码以及显示的标签或输出仍为英文。

set -eu
work=$(mktemp -d)
trap 'rm -rf "$work"' EXIT
git init -q "$work/source"
git -C "$work/source" config user.name Example
git -C "$work/source" config user.email example@example.com
git -C "$work/source" checkout -q -b topic
printf 'hello
' > "$work/source/README.md"
git -C "$work/source" add README.md
git -C "$work/source" commit -q -m initial
git init -q --bare "$work/remote.git"
git -C "$work/source" remote add origin "$work/remote.git"
git -C "$work/source" push -q -u origin topic
git init -q "$work/consumer"
git -C "$work/consumer" remote add origin "$work/remote.git"
git -C "$work/consumer" fetch -q origin topic
git -C "$work/consumer" branch -r
  origin/topic

获取所有远程仓库或分支

不指定分支参数时,git fetch 会根据所选远程仓库(通常是 origin)配置的引用规格进行获取。该引用规格通常涵盖该远程仓库的所有分支,但配置也可以缩小范围或改变获取内容。要从所有已配置的远程仓库获取,请使用 git fetch --all。

--all 表示所有远程仓库;它不会覆盖各远程仓库的引用规格来获取每一个可能的分支。如果还需要获取那些无法从已获取分支到达的标签,可以考虑使用 git fetch --all --tags。使用 git branch -r 检查更新后的引用。这两个命令都不会检出分支,也不会将获取到的文件版本写入工作区。

如何选择 git fetch 或 git pull

如果想更新远程跟踪引用并在集成更改前检查即将引入的提交,请使用 git fetch。如果准备获取更改并将其集成到当前分支,请使用 git pull。pull 通常使用当前分支配置的上游分支,并按照已配置的 pull 行为进行集成,常见方式是合并或变基。

例如,git pull origin topic 会从 origin 获取内容,并将 topic 集成到当前检出的分支。它不会切换到本地 topic 分支。如果更改与本地工作发生重叠,集成时可能出现冲突;若想先审查,请获取并检查 origin/topic,准备好后再明确选择合并或变基。