远程有新代码:怎样安全拉到电脑
什么时候使用这一课
- 同事把新版本 push 到 GitHub,你的电脑还是旧的。
- PR 已经在 GitHub 合并,本地 main 没有变化。
- 你的 Fork 比原项目落后。
- Push 时出现
non-fast-forward。
Fetch 和 Pull 的区别
git fetch
只下载远程的最新版本信息,不立刻改你当前文件。
像先把“总店的新菜单”拿回来放在桌上,还没替换正在使用的菜单。
git pull
先 Fetch,再尝试把远程变化合进当前分支。
像拿到新菜单后,立刻尝试替换或合并当前菜单。如果你们改了同一处,就可能需要人工决定。
拉取前固定做两件事
bash
git status
git branch --show-current确认:
- 当前站在哪条分支。
- 有没有还没 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上半部分是当前分支的内容,下半部分是另一边的内容。你必须根据真实需求选择、合并或重写,然后删除这些标记。
冲突出现后的安全步骤
- 先读终端列出的冲突文件,不要继续乱跑命令。
- 运行
git status再确认文件名单。 - 在编辑器逐个打开冲突文件。
- 决定最终应该保留的内容。
- 删除
<<<<<<<、=======、>>>>>>>标记。 - 运行项目或测试,确认最终内容正确。
- 用
git add 冲突文件表示这个文件已经解决。 - 按终端提示完成 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 等后续动作。