我們在使用git時,經常用到版本回退的功能。git中提供了兩個命令一個是reset,另一個是revert。其中reset命令比較好理解,直接git reset 版本哈希編碼即可恢復到指定的版本號,因為這種操作無法再回復撤消版本號後面的版本(比如 我們軟件經過了a->b->c,如果我們reset 到b的話,就再也無法找到c這個版本了)而且日誌也同時恢復到了版本2,因此在實際工作中通常不建議使用reset。
revert命令是撤消提交(原理就是複製要撤消版本前的那一個版本來做為新的提交),這種操作非常巧秒的保留了每一個版本,因此這個在版本撤消中一直使用。
下面我們實例說明revert的實現原理和效果:
比如我們有以下版本流程:
上圖中的幾個箭頭說明:
HEAD旁邊的箭頭是指當前HEAD指針指向4這個版本。
4左邊的箭頭是代表4這個版本的父版本是3,以此類推3的父版本是2,2的父版本是1。
之所以這樣,這是git的底層邏輯決定的。因為git每執行一次commit,相當於提交了個commit tree,除了第一次commit tree的父引用為空外,以後每一次commit都會記錄著上一次commit tree的指針地址。也正因為此,我們的git流程才可以方便的執行reset或revert指令。
我們這裡做一下測試來學習revert的工作原理:
本例我們先創建一個空的倉庫,然後創建一個a.txt文檔,分別進行如下操作增加行1內容:111
git add a.txt
git commit -m "1"
增加行2內容:222
git add a.txt
git commit -m "2"
增加行3內容:333
git add a.txt
git commit -m "3"
增加行4內容:444
git add a.txt
git commit -m "4"
以上就是我們進行了4次提交,分別是"1","2","3","4",所以當前HEAD 指向"4"這個提交。
我們這時查看git 日誌的效果如下:
假設我們現在想要退回到版本2,那麼我們需要兩步:
1、使用git revert 6fec45 命令使版本退回到版本3(這個你也可以理解為撤消6fec45這個commit)
運行這個命令後,a.txt內容為:
查看git 日誌如下:
2、使用git revert 3ee3df 命令使版本退回到版本2(也可以理解為撤消3ee3df這個commit)
本步驟說明如下:
因第1步我們達到的效果就是複製一個新的版本,其狀態就是版本"3"的那次提交。因此我們可以再進行git revert 3ee3df命令,這樣同步驟1一個道理,執行後,我們就得到了"2"的複製版本。即狀態達到了"2"這個版本。
這時我們查看a.txt文件內容,正如我們所料,內容如下圖所示:
我們查看git日誌,可以看到,同樣執行revert 3ee3df後,其實是新增加了一個commit。
總結一下,那麼到下面,我們的版本流程應該是這樣:
如果這次我們想退回到版本4 ,那應該怎麼做呢?很簡單,只需要先revert 6那個提交,然後再revert 5那個提交即可。
閱讀更多 子曰java 的文章