我们在实际开发中,任何时间段都可能遇到问题需要撤销刚刚的操作,在 Git 中,有多种方法可以撤销,根据不同的需求和情况,选择适合的方式。
1. 撤销未提交的更改
1)撤销对文件的更改
如果对某些文件进行了修改但还没有提交,可以使用 git checkout(在较新的 Git 版本中使用 git restore)撤销这些更改。
git restore <file> # 较新的 Git 版本推荐使用
git checkout -- <file> # 较老的 Git 版本使用
2)撤销所有未提交的更改
git restore . # 较新的 Git 版本推荐使用
git checkout -- . # 较老的 Git 版本使用
原理:先查找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢复上一次提交的版本。
注意⚠️,工作区的文件变化一旦被撤销,就无法找回了。
2. 撤销已添加到暂存区的更改
如果已经使用 git add 将更改添加到暂存区,但还没有提交,可以使用 git reset 将这些更改从暂存区撤回。
git reset <file> # 撤销某一个文件
git reset # 撤销所有已添加到暂存区的更改
3. 撤销最近的提交
如果希望以前的提交在历史中彻底消失,可以使用 git reset ,丢弃掉某个提交之后的所有提交。
1)撤销提交但保留更改到工作区:
git reset --soft HEAD~1 # 撤销最近的一个提交,保留更改在工作目录中
2)撤销并丢弃更改,也就是让工作区恢复之前的状态:
git reset --hard HEAD~1 # 撤销最近的一个提交,并丢弃更改
原理:让最新提交的指针回到之前的某一个时间点,该位置之后的提交都会消失。
4. 撤销推送到远程仓库的提交(不推荐)
如果已经将提交推送到远程仓库 push,可以使用以下步骤撤销并强制推送:
# 首先,本地撤销最近的一个提交
git reset --hard HEAD~1
# 然后,强制推送到远程仓库
git push --force
注意⚠️:强制推送会覆盖远程仓库的历史记录,可能影响其他成员的工作,请谨慎使用!
5. 使用 git revert 撤销提交(推荐)
如果已经推送了提交并希望保留历史记录,可以使用 git revert 创建一个新的反向提交。
git revert <commit> # 撤销指定的提交
git revert HEAD # 撤销最近一次提交
git revert [commit1] [commit2] # 撤销多个提交,按顺序写
原理:git revert 不会删除历史记录,而是在当前提交后面,创建一个新的提交,抵消掉上一次提交导致的所有变化。
6. 使用 git stash 暂存未完成的更改
如果有未完成的更改,希望暂时将其保存以便切换到其他分支,可以使用:
git stash
当准备好恢复这些更改时,可以使用:
git stash pop
7. 替换上一次提交内容
如果提交以后,发现提交信息不对,可以使用 git commit 的 --amend 参数修改上一次的提交信息。
git commit --amend -m "重新提交信息内容"
原理:产生一个新的提交对象,替换掉上一次提交产生的提交对象。
这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,--amend 不仅可以修改提交信息,还可以整个把上一次提交替换掉。