Remove a git commit which has not been pushed
Remove a git commit which has not been pushed
技术背景
在使用 Git 进行版本控制时,有时我们会不小心提交了错误的内容,或者提交了不必要的提交。如果这些提交还没有推送到远程仓库,我们可以使用一些 Git 命令来撤销这些提交,以保持仓库的整洁和正确性。
实现步骤
未推送到远程仓库的情况
当你还没有将更改推送到远程仓库时,可以使用 git reset
命令。以下是不同的操作方式:
- 撤销提交并保持所有文件暂存:这里的
1
git reset --soft HEAD~
HEAD~
表示上一个提交,--soft
选项会撤销提交,但保留更改在暂存区。 - 撤销提交并取消所有文件暂存:此命令会撤销提交,并将文件从暂存区移除,但保留工作目录中的更改。
1
git reset HEAD~
- 撤销提交并完全移除所有更改:
1
git reset --hard HEAD~
--hard
选项会撤销提交,同时丢弃工作目录中的所有更改。需要注意的是,使用git reset --hard
时要谨慎,因为可能会丢失未提交的更改。
已推送到远程仓库的情况
如果已经将更改推送到远程仓库,可以使用 git revert
命令:
1 |
|
这个命令会创建一个新的提交,用于撤销最新的提交。
其他操作
- 使用特定的提交 ID 进行回退:例如,要回退到
1
git reset --hard {commit-id}
db0c078d5286b837532ff5e276dcf91885df2296
这个提交:1
git reset --hard db0c078d5286b837532ff5e276dcf91885df2296
- 删除本地分支并从服务器检出:
如果本地分支比远程分支超前多个提交,并且需要撤销所有这些提交,可以删除本地分支并从服务器重新检出:1
2git branch -D <branch-name>
git checkout <branch-name> - 交互式变基:
1
git rebase -i HEAD~N
N
是 Git 会显示的提交数量,该命令会提示你打开文本编辑器,你可以通过删除与提交关联的行来移除想要的提交。
删除提交中的文件或文件夹
- 删除文件夹:
1
git rm -r --cache <folder name>
- 删除文件:
1
git rm --cache <file name>
最佳实践
- 在进行
git reset --hard
操作之前,务必使用git status
检查工作目录是否干净,或者确认是否要丢弃未提交的更改。 - 使用
git log
命令查看提交历史,以便准确选择要回退的提交。 - 如果不确定操作会带来什么影响,可以先在本地测试分支上进行操作。
常见问题
- 丢失未提交的更改:使用
git reset --hard
可能会丢失未提交的更改。因此,在执行该命令之前,最好先保存或提交这些更改。 - 与远程仓库不一致:如果已经将提交推送到远程仓库,使用
git reset
可能会导致本地和远程仓库不一致。在这种情况下,建议使用git revert
命令。
Remove a git commit which has not been pushed
https://119291.xyz/posts/remove-a-git-commit-which-has-not-been-pushed/