Git处于「还原进行中」状态时,如何探查相关差异?
你现在处于Git还原操作的中间状态,这种情况下Git默认的git status提示确实不够详细——看不到具体修改的文件、不知道正在处理哪个提交,甚至IDE也没给出有用线索。别担心,我来给你分享几个能精准获取这些信息的命令,完全基于Git原生工具,解决你的所有疑问:
1. 查看当前正在还原哪些提交
Git在执行还原(尤其是多步还原或中途暂停的还原)时,会把任务进度存在.git/sequencer目录里,这里的文件能直接帮你定位目标提交:
- 直接查看待处理的还原任务清单:
这个文件里会列出所有需要还原的提交,格式类似cat .git/sequencer/todorevert <commit-hash> <commit-message>,你能一眼看到当前正在处理(以及尚未处理)的提交哈希和对应的提交说明。 - 如果你使用的Git版本在2.27及以上(你的2.31.1完全满足),可以用更友好的官方命令:
它会以结构化的格式展示还原进度,包括已完成的提交、当前正在处理的提交,以及剩余的任务项,比直接读文件清晰很多。git sequencer status
另外,ORIG_HEAD指向的是你启动还原操作之前的HEAD状态,你可以用git log --oneline ORIG_HEAD快速确认还原开始前的分支状态,辅助判断上下文。
2. 查看本次还原会影响哪些文件
一旦拿到了要还原的提交哈希(比如<target-rev>),直接查看该提交修改过的文件列表:
git show --name-only <target-rev>
这个命令会输出该提交涉及的所有文件,没有多余信息,一目了然。
如果还原已经进行了一部分(比如已经解决了部分冲突),还可以通过暂存区查看已经生成的变更文件:
git diff --cached --name-only
它会显示已经暂存的、属于本次还原操作的文件清单。
3. 用git diff查看还原操作的具体影响
当然可以,分两种场景处理:
- 刚进入还原状态,还没生成本地变更:直接查看目标提交的变更内容(还原操作就是要撤销这些变更):
或者用diff命令明确对比目标提交和它的父提交(也就是该提交本身带来的所有修改):git show <target-rev>
还原的效果就是把这些变更完全反转过来。git diff <target-rev>^ <target-rev> - 已经有部分还原变更(暂存或未暂存):
- 查看暂存的还原变更细节:
git diff --cached - 查看未暂存的还原变更细节:
git diff - 对比还原开始前的状态和当前状态:
git diff ORIG_HEAD HEAD,这个diff就是到目前为止还原操作带来的所有变更。
- 查看暂存的还原变更细节:
4. 对比两个提交的直接差异(非累积)
你想要的就是查看单个提交本身的变更,而非从当前HEAD回溯的累积差异,这正是git diff <commit>^ <commit>的作用——它只显示该提交相对于它的父提交的直接修改,完全忽略中间的其他提交,和git revert的逻辑完全匹配。
如果是对比任意两个非父子关系的提交的直接差异,直接使用:
git diff <commit-A> <commit-B>
注意顺序:这个命令显示的是从commit-A到commit-B的变更内容,如果你想查看反向的差异,交换两者的位置即可。
内容的提问来源于stack exchange,提问作者Mike Williamson

