Appearance
我 add 错误文件了,怎么办?
bash
git reset该命令的作用是:
撤销暂存:所有已经 git add 的文件会变成未暂存状态。
保留工作区的修改:文件内容保持不变,仍然在工作区。你可以继续提交文件或者做一些修改之后再提交文件。
我不但 add 了还 commit 了,怎么办?
bash
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了,怎么办?
第一种方案:撤销最近的提交(并强制推送)
如果你想撤销 最近的提交,并且不保留该提交的修改(也就是说你代码没了),你可以使用
bash
git reset --mixed HEAD~1
git reset --soft HEAD~1
git reset --hard HEAD~1参数介绍:
- --mixed:将提交的文件恢复到工作区
- --soft:将提交的文件恢复到暂存区,个人感觉不如mixed
- --hard:丢弃该次提交的文件的改动,你代码没了(远端还在)
然后强制推送到远程仓库。
具体步骤
回退到之前的提交:
bash
# 根据情况选择要使用的参数
git reset --hard HEAD~1这会将你的 HEAD 回退到前一个提交,撤销最近的提交并丢弃(丢弃!丢弃!)修改。
强制推送到远程仓库:
bash
git 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 不会修改历史,而是会生成一个新的提交,用于撤销指定提交的更改。因为它不会改变历史记录,而是通过创建一个新的提交来撤销之前的更改。
bash
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 等)来修改这个提交信息。