Git新手使用git revert遇冲突:CONFLICT deleted in empty tree and modified in HEAD
操作错误原因
你用git revert HEAD~1的目标选错了。HEAD~1指向的是第一个提交(添加"first line"的那次),Git revert这个提交的逻辑是撤销该提交的操作——也就是删除test.txt(因为第一个提交是创建并添加了这个文件)。但当前你的最新提交(HEAD)里test.txt已经被修改添加了第二行,Git无法自动判断是要删除还是保留修改,所以触发了冲突。
你的需求是回到test.txt仅含第一行的状态,本质是要撤销第二个提交(添加"second line"的那次),这个提交对应的是HEAD,而非HEAD~1。
正确实现步骤
方法1:直接执行正确的revert(未进入错误revert流程时)
如果还没执行之前的错误revert,直接运行:
git revert HEAD
这个命令会创建一个新提交,反转第二个提交的操作——移除test.txt中的第二行,最终test.txt仅保留第一行,同时完整保留提交历史。
方法2:终止错误revert流程后再操作
如果你已经处于REVERTING状态,先终止当前流程:
git revert --abort
然后执行正确的revert命令:
git revert HEAD
可选:用重置方式(适合本地未推送分支)
若不需要保留第二个提交的历史,也可以用git reset(注意:该操作会修改提交历史,分支已推送到远程仓库时禁止使用):
git reset --hard HEAD~1
执行后分支指针直接回退到第一个提交,工作区和暂存区同步到该状态,test.txt就只剩第一行。
为什么git add test.txt无效?
你当时在执行的是“反转第一个提交(删除test.txt)”的操作,Git期望你解决“删除文件”与“当前修改文件”的冲突。git add test.txt相当于告诉Git“保留当前修改的test.txt,放弃删除操作”,这和你要回退到第一行的需求不符,因此Git不会结束revert流程——你并没有完成“反转第一个提交”的目标。
内容的提问来源于stack exchange,提问作者Vinicius Alves

