Git 进阶:巧妙实现远程分支代码拉取用于学习,不建立本地关联

问题场景

假如你是一名刚来公司的员工,你需要熟悉相关业务尤其是代码,这时候你拉取仓库的代码只是为了学习,并不是修改代码,不想本地和远程仓库之间建立链接,那该如何操作呢?

在这里插入图片描述

需求解决

  • 了解仓库信息
# 查看远程仓库分支
(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. 建立跟踪与不跟踪对比
  • 步骤
  1. 查看远程分支是否存在
  2. 为现有本地分支设置跟踪
(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> 

在这里插入图片描述

疑难解答

  1. 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 找不到对应的提交)

在这里插入图片描述

  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胜天半月子

打不打商的无所谓,能帮到你就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值