最近工作中準備釋出生產,於是將開發分支合併到 master 並且提交到遠端,悠哉悠哉地坐等上線。可惡的產品 dog 又說先別上線,讓測試環境給一線先體驗一下,FUCK!怎麼辦?程式碼已經合併推送到遠端,如果不撤回會影響其他團隊的釋出,由於以前只是對 git reset 和 git revert 瞭解一下,並沒有深入去使用過,所以在專案程式碼中不敢輕易妄動,只能拜託其他同事幫忙了。吃了這次虧,決定深入學習一下這兩個命令。
1、git reset 重置 commit
我們先建立兩個 commit
現在我們使用 git reset 不加引數對commit進行重置
git reset 不加引數的情況預設使用的引數是 –mixed ,該引數模式是將提交回退到指定版本,將該版本之後所提交的改動回退到工作區。如果我們提交出錯還需要編輯再提交就可以使用該模式。同時我們發現 reset 到目標版本後,之前的最新版本的 commit 已經被丟掉了。
當然我們使用 git reflog 是可以找回被 git reset 丟掉的 commit 的,我們利用 git reflog 和 git reset 恢復剛才的 reset
測試 git reset –soft
我們可以看到當帶 –soft 引數時,回退目標版本後的修改內容會回退到暫存區
測試 git reset –hard
從圖中我們可以看出,git reset 帶 –hard 引數後,會丟掉目標版本之後的修改,此場景適用於回退,且不需要後面版本內容。
使用 reset 回退版本後,由於本地版本先於遠端版本,推送時需要使用 -f 強推引數,git push -f 。
2、git revert
git revert 是將 commit 中的某一版本丟掉,然後將該版本前後的版本內容進行合併生成新的 commit ,對比 reset ,revert 不會丟失 commit 資訊,而 reset 會丟失 commit 資訊。
這個可以應用到場景:A同學提交程式碼後並推送到遠端,版本為a1;B同學這時拉取程式碼進行開發,A同學a1版本有問題,需要回退,於是A同學將a1版本回退並推送到遠端。B同學開發後生成了B版本,提交到遠端,這裡B同學還是把A同學的a1版本提交上去了。現在我們就要把 a1 版本丟掉,並且保留B同學的 b1 版本。
總結:使用 git reset 丟失已經提交的 commit ,可以進行再編輯處理進行提交,使用git revert 丟掉 commit 的修改並生成新的 commit 進行提交,但是有丟掉版本的的前後版本在合併成新的 commit 時,容易生成衝突。
本作品採用《CC 協議》,轉載必須註明作者和本文連結