如何優雅的進行版本回退

在版本迭代開發過程當中,相信不少人都會有過錯誤提交的時候(至少良許有過幾回這樣的體驗)。這種狀況下,菜鳥程序員可能就會虎驅一震,緊張得不知所措。而資深程序員就會微微一笑,摸一摸鋥亮的腦門,而後默默的進行版本回退。git

對於版本的回退,咱們常常會用到兩個命令:程序員

  1. git reset
  2. git revert

那這兩個命令有何區別呢?先不急,咱們後文詳細介紹。面試

git reset

假如咱們的系統如今有以下幾個提交: 架構

其中:A 和 B 是正常提交,而 C 和 D 是錯誤提交。如今,咱們想把 C 和 D 回退掉。而此時,HEAD 指針指向 D 提交(5lk4er)。咱們只需將 HEAD 指針移動到 B 提交(a0fvf8),就能夠達到目的。學習

只要有 git 基礎的朋友,必定會想到 git reset 命令。完整命令以下:網站

git reset --hard a0fvf8

命令運行以後,HEAD 指針就會移動到 B 提交下,以下圖示:spa

而這個時候,遠程倉庫的 HEAD 指針依然不變,仍在 D 提交上。因此,若是直接使用 git push 命令的話,將沒法將更改推到遠程倉庫。此時,只能使用 -f 選項將提交強制推到遠程倉庫:指針

git push -f

採用這種方式回退代碼的弊端顯而易見,那就是會使 HEAD 指針往回移動,從而會失去以後的提交信息。未來若是忽然發現,C 和 D 是多麼絕妙的想法,可它們已經早就消失在歷史的長河裏了。code

並且,有些公司(好比良許的公司)明令禁止使用 git reset 命令去回退代碼,緣由與上述同樣。因此,咱們須要找到一個命令,既能夠回退代碼,又能夠保存錯誤的提交。這時,git revert 命令就派上用場了。blog

git revert

git revert的做用經過反作建立一個新的版本,這個版本的內容與咱們要回退到的目標版本同樣,可是HEAD指針是指向這個新生成的版本,而不是目標版本。

使用 git revert 命令來實現上述例子的話,咱們能夠這樣作:先 revert D,再 revert C (有多個提交須要回退的話須要由新到舊進行 revert):

git revert 5lk4er
git revert 76sdeb

這裏會生成兩個新有提交:D' 和 C',以下圖示:

這裏只有兩個提交須要 revert,咱們能夠一個個回退。但若是有幾十個呢?一個個回退確定效率過低並且容易出錯。咱們可使用如下方法進行批量回退:

git revert OLDER_COMMIT^..NEWER_COMMIT

這時,錯誤的提交 C 和 D 依然保留,未來進行甩鍋的時候也有依可循。並且,這樣操做的話 HEAD 指針是日後移動的,能夠直接使用 git push 命令推送到遠程倉庫裏。而這種作法,正是企業所鼓勵的。

咱們再舉個更難一點的例子。

假如如今有三個提交,但很不巧的是,那個錯誤的提交恰好位於中間。以下圖示:

這時,直接使用 git reset 命令將 HEAD 指針重置到 A 提交顯然是不行的,由於 C 提交是正確的,須要保留的。先把 C 提交 及 B 批次所有回退,再使用 cherry-pick 命令將 C 提交從新再生成一個新的提交 C'',這樣就實現了將 B提交回退的需求。完整的過程以下:


最後,最近不少小夥伴找我要Linux學習路線圖,因而我根據本身的經驗,利用業餘時間熬夜肝了一個月,整理了一份電子書。不管你是面試仍是自我提高,相信都會對你有幫助!

免費送給你們,只求你們金指給我點個贊!

電子書 | Linux開發學習路線圖

也但願有小夥伴能加入我,把這份電子書作得更完美!

有收穫?但願老鐵們來個三連擊,給更多的人看到這篇文章

推薦閱讀:

相關文章
相關標籤/搜索