虽然错过的人无法挽回,但是git提错的代码却可以撤销。
我 add 错误文件了,怎么办?
这个就比较简单了,执行
perl
git reset
该命令的作用是:
-
撤销暂存 :所有已经
git add
的文件会变成未暂存状态。 -
保留工作区的修改:文件内容保持不变,仍然在工作区。你可以继续提交文件或者做一些修改之后再提交文件。
我不但 add 了还 commit 了,怎么办?
只能说你还没推送,还行!!! 其实也不难,执行一下
css
git reset --mixed HEAD~1
其中的HEAD~1是将 HEAD
(当前分支的最新提交)回退到 前一个提交 (HEAD~1
表示"当前提交的前一个")。
如果你做了两次commit操作(还没有push),HEAD~2即可以回退这两次提交。
该命令的作用是
-
保留工作区内容 :文件内容不会丢失,工作区的文件仍然保留,而且它们变成了未暂存的状态。
-
撤销暂存区的内容:当前提交中所有已暂存的内容会被从暂存区移除,但仍然保留在工作区。
对比一下这两个命令
命令 | 作用 | 提交历史变化 | 文件变化(工作区和暂存区) |
---|---|---|---|
git reset --mixed HEAD |
什么都不做,撤回暂存区的更改(撤回add) | 不变 | 暂存区的文件被撤回到工作区,变成未暂存状态 |
git reset --mixed HEAD~1 |
回退到前一个提交,撤销最近的提交(撤回commit) | 提交历史回退 | 暂存区和工作区的文件被保留,变成未暂存状态 |
我不但 add 了,还 commit 了,还push了,怎么办?
好好好,只能说干的漂亮。来瞅瞅怎么办吧!
第一种方案:撤销最近的提交(并强制推送)
如果你想撤销 最近的提交,并且不保留该提交的修改(也就是说你代码没了,铁子),你可以使用
css
git reset --mixed HEAD~1
git reset --soft HEAD~1
git reset --hard HEAD~1
参数介绍:
--mixed
:将提交的文件恢复到工作区--soft
:将提交的文件恢复到暂存区,个人感觉不如mixed--hard
:丢弃该次提交的文件的改动,你代码没了(远端还在)
然后强制推送到远程仓库。
操作步骤:
-
回退到之前的提交:
css根据情况选择要使用的参数 git reset --hard HEAD~1
- 这会将你的
HEAD
回退到前一个提交,撤销最近的提交并丢弃(丢弃!丢弃!)修改。
- 这会将你的
-
强制推送到远程仓库:
cssgit push origin <branch-name> --force
- 使用
--force
强制推送到远程仓库,覆盖远程仓库中的历史提交。 - 同样也可以使用 HEAD~2回退到前两次提交
- 如果推送失败,可以看git管理员是否设置禁止强推,因为确实很危险,请看下面注意事项。
- 使用
注意:
- 丢失本地修改 :
--hard
会丢弃工作区和暂存区的修改,因此所有未提交的改动都会丢失。如果你想保留本地修改,可以使用git reset --mixed
或git reset --soft
。 - 强制推送 :
--force
会重写远程仓库历史,如果有其他人拉取过该提交,强制推送可能导致冲突或丢失其他人的工作,因此确保与团队成员沟通。也就是说如果团队其他成员已经拉取了你的提交,那么该成员的本地分支依然有你撤销的那次提交,此时该成员要是同步代码。就会将你已经撤销的提交再次推送到远端。所以需要团队成员执行如下命令(如果其他成员没有在该分支操作,也可以删除本地分支,重新拉取远端分支)
bash
git reset --hard origin/your-branch
第二种方案:生成一个新的提交,来撤销某一次提交
git revert
是用来撤销指定提交的命令,和 git reset
不同,git revert
不会修改历史,而是会生成一个新的提交,用于撤销指定提交的更改。因为它不会改变历史记录,而是通过创建一个新的提交来撤销之前的更改。
css
git revert --no-edit <commit-id>
-
<commit-id>
:要撤销的提交的哈希值(commit hash)。 -
可以通过
git log
获取提交的commit-id
。 -
--no-edit
:跳过编辑提交信息的步骤(commit),自动使用默认的撤销提交信息(一般使用这个)。 -
-n
或--no-commit
:执行撤销操作,但不会自动提交。你可以在撤销操作之后,修改文件或暂存区,然后手动提交。 -
--continue
:如果在执行git revert
时发生冲突,可以手动解决冲突后,使用git revert --continue
来继续撤销操作。 -
--edit
:在创建撤销提交时,允许你编辑提交信息。默认情况下, Git 会生成一个类似于Revert "commit message"
的提交信息,并打开你设置的默认文本编辑器(如 Vim、Nano、VSCode 等)来修改这个提交信息。
小小拙见,欢迎大家指正错误。