Git 拉取远程更新时如何处理本地改动
本地代码落后远程多个提交,同时又有未提交的改动时,如何安全地更新代码。记录一次实际操作过程和三种处理策略。
日常开发中经常遇到这种情况:本地代码落后远程好几个提交,但本地又有一些没提交的改动。这时候直接 git pull 很可能失败或产生冲突。记录一次实际遇到的场景和解决过程。
执行 git status 后看到这样的输出:
On branch mainYour branch is behind 'origin/main' by 10 commits, and can be fast-forwarded. (use "git pull" to update your local branch)
Changes not staged for commit: modified: .github/workflows/deploy.yml modified: AGENTS.md modified: README.md modified: public/CNAME modified: src/config.ts modified: tsconfig.json
Untracked files: public/README.md src/assets/images/posts/astro-github-actions-deploy/ src/content/posts/zh/website/astro-github-actions-deploy.md两个问题同时存在:
- 本地分支落后远程 10 个提交 —— 需要
git pull更新 - 本地有未提交的改动(7 个修改文件 + 3 个新文件)—— 直接 pull 可能产生冲突
最安全的方式,保留本地改动的同时更新代码:
# 暂存本地改动git stash
# 拉取最新代码git pull
# 恢复暂存的改动git stash popgit stash 会把所有未提交的修改保存到一个临时栈中,git stash pop 则把最近一次暂存的改动恢复回来。
如果 stash pop 时出现冲突,Git 会标记出冲突文件,手动解决即可。
如果本地改动不需要保留(比如是临时调试的修改),可以直接丢弃:
# 丢弃已跟踪文件的修改git restore .
# 删除未跟踪的文件和目录git clean -fd
# 拉取最新代码git pull注意:这个操作不可逆,丢弃后无法恢复。
如果本地改动是有价值的工作成果,先 commit 再 pull:
# 提交本地改动git add .git commit -m "feat: 本地改动"
# 拉取最新代码(可能需要解决冲突)git pull这种方式如果远程修改了相同的文件,会产生合并冲突,需要手动解决。
本次选择了方案二(丢弃本地改动),因为本地的修改是之前未完成的调试内容,不需要保留。
git restore .git clean -fd输出:
Removing public/README.mdRemoving src/assets/images/posts/astro-github-actions-deploy/Removing src/content/posts/zh/website/astro-github-actions-deploy.mdgit restore . 恢复了 7 个已修改文件到原始状态,git clean -fd 删除了 3 个未跟踪的文件和目录。
git pull输出:
Updating 10ae5e9..f283846Fast-forward .github/workflows/deploy.yml | 2 + .gitignore | 7 +- AGENTS.md | 16 +- README.md | 29 +-- public/CNAME | 2 +- public/README.md | 27 +++ src/config.ts | 12 +- tsconfig.json | 2 +- 11 files changed, 411 insertions(+), 22 deletions(-)因为本地已经没有改动,Git 直接执行了快进合并(Fast-forward),非常干净。
pnpm install --frozen-lockfile输出 Already up to date,说明远程的更新没有涉及依赖变更。
| 场景 | 命令 | 说明 |
|---|---|---|
| 查看本地状态 | git status | 了解当前分支、落后提交数、本地改动 |
| 暂存改动 | git stash | 保存未提交的修改到栈中 |
| 查看暂存列表 | git stash list | 查看所有暂存记录 |
| 恢复最近暂存 | git stash pop | 恢复并删除最近一次暂存 |
| 恢复但不删除 | git stash apply | 恢复最近一次暂存,保留记录 |
| 丢弃已修改文件 | git restore . | 恢复所有已跟踪文件到原始状态 |
| 删除未跟踪文件 | git clean -fd | 删除未跟踪的文件(-f)和目录(-d) |
| 查看远程差异 | git log HEAD..origin/main | 查看远程有哪些新提交 |
遇到”本地有改动 + 远程有更新”的情况,核心思路就是:
- 要保留改动 →
git stash→git pull→git stash pop - 不保留改动 →
git restore .+git clean -fd→git pull - 改动很重要 →
git commit→git pull(可能需要解决冲突)
选择哪种方案取决于本地改动的价值。养成在 git pull 前先 git status 看一眼的习惯,可以避免很多不必要的麻烦。
- Git 安装 - CentOS 下安装 Git 版本控制工具