Git撤回提交中新增文件变更 保留本地工作区文件
误提交新增文件的原因及解决方法
一、误提交的原因
这些新增文件之所以被包含进提交,核心原因是它们被加入了Git暂存区,随后跟着其他正常变更一起完成了提交,常见场景包括:
- 执行了
git add .、git add *这类批量添加命令,把当前目录下所有未被.gitignore规则排除的新增文件都纳入了暂存区; - 手动执行
git add操作时,误选了这些文件(比如命令行中多选了路径,或者IDE的Git面板里没取消勾选); - 使用IDE的自动提交/同步功能时,默认勾选了所有未跟踪文件,未做检查就完成了提交。
从你提供的git show输出也能验证:误提交的文件标记了new file mode,说明Git是把它们作为新跟踪文件纳入提交的,本质就是这些文件被提前add到了暂存区。
二、满足你需求的解决步骤
因为这是最新提交且没有后续提交,按以下步骤操作可同时实现三个目标:
回退最新提交,保留本地工作区文件
执行命令:git reset HEAD~1 --soft这个命令会把HEAD指针回退到上一个正确的提交,同时保留工作区所有文件(包括那两个误提交的新增文件),暂存区也会恢复到上一次提交的状态。
取消对误提交文件的Git跟踪(保留本地文件)
针对每个误提交的文件,执行:git rm --cached mysite/apps/payment/migrations/0011_auto_20221006_1850.py注意必须加
--cached参数,这样只会从Git的跟踪列表中移除文件,不会删除本地的原始内容。重新提交正确的变更
执行命令复用之前的提交信息(避免重新编写):git commit -c ORIG_HEAD此时提交的内容就只有原本需要的文件变更了。
强制推送到远程仓库
因为修改了已推送的提交历史,需要强制推送覆盖远程分支:git push -f(注意:如果有其他开发者正在使用这个分支,务必提前告知,避免他们的本地代码冲突)
生产服务器同步修正后的代码
在生产服务器上执行强制拉取命令,同步远程的正确状态:git pull --force这会移除生产服务器上之前拉取到的那两个误提交文件。
内容的提问来源于stack exchange,提问作者MadPhysicist
相关产品推荐
相关产品推荐

