[Git] How To Rollback To A Specific Version?

這篇分享我實際上會用的指令,也是我覺得比較好用的,跟碰過的一些狀況處理。

假設你現在的commit紀錄,長這樣

2a73943 (HEAD -> qq, origin/qq) v2
c7a8812 v1

或者你知道當前版本的commit hash, 例如現在的commit hash是 2a73943, 你也可以下這種

git reset也可以做到一樣的事情,你可以直接下

一樣會讓版本回到v1,回到v1後想再回到v2的code,就改成下

git reset c7a8812 可以想成是 I want c7a8812 version.

網路上會有大片文章跟你說,reset跟revert的差別,但在這案例中,只是想要將Code回到v1,還有可以切到各種版本的code來說,還沒有感受到差異。

Revert a merge commit issue

但還是有差異的,如果你現在的版本是merge action,想回到v2版本。比如現在的commit log如下。

bb10cc3 (HEAD -> qq) Merge branch ‘test’ into qq
9968e70 v2

你下了剛剛以上的兩種revert指令,都會跟你噴一樣的錯誤。

研究了一下,是因為在git世界觀裡面,它認為merge這行為,你可能來自很多個parent merge進來的,git不會自動偵測哪個是你主要的parent,哪個是你不想要的parent,所以你要告訴它,你想revert到這版本的哪一個parent。

想知道有那些parent,可以下git log,看Merge欄位,它會把這個commit的parent照順序排好給你看。延續這個例子,bb10cc3 的parent 一號是9968e70,parent二號是375c060。

想看某個commit hash,到底做了什麼,可以下這指令,這指令會告訴你簡短的資訊。

當然你也可以看很完整,改了哪幾行code,想看相當於git diff功能的東西,可以下

於是,你決定要回到v2,也就是9968e70這個commit hash,它剛好是parent 一號,你可以下這個指令。

或是給它 commit hash

這案例中,下HEAD會有一樣效果,是因為HEAD剛好指向bb10cc3這個 commit hash。

當然,如果你想回到 375c060 (二號parent)的版本,可以下

此時可能會好奇,git reset不是也可以回到某版本的code嗎?

可以的,以下面這案例來說,

bb10cc3 (HEAD -> qq) Merge branch ‘test’ into qq
9968e70 v2
649dee8 v1.5

可以下

程式會回到649dee8這版本。
你想說那我直接加上新的code,再push進去不就好了?

當然可以,但revert有個比較好的地方,是他會create一個新的commit, 記載了你做了revert的動作,這也是避免有跟你協作的人,日後在改的時候,看了git commit log,會一臉懵。

後記,有文章說reset會丟棄這版本之後的所有紀錄,revert不會。其實並不是說你reset之後,所有commit紀錄就沒了,只是git log查不到,但你用 git reflog,還是能查的到歷史的commit log,還是能在把code reset到某個版本。

其它你救援時候可能需要的指令

  1. Git checkout specific commit to new branch

2. Get a specific version of a specific file.

3. Get a specific version of several specific files.

4. Recover from git reset --hard?

1. 回復上一次做 git reset --hard的動作

Scenario 2. 回復到某個特定的commit

4b6ok2e (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to origin/master
221k07d HEAD@{1}: pull: Merge branch ‘test’ into qq
7s32ec7 HEAD@{2}: commit: v1
fa89k59 HEAD@{3}: commit: v2
3456936 HEAD@{4}: commit (amend): v3
033g3c0 HEAD@{5}: commit: v4

你下這條指令,就可以回到 “v4” 這條commit

或是

都可以。

There are a thousand Angels in a thousand people's eyes. 一千個人有一千個Angel.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store