PAYATHON 2026

Git:测试旧版本后如何返回最新版本

排障赵师傅

结论

如果测试时的修改已经不需要,可以先丢弃修改,再切回 master:

git status
git restore --source=HEAD --staged --worktree -- \
  code/launch_program.sh \
  code/__pycache__/feature.cpython-310.pyc

git switch master

如果还想保留这些修改,请不要执行 git restore,可以将修改放入 stash,或者创建分支并提交。

为什么无法切换到 master

执行以下命令:

git checkout id-of-the-commit

Git 会检出指定的历史提交。此时通常会进入 detached HEAD 状态,也就是当前不属于任何分支。

之后对文件所做的修改都是本地未提交修改。由于 master 中这些文件的内容与当前版本不同,直接切换可能覆盖修改,Git 因此中止操作。当前修改仍然保留,没有丢失。

先查看工作区的具体状态:

git status
git diff

方案一:丢弃不需要的修改

如果修改只用于临时测试,现在已经不再需要,可以恢复这两个文件:

git restore --source=HEAD --staged --worktree -- \
  code/launch_program.sh \
  code/__pycache__/feature.cpython-310.pyc

确认工作区干净后,再切回分支:

git status
git switch master

如果使用的旧版 Git 没有 git restore 和 git switch,可以改用:

git checkout -- code/launch_program.sh
git checkout -- code/__pycache__/feature.cpython-310.pyc
git checkout master

这些命令会永久丢弃对应文件中尚未提交的修改。执行前,先用 git diff 确认其中没有需要保留的内容。

方案二:暂时保留修改

如果以后可能还会用到这些测试修改,可以先将它们放入 stash:

git stash push -m "old version test changes"
git switch master

查看已有的 stash:

git stash list

需要恢复时,建议先切回对应的旧提交并创建分支,再应用 stash:

git switch --detach id-of-the-commit
git switch -c old-version-test
git stash pop

不要随意在 master 上执行 git stash pop。旧提交与 master 差异较大时,恢复修改可能产生冲突。

默认情况下,git stash 主要保存已跟踪文件的修改。要同时保存未跟踪文件,请使用:

git stash push -u -m "old version test changes"

方案三:永久保存测试修改

如果这些改动值得保留,可以从当前旧提交创建一个分支:

git switch -c old-version-test
git add code/launch_program.sh
git commit -m "Adjust input filenames for old-version test"
git switch master

这样,测试提交会归属于一个明确的分支,不必依赖 detached HEAD 和 reflog 才能找回。

处理 __pycache__ 文件

code/__pycache__/feature.cpython-310.pyc 是 Python 生成的字节码缓存,通常不应提交到 Git。它出现在错误列表中,通常表示该文件已被 Git 跟踪。

可以在合适的分支上将缓存目录加入 .gitignore:

__pycache__/
*.py[cod]

如果缓存文件已经提交,添加 .gitignore 并不会让 Git 停止跟踪它。还需要将它从 Git 索引中移除并提交:

git rm -r --cached code/__pycache__
git add .gitignore
git commit -m "Stop tracking Python cache files"

这项操作只会停止 Git 对缓存文件的跟踪,不会删除本机需要使用的源代码。

“切回 master”是否等于获得最新版本

git switch master

这条命令只会切换到本地 master 当前指向的提交,不会自动下载远程仓库的更新。如果还要同步远程分支,并且远程仓库已经配置正确,可以在切换后执行:

git pull --ff-only

如果仓库使用 main 而非 master,请将上述命令中的分支名改为 main。

备注:内容仅供参考。