天天看點

模拟面試官:Git 如何進行撤銷操作?

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

在 Git 中,有三個指令可以用來撤銷操作,分别是 git reset、git revert、git checkout。

背景知識

Git 倉庫由三個部分組成,工作區、暫存區和 Commit 曆史。

我們在工作區進行開發,然後通過 git add 将檔案修改添加到暫存區,然後 git commit 送出更改,就把暫存區的所有内容送出到了目前分支的 Commit 曆史中去了。

git revert

該操作隻能作用于 Commit,而不能作用于檔案。同時,該操作會建立一個新的 Commit 來撤銷之前送出的更改,它不會去修改現有的曆史記錄。

換句話說,這個指令是安全的,它不會丢失 Commit 記錄,隻會新增。

git reset

這個指令相對來說就要複雜一點了,它能夠同時作用于 Commit 和檔案,用來撤銷還沒有送出到遠端倉庫的改動。

對于 Commit 來說,git reset 會移動 HEAD 的位置,并且還可以變更暫存區和工作區,該操作有三個選項:

1.--soft:該選項會修改 HEAD 位置,而工作區和暫存區不會有變化

2.--mixed:預設選項,會修改 HEAD 位置以及暫存區,而工作區不會有變化

3.--hard:修改 HEAD 位置,暫存區和工作區都會被更新到指定 Commit 的狀态

是不是有點繞,沒關系我們實戰說話:

模拟面試官:Git 如何進行撤銷操作?

現在,我們使用 git log 可以看到有三條 commit 記錄,使用 git status 可以看到暫存區的狀态為空。

接下來,我們使用 git reset HEAD~1 指令,然後我們再次使用 git log 和 git status 指令,可以看到 Commit 曆史中,HEAD 的位置已經修改到了送出 b 的位置,同時在工作目錄中我們還能找到 c 檔案,并且 c 檔案被移出了暫存區,這就是 mixed。

接下來,我們再次将 c 檔案送出回去恢複成初始狀态,這次我們在指令後加上 --soft,我們再來看,HEAD 的位置依然被修改了,并且工作區 c 檔案依然存在,不同的是 c 依然在暫存區中。

最後我們加上 --hard 再來看一看,我們可以發現,HEAD 變了,暫存區和工作區的 c 檔案都被移除了,這個參數比較危險,也就不建議大家在公共分支上進行操作了。

說完了 Commit,那檔案是如何撤銷的呢?對于檔案來說,上面提到的三個參數是不起作用的,它會去更新暫存區的對應檔案到指定 Commit 的時候的版本。

還是上面的例子,如果我使用指令 git reset HEAD~1 c,會出現什麼結果呢?大家可以想一想,答案是,它會将 c 檔案更新到上一個 Commit 的時候的版本,也就是還沒有被建立的狀态,是以你執行 git status 可以發現暫存區中存在 delete: c,這就是檔案的撤銷。

git checkout

當你 checkout Commit 的時候,會将 HEAD 指向你指定的 Commit,并且這個沒有分支指向這個 HEAD,是以 checkout 之後,會處于一個 detached HEAD 的分支,如果你要送出 Commit 到這個分支,你應該先 checkout 一個分支出來,然後再進行送出。

當你 checkout 檔案的時候,checkout 指令和 reset 就有點類似,但是它不會更新暫存區,隻會更新工作區,當你使用 git checkout 的時候,就會把工作區的對應檔案更新到指定 Commit 版本的狀态,當你使用 git checkout -- 的時候就會撤銷掉在工作區這個檔案的修改。

對于這些操作,大家一定要注意,不要亂用,把倉庫搞亂了就不好了。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-05-27

本文作者:小烜同學

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”