跳转到内容
KN郑某某

Git 拉取远程更新时如何处理本地改动

本地代码落后远程多个提交,同时又有未提交的改动时,如何安全地更新代码。记录一次实际操作过程和三种处理策略。

工具 1 分钟阅读

日常开发中经常遇到这种情况:本地代码落后远程好几个提交,但本地又有一些没提交的改动。这时候直接 git pull 很可能失败或产生冲突。记录一次实际遇到的场景和解决过程。

执行 git status 后看到这样的输出:

On branch main
Your 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

两个问题同时存在:

  1. 本地分支落后远程 10 个提交 —— 需要 git pull 更新
  2. 本地有未提交的改动(7 个修改文件 + 3 个新文件)—— 直接 pull 可能产生冲突

最安全的方式,保留本地改动的同时更新代码:

Terminal window
# 暂存本地改动
git stash
# 拉取最新代码
git pull
# 恢复暂存的改动
git stash pop

git stash 会把所有未提交的修改保存到一个临时栈中,git stash pop 则把最近一次暂存的改动恢复回来。

如果 stash pop 时出现冲突,Git 会标记出冲突文件,手动解决即可。

如果本地改动不需要保留(比如是临时调试的修改),可以直接丢弃:

Terminal window
# 丢弃已跟踪文件的修改
git restore .
# 删除未跟踪的文件和目录
git clean -fd
# 拉取最新代码
git pull

注意:这个操作不可逆,丢弃后无法恢复。

如果本地改动是有价值的工作成果,先 commit 再 pull:

Terminal window
# 提交本地改动
git add .
git commit -m "feat: 本地改动"
# 拉取最新代码(可能需要解决冲突)
git pull

这种方式如果远程修改了相同的文件,会产生合并冲突,需要手动解决。

本次选择了方案二(丢弃本地改动),因为本地的修改是之前未完成的调试内容,不需要保留。

Terminal window
git restore .
git clean -fd

输出:

Removing public/README.md
Removing src/assets/images/posts/astro-github-actions-deploy/
Removing src/content/posts/zh/website/astro-github-actions-deploy.md

git restore . 恢复了 7 个已修改文件到原始状态,git clean -fd 删除了 3 个未跟踪的文件和目录。

Terminal window
git pull

输出:

Updating 10ae5e9..f283846
Fast-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),非常干净。

Terminal window
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 stashgit pullgit stash pop
  • 不保留改动git restore . + git clean -fdgit pull
  • 改动很重要git commitgit pull(可能需要解决冲突)

选择哪种方案取决于本地改动的价值。养成在 git pull 前先 git status 看一眼的习惯,可以避免很多不必要的麻烦。

  • Git 安装 - CentOS 下安装 Git 版本控制工具

评论