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。
备注:内容仅供参考。
