Git進階命令-revert

雨点的名字發表於2024-03-15

有關Git,之前有寫過兩篇文章:

  • Git五個常見問題及解決方法

  • Git進階命令-reset

一、revert命令使用場景

有一天專案經理跟你說,你開發上線的程式碼有問題,需要馬上撤回。

撤回?你第一反應那不就是 reset一下嘛。

正當你滿心歡喜,想找到需要reset 的commitId時,你驚喜的發現,master分支上已經有其他同同事提交的程式碼了。

怎麼辦?用reset的話 會把同事這部分程式碼也撤回了。

但此時情況又十分緊急,你絞盡腦汁也沒有想到好的辦法。只能任性的使用 reset。

然後低頭哈腰的讓同事把他們程式碼重新合一遍,從此你在你同事眼裡就打上了菜雞的標籤。


二、reset 和 revert 區別

reset命令是重置到一個記錄:git reset是將之前的提交記錄全部抹去,將 HEAD 指向自己重置的提交記錄;

revert命令是撤回一個記錄;git revert 操作是撤回某一次提交記錄,若之後又有提交,提交記錄還存在。


三、示例演示

我們透過示例來更好的理解 revert 命令

Git進階命令-revert

上面是最近的5次提交記錄,這時第3提交有錯誤,需要撤回這次提交。

執行命令

git revert  6274264

因為 revert 會生成一條新的提交記錄,這時會讓你編輯提交資訊,編輯完後 :wq 儲存退出就好了。

Git進階命令-revert

儲存之後,我們再來看當前提交的記錄

Git進階命令-revert

透過提交歷史日誌我們可以發現 雖然是撤回提交3,但之前4和5的提交記錄都還在,這點和reset 不一樣。

說明 git revert 可以保留完整的 git 歷史,對多人合作的分支來說比較友好。

同時我們也看下 1ccafe6 這次到底提交了什麼內容

檢視命令

git show 1ccafe6
Git進階命令-revert

我們可以看出,這次revert 僅僅撤回 第 3 次提交的內容。它採用逆向操作。如果之前有建立檔案->刪除檔案,新增程式碼->刪除程式碼,刪除程式碼->新增程式碼等。

透過這樣一種方式,來撤回具體某一次的操作。

git revert 是反做撤銷其中的commit-id,然後重新生成一個commit-id。本身不會對其他任何的提交commit-id產生影響


四、revert 合併提交有坑

在 git 的 commit 記錄裡,還有一種型別是合併提交,想要 revert 合併提交,使用上會有些不一樣。

Git進階命令-revert

現在 發現 3b5ad0c 合併分支提交有誤,需要撤回。

1、坑一

我們用上面同樣的命令

$ git revert  3b5ad0c
error: commit 3b5ad0cfcad49f7d2caa65449a8adf713da0accd is a merge but no -m option was given.
fatal: revert failed

使用剛剛同樣的 revert 命令,會發現命令列報錯了。

為什麼會這樣?

因為merge操作有2個分支,而revert不知道要還原哪個分支的提交。需要使用-m 1引數來告訴revert命令哪個是主線。

選擇主線就還原非主線,選擇非主線就還原主線。

修改命令

git revert -m 1 3b5ad0c
Git進階命令-revert

可以發現revert撤銷成功了。

2、坑二

在上面的場景中,雖然撤銷了master合併到feature這一次提交。

但如果你在切到master,再將修改後的程式碼提交。再次合併到feature分支時,會發現之前被 revert 的修改內容沒有重新合併進來。

那是因為你在feature 雖然使用了 revert 命令。但當前分支還是會保留之前合併的記錄,git 判斷有相同的 commitHash,就忽略了相關 commit 修改的內容。

這時就需要 revert 掉之前 revert 的合併提交。

具體命令

- 83c20e0是之前撤銷合併請求的commitId
git revert  83c20e0

這樣之後,之前 透過revert 撤回的程式碼才不會丟失。

對於 revert 撤回 Merge 提交,你必須重新把Revert的再Revert回去,不然Git會認為你不需要這些內容。也就是說,下一次Merge的時候,會丟失程式碼!


五、git revert 選項

git revert  -e / --edit  commit-id

這是預設的選項,你不需要單獨配置它,有了這個配置,在執行 git revert 後,會彈出預設編輯器來讓你對該次變更的資訊進行修改。

git revert  --no-edit  commit-id

與 -e / --edit 相反,傳入這個選項那麼就不會彈出預設編輯器來讓你修改變更資訊。

git revert  -n / --no-commit  commit-id

傳入這個選項意味著 git revert 執行後並不會自動產生commit,而是把改動的程式碼加到工作區和暫存區,使用者可以自行修改並提交commit。

總的來講 git revert其實算是一個進度往前走的逆向提交,也就是說HEAD版本及提交記錄將會繼續前進,只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。



**宣告**: 公眾號如需轉載該篇文章,發表文章的頭部一定要 告知是轉至公眾號: 後端元宇宙。同時也可以問本人要markdown原稿和原圖片。其它情況一律禁止轉載!