Skip to content

远程有新代码:怎样安全拉到电脑 ​

什么时候使用这一课 ​

  • 同事把新版本 push 到 GitHub,你的电脑还是旧的。
  • PR 已经在 GitHub 合并,本地 main 没有变化。
  • 你的 Fork 比原项目落后。
  • Push 时出现 non-fast-forward。

Fetch 和 Pull 的区别 ​

git fetch ​

只下载远程的最新版本信息,不立刻改你当前文件。

像先把“总店的新菜单”拿回来放在桌上,还没替换正在使用的菜单。

git pull ​

先 Fetch,再尝试把远程变化合进当前分支。

像拿到新菜单后,立刻尝试替换或合并当前菜单。如果你们改了同一处,就可能需要人工决定。

拉取前固定做两件事 ​

bash
git status
git branch --show-current

确认:

  1. 当前站在哪条分支。
  2. 有没有还没 commit 的本地变化。

如果有重要的未提交变化,不要一边 pull 一边祈祷。先把当前任务整理并 commit,或者请熟悉 Git 的人根据状态处理。

场景一:更新自己的 main ​

bash
git switch main
git status
git pull --ff-only

--ff-only 的意思是:只有在可以直接向前移动、不需要临时制造合并提交时才更新;否则停下来告诉你情况复杂了。对小白更可控。

成功时可能看到:

text
Updating a1b2c3d..e4f5g6h
Fast-forward
 docs/index.md | 2 +-

场景二:PR 在 GitHub 合并后更新本地 ​

bash
git switch main
git pull --ff-only

现在本地 main 才会拥有 GitHub 上刚合并的内容。

如果旧功能分支已经完成,可以在确认合并后删除:

bash
git branch -d fix-homepage-typo

场景三:同步自己的 Fork ​

先确认远程地址:

bash
git remote -v

应该有:

text
origin      你的 Fork
upstream    原作者仓库

然后更新本地 main:

bash
git switch main
git status
git pull --ff-only upstream main

再把更新后的本地 main 上传到自己的 Fork:

bash
git push origin main

完整方向是:

text
原作者 upstream/main
  ↓ pull
本地 main
  ↓ push
你的 origin/main

什么叫冲突 ​

你和远程版本修改了同一个文件的同一块内容,Git 不知道应该保留哪一边。

例如本地写:

text
首页标题:旅行笔记

远程同一行写:

text
首页标题:我的旅程

Git 不能替人决定哪个产品文案正确,于是停下来,在文件里留下标记:

text
<<<<<<< HEAD
首页标题:旅行笔记
=======
首页标题:我的旅程
>>>>>>> origin/main

上半部分是当前分支的内容,下半部分是另一边的内容。你必须根据真实需求选择、合并或重写,然后删除这些标记。

冲突出现后的安全步骤 ​

  1. 先读终端列出的冲突文件,不要继续乱跑命令。
  2. 运行 git status 再确认文件名单。
  3. 在编辑器逐个打开冲突文件。
  4. 决定最终应该保留的内容。
  5. 删除 <<<<<<<、=======、>>>>>>> 标记。
  6. 运行项目或测试,确认最终内容正确。
  7. 用 git add 冲突文件 表示这个文件已经解决。
  8. 按终端提示完成 merge commit 或继续 rebase。

如果你不知道两边业务含义,不要替团队做决定。把文件名、冲突片段和目标告诉负责人。

常见报错怎么判断 ​

Your local changes would be overwritten by merge ​

当前有未提交修改,Pull 可能覆盖它。先运行 git status 和 git diff,把当前工作整理清楚。

non-fast-forward ​

远程分支有本地没有的 commit。先 Fetch 或 Pull、检查并解决差异,不要直接强制 Push。

fatal: not a git repository ​

终端不在仓库目录。用 pwd 和文件列表确认位置。

CONFLICT (content) ​

两边修改碰撞,需要人工决定最终内容。这不是 Git 损坏,而是它拒绝替你猜。

初学阶段不要随便复制的命令 ​

看到下面这些命令先停一下:

text
git reset --hard
git push --force
git clean -fd

它们可能丢弃本地修改、重写远程历史或删除未跟踪文件。只有在你理解目标、确认范围和备份后才考虑使用。

git fetch 已经成功,为什么当前文件可能完全没变化?

答案:因为 fetch 只把远程版本信息下载到本地,不自动合进当前分支。你还需要比较或执行合并、pull 等后续动作。

写给想驾驭 AI,而不只是依赖 AI 的 Vibe Coder。