時光一去不複返,我們都知道的道理,但是在git的世界裏.我們可以很輕松的回到過去.
要想隨意的將代碼切換到過去的某一個版本,那我們肯定要先熟悉的一個命令就是查看曆史,git log。
默認情況下,會根據提交時間列出提交曆史。每一個曆史都會有一個ID,該ID是一個SHA1計算的值,用16進制表示的。
如果想看最近的兩次記錄可以添加 -2 參數。 如果你想看每次提交修改的內容可以添加 -p 參數 如果曆史太多,第一次使用的時候會發現,怎麽退出不了。這時你就可以直接按q鍵就退出來了。
別的參數自己可以去看看git官網。接下來我們開始時空穿梭吧!
在之前的分享中,我們介紹了git的幾個區。我們先根據這幾個區來分別說一下,怎麽進行回滾
工作區。
工作區相對比較簡單,我們可以用git checkout 來回滾(這裏我們用撤銷感覺能好一點)
git checkout test1.txt // 撤銷指定文件 git checkout . //撤銷整個工作區,後面不要忘記有個點的哦
這樣就結束了麽?NO!我們來看看能不能撤銷到指定版本。首先我們先提交三個版本到遠程分支上。
echo "submit 1" >test1.txt echo "submit 1">test2.txt git commit -m"提交1" test1.txt test2.txt git push origin master echo "submit 2" >test1.txt echo "submit 2">test2.txt git commit -m"提交2" test1.txt test2.txt git push origin master echo "submit 3" >test1.txt echo "submit 3">test2.txt git commit -m"提交3" test1.txt test2.txt git push origin master
然後git log查看一下提交記錄
git log
我們可以看到我們提交的兩次記錄,現在我們是在提交3那個版本。我們要回到提交1那個版本怎麽做呢?
git checkout 'commit id' test1.txt // 回滾一個文件 git checkout 'commit id' . // 回滾整個工作區
如果你不想回去了,還是想朝前看,那你就可以
git checkout HEAD test1.txt git checkout HEAD .
他是回滾到HEAD指向的那個提交。(HEAD是一個指針,指向的是當前本地分支的最頭上的那個提交)
其實,我們可以看出來,我們此次的回滾,修改的記錄直接給我們放在暫存區,那上面的問題也可以當成如何回滾暫存區的代碼?下面我們會說到這個問題.各位看官,不要著急
git checkout [commit id] <文件> 不算是版本的回滾,只能說是代碼的回滾。文件變成了指定版本的文件內容。但是版本號還是沒有變化的。
如果我們不加文件名,只用git checkout [commit id] 呢?這個就是另外一番景象了.
這樣我們可以看出來,這其實是從你的commit id,分離出了一個新的相當于臨時分支的東西,你可以在這個分支上做任何正常的操作.但是你切換到別的分支.當前分支的修改也會丟失.你當然也不可能push的到遠程倉庫的.
但是你可以從當前的臨時分支創建一個新的分支出來.這樣就可以保存臨時分支中的所有修改.個人理解,這個命令就是從一個指定的版本創建出一個分支.平常我們創的分支都是從當前HEAD創建的一個新的分支.如果工作區或者暫存區有修改,會終止操作的.
暫存區
暫存區,是我們工作區add進的。通過上圖,我們可以發現,人家已經跟你說怎麽回滾了。對!你沒想錯,就是
git reset HEAD <文件>
這個操作僅是將暫存區的修改,撤回到了工作區,在工作區,你還需要
git checkout <文件>
來撤銷修改
這塊看起來還比價簡單,那接下來我們看看我們commit後的怎麽來回滾吧
commit
這個應該真正的算是版本回滾了
我們再修改一下工作區,並提交到本地分支
echo "submit 4">test1.txt git commit -m"提交4" test1.txt git log
此時我們可以看到我們剛才提交的記錄
然後我們還是使用
git reset HEAD^ // HDEA^表示的是前一個分支,HEAD^^標識前連個分支.你也可以用HEAD~數字表示前幾個分支,可以代替具體的commit id git log
我們可以看到,上面的的提交記錄的第一條沒有了,這樣就實現了版本回退.你本地版本回退了,但是跟遠程倉庫不能保持一致了.所以你在本地修改了,要想提交就有可能出現沖突.沖突是可以解決的,但是沖突多了就很煩了呀.
不是很建議在本地的開發環境進行版本回退.建議在生産環境使用.通常是某個人代碼引起了事故,一時半會還解決不了.只能先回退,等解決了,再更新成最新的.
當然你能回退,可能還是能撤銷回退的.你想撤銷,你要知道最開始的那個commit id,然後git reset <那個commit id> 就可以了.不能用HEAD代替了.此時HEAD的指針,已經指到你回退的那個版本了.
這個還可以加幾個參數
git reset --soft HEAD^ // 回退後,撤銷了commit,保留暫存區的 git reset --mixed HEAD^ //(和不加參數是一樣的效果) 回退撤銷了commit,撤銷暫存區的後,保留在工作區 git reset --hard HEAD^ // 回退後,撤銷commit,撤銷暫存區,撤銷工作區的
通常我們修改的代碼不知不覺丟了,應該就是使用了git reset –hard來回退代碼.我這裏還可以分享一個小技巧,IDE有個本地曆史記錄可以使用哦
其實呢,還有另外一個命令git rever操作.這個能不能算是版本回退,應該叫版本向前.他是把以前的一個版本弄成一個新的提交
我revert的那個版本跟我們當前有沖突,解決了一下沖突
然後我們git log看一下
可以看出來我們的版本是向前提交了一個記錄.
這種操作也要慎用呀,最好是不要用,尤其是多人協作工作的時候(你要是自己一個人,隨意折騰),因爲這樣會把你回滾那個版本後面所有的提交都給覆蓋了,如果你直接提交到線上了.那別人寫的代碼也會消失了,這個損失.就無法估量了.一定要慎用.
總結:
看完是不是覺得版本回滾很容易呀.做一個時空穿梭者是不是很爽呢.其實這個代碼回滾是我想寫這一系列的初衷,後面想了想,中間還有很多細節不了解.所以才決定從頭到尾學習分享一下.雖然不是那麽詳細,感覺應對工作中的大部分問題足夠了.