问题场景
假如你是一名刚来公司的员工,你需要熟悉相关业务尤其是代码,这时候你拉取仓库的代码只是为了学习,并不是修改代码,不想本地和远程仓库之间建立链接,那该如何操作呢?
需求解决
-
了解仓库信息
# 查看远程仓库分支
(base) PS E:\essay\PythonModuleLearn> git branch -r
origin/HEAD -> origin/main
origin/feature/A
origin/feature/A-COPY
origin/main
# 查看本地分支
(base) PS E:\essay\PythonModuleLearn> git branch
* main
仓库中存在三个分支,我们以origin/feature/A为例来及逆行本次实验
1. 拉取远程分支数据
单单拉取origin/feature/A分支
-
命令
git fetch origin 远程分支名
git fetch origin feature/A 【origin 与 feature/A存在空格】
-
测试
(base) PS E:\essay\PythonModuleLearn> git fetch origin feature/A
From github.com:haozhenHG/PythonModuleLearn
* branch feature/A -> FETCH_HEAD
(base) PS E:\essay\PythonModuleLearn> git branch
* main
这里存在两个疑问:
2. 创建并切换到本地分支(不跟踪远程分支)
git checkout --no-track -b 本地分支名 origin/远程分支名
-
测试
(base) PS E:\essay\PythonModuleLearn> git branch -vv
* main caede02 [origin/main] learn *args,**kwargs in function param
(base) PS E:\essay\PythonModuleLearn> git checkout --no-track -b no_track_feature/A origin/feature/A
Switched to a new branch 'no_track_feature/A'
(base) PS E:\essay\PythonModuleLearn> git branch -vv
main caede02 [origin/main] learn *args,**kwargs in function param
* no_track_feature/A 127071f tongshang
关键点:
1. --no-track 参数确保不建立跟踪关系
2. 本地分支可自由修改,不会与远程分支联动
3. 后续需手动合并远程更新(若需要)
3. 建立跟踪与不跟踪对比
-
步骤
查看远程分支是否存在 为现有本地分支设置跟踪
(base) PS E:\essay\PythonModuleLearn> git ls-remote --heads origin feature/A
127071f82d88fbfc0a7bcbe0a654afdfad18c2b5 refs/heads/feature/A
(base) PS E:\essay\PythonModuleLearn> git branch -vv
main caede02 [origin/main] learn *args,**kwargs in function param
* no_track_feature/A 127071f [origin/feature/A] tongshang
(base) PS E:\essay\PythonModuleLearn>
疑难解答
-
git fetch的意义是什么?为什么不能跳过直接执行创建并切换到本地分支(不跟踪远程分支)操作呢?
git fetch origin feature/A 这条命令并没有对本地内容有任何改变 分支也没有增加 为什么还要进行这个操作 不直接执行创建并切换到本地分支(不跟踪远程分支)?
你的观察非常准确!git fetch origin feature/A 确实不会直接改变本地分支或代码,但它完成了 关键的前置工作。
先执行 git fetch?获取远程分支的引用 远程分支 feature/A 的提交历史会被下载到本地的 origin/feature/A 引用中
此时本地仓库才真正 "知道" 这个远程分支的存在和最新状态: feature/A -> FETCH_HEAD
能否跳过 git fetch 直接创建分支?
可以,但需要满足条件:
本地仓库 已有 该远程分支的缓存信息(例如之前执行过 git fetch 或 git pull) 如果本地从未同步过该分支,直接创建会失败(因为 Git 找不到对应的提交)
-
feature/A -> FETCH_HEAD 是什么含义呢?
(1) FETCH_HEAD 是什么?
定义:FETCH_HEAD 是 Git 的一个临时引用文件(位于 .git/FETCH_HEAD),记录最近一次 git fetch 操作的结果。
作用:存储从远程仓库拉取的分支最新提交的哈希值,供后续操作(如合并、创建分支)使用。
(2) 为什么会有 feature/A -> FETCH_HEAD 的提示?
当你运行 git fetch origin feature/A 时,Git 做了两件事:
1. 从远程仓库 origin 拉取 feature/A 分支的最新提交。
2. 将这次拉取的分支信息写入 FETCH_HEAD 文件,标记为 feature/A -> FETCH_HEAD。
(3) 查看 FETCH_HEAD 内容
运行以下命令查看具体内容:
cat .git/FETCH_HEAD:
127071f.... branch 'feature/A' of github.com:haozhenHG/PythonModuleLearn
其中 127071f 是远程分支 feature/A 的最新提交哈希。

-
为什么需要FETCH_HEAD?
精确控制拉取范围:当明确指定分支(如 git fetch origin feature/A)时,FETCH_HEAD 仅记录该分支的信息,避免污染其他远程分支的引用。 临时操作场景:例如你想快速测试远程分支的某个提交,但不想创建长期跟踪的分支。
> 假设远程分支 feature/A 有新的提交,但本地尚未同步:
# 1. 拉取特定分支
git fetch origin feature/A
# 2. 输出提示:feature/A -> FETCH_HEAD
# 此时 FETCH_HEAD 存储了 feature/A 的最新提交
# 3. 基于 FETCH_HEAD 创建临时分支
git checkout -b temp-branch FETCH_HEAD
# 4. 完成测试后,删除临时分支
git checkout main
git branch -D temp-branch