Git進階命令-revert

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

一、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原稿和原圖片。其它情況一律禁止轉載!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章