有關Git,之前有寫過兩篇文章:
-
Git五個常見問題及解決方法
-
Git進階命令-reset
一、revert命令使用場景
有一天專案經理跟你說,你開發上線的程式碼有問題,需要馬上撤回。
撤回?你第一反應那不就是 reset
一下嘛。
正當你滿心歡喜,想找到需要reset 的commitId時,你驚喜的發現,master分支上已經有其他同同事提交的程式碼了。
怎麼辦?用reset的話 會把同事這部分程式碼也撤回了。
但此時情況又十分緊急,你絞盡腦汁也沒有想到好的辦法。只能任性的使用 reset。
然後低頭哈腰的讓同事把他們程式碼重新合一遍,從此你在你同事眼裡就打上了菜雞的標籤。
二、reset 和 revert 區別
reset命令是重置
到一個記錄:git reset是將之前的提交記錄全部抹去,將 HEAD 指向自己重置的提交記錄;
revert命令是撤回
一個記錄;git revert 操作是撤回某一次提交記錄,若之後又有提交,提交記錄還存在。
三、示例演示
我們透過示例來更好的理解 revert 命令
上面是最近的5次提交記錄,這時第3提交有錯誤,需要撤回這次提交。
執行命令
git revert 6274264
因為 revert 會生成一條新的提交記錄,這時會讓你編輯提交資訊,編輯完後 :wq
儲存退出就好了。
儲存之後,我們再來看當前提交的記錄
透過提交歷史日誌我們可以發現 雖然是撤回提交3,但之前4和5的提交記錄都還在,這點和reset 不一樣。
說明 git revert 可以保留完整的 git 歷史,對多人合作的分支來說比較友好。
同時我們也看下 1ccafe6
這次到底提交了什麼內容
檢視命令
git show 1ccafe6
我們可以看出,這次revert 僅僅撤回 第 3 次提交的內容。它採用逆向操作。如果之前有建立檔案->刪除檔案,新增程式碼->刪除程式碼,刪除程式碼->新增程式碼等。
透過這樣一種方式,來撤回具體某一次的操作。
git revert 是反做撤銷其中的commit-id,然後重新生成一個commit-id。本身不會對其他任何的提交commit-id產生影響
四、revert 合併提交有坑
在 git 的 commit 記錄裡,還有一種型別是合併提交,想要 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
可以發現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原稿和原圖片。其它情況一律禁止轉載!