【实用Git指南】哎呀,提交错了?全网最全的Git撤销提交指南

前言

开发过程就经常会遇到代码提交后,想撤销操作,那么如何进行Git的各种撤销操作呢?本文将Git的各种误提交对症下药的方法分享出来,读者可以选择情况学习,也可以收藏本文以备速查使用。

一图胜千言

一图胜千言

小技巧

文中会涉及到rebase操作,这时候会打开编辑器,用不习惯git的编辑器,这里建议将git的编辑器默认由vscode或vim打开,配置方法如下:

# 配置为vscode
git config --global core.editor "code --wait"

# 配置为vim
git config --global core.editor "vim"

你需要提前了解的知识

  • Git的工作区、暂存区、版本库
  • Git的rebase、revert、reset命令

按是否已经commit细说各种情况:

1. 未commit的撤销方法

commit分为以下两个场景

1.1 未commit,未add

场景: 本地做了文件增加或变更,但还未做git操作(git add .),希望清除本地变更,与git仓库保持一致。

这种情况是最简单的

STEP 1

执行 git checkout . 即可重置已经修改的文件(不包括新增的文件,因为新增的文件还没被记录到git版本控制中)。

STEP 2(可选)

如果需要清除新增的文件,可以单个逐一删除,也可以执行git clean -df一键删除所有不在git版本控制的文件。

git clean 是什么?

git clean可以清理仓库中未被git版本控制的文件或目录
-d 参数表示连目录一起删除
-f 强制删除。 官方解释为 如果clean.requireForce默认的值是true,需要添加-f才能删除。另外,使用-f可删除带有.git子目录或文件的目录

1.2 未commit,已add

场景: 本地做了文件增加或变更,但已经执行了git add .,希望清除本次变更,与git仓库保持一致。

STEP 1

执行git restore --staged . 将文件从暂存区拉回待commit列表

SETP 2

按照上文的「 未commit,未add」 操作即可


已经commit了,怎么办呢?下面分各种情况的对症下药,但其中涉及到reset和 rebase和 revert,可以先自行了解,深化认识再一一查看。

1. 已commit的撤销方法

2.1 撤回最近一次提交重新编辑

场景: 本地做了文件增加或变更,但已经执行了commit,希望撤回最近一次提交重新编辑。

STEP 1

首先保证做了错误提交的操作后,当前工作区是干净的。执行 git reset --soft HEAD^ ,即可将本次提交撤回。 注意是 使用soft软重置来保持所有本地的变动。

执行后就回到了git add .后的状态了,至于是否需要继续修改,还是撤销add后的变更(参考上文的方法),可根据实际情况进行。

STEP 2 (如果push过,需要执行)

如果做了错误的commit后,还顺手push上远端仓库了,就需要在reset后执行以下危险操作 git push -f origin 你的分支名 或缩略命令git push -f 强推到远端仓库。
当然这其中涉及到仓库的分支保护策略是否限制你进行强推该分支,以及是否只有你本人在该分支上做变更。比如 在你push后,又有别的开发同学进行了push,那么可能你强推仓库,开发大哥会强推你本人。

2.2 丢弃最近一次提交

场景: 变更已经commit,希望直接丢弃掉上一次变更,并且不留下提交记录

STEP

危险操作 执行 git reset --hard HEAD^ ,将代码库硬重置(会丢弃所有改动)指向到前一次提交,如果需要指定到某个commit id 可以 reset --hard 某个commitid

2.3 回滚某一次提交

场景: 变更已经commit,希望直接丢弃掉这一次变更,留下提交记录

STEP

执行 git revert 新增一个回滚提交。

2.4 修改Commit Message

场景: commit后,填错Commit Message了,希望保持本次提交,仅修改Commit Message。

STEP

执行 git commit --amend

注:它同样可以用于修改最后一次提交

2.5 合并多次提交

场景: 修改一个文件a的过程,连续进行了多次commit,希望将多次连续commit合并为一个,其他开发同学只看到一次提交。

例如:合并三次提交为一次

STEP 1

git rebase -i HEAD~3

STEP 2

这时会展示出最近三次提交,如下

pick 690cb73 1
pick 6f6a377 2
pick 0a267b8 3

我们将最后两次提交的pick改为squash,然后保存退出编辑器,如下

pick 690cb73 1
squash 6f6a377 2
squash 0a267b8 3

STEP 3

连续三次自己的提交,一般是不会有冲突的,有冲突就处理下再commit,然后弹出的编辑器输入新的commit message,保存退出编辑器后提示,即完成操作啦。

Successfully rebased and updated refs/heads/develop.

2.6 改写某个提交

该部分摘录自 用rebase -i 修改提交

场景: 先后做了a,b,c三提交,但是还没push,想夹带私货,再对历史的b提交多做一些变更。

STEP 1

git rebase -i HEAD~~

STEP 2

将第一行的“pick”改成“edit”,然后保存并退出。

pick 09ba200 b
pick bc376e3 c

STEP 3

修改文件后,用commit --amend保存修改

STEP 4

git rebase --continue继续执行rebase

STEP 5

这时,有可能其他提交会发生冲突, 请修改冲突部分后再执行add和rebase –continue

总结

至此git的各种撤销提交方案说完了,借助git rebase 和git reset 还有更多的操作方法,大家可以在开发的漫漫长路中继续探索。

参考资料

用rebase -i 修改提交

【实用Git指南】哎呀,提交错了?全网最全的Git撤销提交指南
滚动到顶部