Git 圖文詳解(八):后悔藥 - 撤銷變更
- 1.后悔指令 🔥
- 2.回退版本 reset
- 3.撤銷提交 revert
- 4.checkout / reset / revert 總結
發現寫錯了要回退怎么辦?看看下面幾種后悔指令吧!
- ? 還沒提交的怎么撤銷? ——
checkout
、reset
- 還未提交的修改(工作區、暫存區)不想要了,用簽出指令(
checkout
)進行撤銷清除。 - 或者用
checkout
的新版回滾指令reset
。
- 還未提交的修改(工作區、暫存區)不想要了,用簽出指令(
- ? 已提交但沒有
push
的提交如何撤銷?——reset
、revert
。 - ? 已
push
的提交如何撤銷?—— 同上,先本地撤銷,然后強制推送git push origin -f
,??注意慎用! 記得先pull
獲取更新。
1.后悔指令 🔥
| |
---|---|
git checkout . | 撤銷工作區的(未暫存)修改,把暫存區恢復到工作區。不影響暫存區,如果沒暫存,則撤銷所有工作區修改 |
git checkout [file] | 同上,file 指定文件 |
git checkout HEAD . | 撤銷工作區、暫存區的修改,用 HEAD 指向的當前分支最新版本替換工作區、暫存區 |
git checkout HEAD [file] | 同上,file 指定文件 |
git reset | 撤銷暫存區狀態,同 git reset HEAD ,不影響工作區 |
git reset HEAD [file] | 同上,指定文件 file ,HEAD 可省略 |
git reset [commit] | 回退到指定版本,清空暫存區,不影響工作區。工作區需要手動 git checkout 簽出 |
git reset --soft [commit] | 移動分支 master 、HEAD 到指定的版本,不影響暫存區、工作區,需手動 git checkout 簽出更新 |
git reset --hard HEAD | 撤銷工作區、暫存區的修改,用當前最新版 |
git reset --hard HEAD~ | 回退到上一個版本,并重置工作區、暫存區內容 |
git reset --hard [commit] | 回退到指定版本,并重置工作區、暫存區內容 |
git revert [commit] | 撤銷一個提交,會用一個新的提交(原提交的逆向操作)來完成撤銷操作,如果已 push 則重新 push 即可 |
git checkout .
、git checkout [file]
會清除工作區中未添加到暫存區的修改,用暫存區內容替換工作區。git checkout HEAD .
、git checkout HEAD [file]
會清除工作區、暫存區的修改,用HEAD
指向的當前分支最新版本替換暫存區、工作區。
# 只撤銷工作區的修改(未暫存)
$ git checkout .
Updated 1 path from the index# 撤銷工作區、暫存區的修改
$ git checkout HEAD .
Updated 1 path from f951a96
2.回退版本 reset
reset
是專門用來撤銷修改、回退版本的指令,支持的場景比較多,多種撤銷姿勢,所以參數組合也比較多。簡單理解就是移動 master
分支、HEAD
的 “指針” 地址,理解這一點就基本掌握 reset
了。
如下圖:
- 回退版本
git reset --hard v4
或git reset --hard HEAD~2
,master
、HEAD
會指向v4
提交,v5
、v6
就被廢棄了。 - 也可以重新恢復到
v6
版本:git reset --hard v6
,就是移動master
、HEAD
的 “指針” 地址。
reset
有三種模式,對應三種參數:mixed
(默認模式)、soft
、hard
。三種參數的主要區別就是對工作區、暫存區的操作不同。
mixed
為默認模式,參數可以省略。- 只有
hard
模式會重置工作區、暫存區,一般用這個模式會多一點。
穿梭前,用 git log
可以查看提交歷史,以便確定要回退到哪個版本。要重返未來,用 git reflog
查看命令歷史,以便確定要回到未來的哪個版本。
git reset [--soft | --mixed | --hard] [HEAD]# 撤銷暫存區
$ git reset
Unstaged changes after reset:
M R.md# 撤銷工作區、暫存區修改
$ git reset --hard HEAD# 回退版本庫到上一個版本,并重置工作區、暫存
$ git reset --hard HEAD~# 回到原來的版本(恢復上一步的撤銷操作),并重置工作區、暫存
$ git reset --hard 5f8b961# 查看所有歷史提交記錄
$ git reflog
ccb9937 (HEAD -> main, origin/main, origin/HEAD) HEAD@{0}: commit: 報表新增導入功能
8f61a60 HEAD@{1}: commit: bug:修復報表導出bug
4869ff7 HEAD@{2}: commit: 用戶報表模塊開發
4b1028c HEAD@{3}: commit: 財務報表模塊開發完成
3.撤銷提交 revert
安全的撤銷某一個提交記錄,基本原理就是生產一個新的提交,用原提交的逆向操作來完成撤銷操作。注意,這不同于 reset
,reset
是回退版本,revert
只是用于撤銷某一次歷史提交,操作是比較安全的。
如上圖:
- 想撤銷
v4
的修改,執行git revert v4
,會產生一個新的提交v-4
,是v4
的逆向操作。 - 同時更新
maser
、HEAD
“指針” 位置,以及工作區內容。 - 如果已
push
則重新push
即可。
# revert撤銷指定的提交,“-m”附加說明
$ git revert 41ea42 -m '撤銷對***的修改'
[main 967560f] Revert "123"1 file changed, 1 deletion(-)
4.checkout / reset / revert 總結
| | | |
---|---|---|---|
主要作用(撤銷) | 撤銷工作區、暫存區未提交修改 | 回退版本,重置工作區、暫存區 | 撤銷某一次提交 |
撤銷工作區 | git checkout [file] | git reset HEAD [file] | |
撤銷工作區、暫存區 | git checkout HEAD [file] | git reset --hard HEAD [file] | |
回退版本 | git reset --hard [commit] | ||
安全性 | 只針對未提交修改,安全 | 如回退了已 push 提交,不安全 | 安全 |