🎈简单说下git的fetch操作

289 阅读3分钟

🤔提问

git的fetch操作,拉代码又不合并,有什么作用呢?

请看大屏幕

🌰 对比【fetch+merge】与【pull】

  • git fetch = 签收快递:快递员把包裹(远程仓库的最新提交)放到你家门口(本地仓库的 origin/分支名),但不拆箱,也就是代码不合并。
  • git merge = 拆箱:你决定什么时候、怎么拆箱(也就代表将远程的代码合并到了当前分支)。
  • git pull = 签收+立即拆箱:快递员直接把包裹拆开塞给你(自动合并)。

关键区别fetch 让你先检查包裹再决定要不要拆,避免“拆箱后才发现是炸弹”的尴尬——比如同事不小心将巨重要的文件删了,你看都不看就合并了,容易埋雷。


🔍 展开说:为什么 fetch 很有用?

  1. 安全预览远程变更

    git fetch origin
    git log origin/main..main  # 查看本地比远程多哪些提交
    git log main..origin/main  # 查看远程比本地多哪些提交
    

    → 在合并前,你能看到远程仓库新增了哪些提交、修改了哪些文件,避免盲目合并冲突。

  2. 比较差异(diff)

    git diff main origin/main  # 比较本地和远程的差异
    

    → 在合并前,你可以检查代码差异,确认是否需要合并。

  3. 挑着合并,而不是全合并

    git fetch origin
    git merge origin/main~2   # 只合并远程倒数第3个提交
    

    → 你可以只合并远程的部分变更,而不是全部。

  4. 避免自动合并的意外

    • git pull 会自动合并,如果远程有破坏性变更(如删除了重要文件),直接合并可能导致本地代码损坏。
    • fetch 让你有机会先检查,再决定是否合并。
  5. rebase 做准备

    git fetch origin
    git rebase origin/main    # 变基到远程最新提交
    

    → 在 rebase 前,必须先 fetch 获取远程最新提交。

啥是rebase?

变基的作用是把你的本地提交“移动”到目标分支的最新提交之后。

让提交历史变成一条直线,而不是分叉的合并提交。

效果就是下面这样:

# 变基前(分叉历史)
A---B---C (main)
     \
      D---E (feature)

# 变基后(直线历史)
A---B---C---D'---E' (feature)

🚩 误区

  • ❌ “fetch 没用,因为不更新代码”
    → 实际上,fetch 更新了本地仓库的远程跟踪分支(如 origin/main),只是没更新你的当前分支(如 main)。

  • ❌ “pull 更方便,直接一步到位”
    → 但 pull 是“盲合并”,适合你完全信任远程仓库的情况,如果是你自己自己一个人的仓库那问题不大,但是企业中一般是多人分工,所以还是建议学一学。

还有一个,如果你想在自己的项目中练练git操作,不要嫌麻烦,可以弄多个分支进行管理。比如reviewdevmaster之类的


📌 建议

  1. 频繁用 fetch,少用 merge

    git fetch origin          # 先fetch代码看看情况
    git status                # 查看本地分支状态
    git merge origin/main     # 确认安全后再合并
    
  2. fetch + log 代替 pull 预览

    git fetch
    git log --oneline --graph --all  # 查看完整提交树
    
  3. 自动化检查脚本
    在 CI/CD 中,可以先用 fetch 检查远程是否有新提交,再决定是否触发构建。


🎯 最后

git fetch 是 Git 的“安全模式”——它让你先看到远程仓库的变更,再决定要不要合并,避免盲目操作带来的风险。

我之前也是图方便,天天push+pull解决一切问题,是时候多用用fetch了😾😾

收摊!

下次见!!!!!!