Menu
快讀
  • 旅遊
  • 生活
    • 美食
    • 寵物
    • 養生
    • 親子
  • 娛樂
    • 動漫
  • 時尚
  • 社會
  • 探索
  • 故事
  • 科技
  • 軍事
  • 国际
快讀

git學習(3)–代碼回滾

2020 年 1 月 17 日 码农刘
git學習(3)--代碼回滾

時光一去不複返,我們都知道的道理,但是在git的世界裏.我們可以很輕松的回到過去.

要想隨意的將代碼切換到過去的某一個版本,那我們肯定要先熟悉的一個命令就是查看曆史,git log。

默認情況下,會根據提交時間列出提交曆史。每一個曆史都會有一個ID,該ID是一個SHA1計算的值,用16進制表示的。

如果想看最近的兩次記錄可以添加 -2 參數。
如果你想看每次提交修改的內容可以添加 -p 參數
如果曆史太多,第一次使用的時候會發現,怎麽退出不了。這時你就可以直接按q鍵就退出來了。

別的參數自己可以去看看git官網。接下來我們開始時空穿梭吧!

在之前的分享中,我們介紹了git的幾個區。我們先根據這幾個區來分別說一下,怎麽進行回滾

工作區。

工作區相對比較簡單,我們可以用git checkout 來回滾(這裏我們用撤銷感覺能好一點)

git checkout test1.txt // 撤銷指定文件
git checkout . //撤銷整個工作區,後面不要忘記有個點的哦
git學習(3)--代碼回滾

這樣就結束了麽?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學習(3)--代碼回滾

然後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] 呢?這個就是另外一番景象了.

git學習(3)--代碼回滾

這樣我們可以看出來,這其實是從你的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學習(3)--代碼回滾

此時我們可以看到我們剛才提交的記錄

然後我們還是使用

git reset HEAD^ // HDEA^表示的是前一個分支,HEAD^^標識前連個分支.你也可以用HEAD~數字表示前幾個分支,可以代替具體的commit id
git log
git學習(3)--代碼回滾

我們可以看到,上面的的提交記錄的第一條沒有了,這樣就實現了版本回退.你本地版本回退了,但是跟遠程倉庫不能保持一致了.所以你在本地修改了,要想提交就有可能出現沖突.沖突是可以解決的,但是沖突多了就很煩了呀.

不是很建議在本地的開發環境進行版本回退.建議在生産環境使用.通常是某個人代碼引起了事故,一時半會還解決不了.只能先回退,等解決了,再更新成最新的.

當然你能回退,可能還是能撤銷回退的.你想撤銷,你要知道最開始的那個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操作.這個能不能算是版本回退,應該叫版本向前.他是把以前的一個版本弄成一個新的提交

git學習(3)--代碼回滾

我revert的那個版本跟我們當前有沖突,解決了一下沖突

然後我們git log看一下

git學習(3)--代碼回滾

可以看出來我們的版本是向前提交了一個記錄.

這種操作也要慎用呀,最好是不要用,尤其是多人協作工作的時候(你要是自己一個人,隨意折騰),因爲這樣會把你回滾那個版本後面所有的提交都給覆蓋了,如果你直接提交到線上了.那別人寫的代碼也會消失了,這個損失.就無法估量了.一定要慎用.

總結:

看完是不是覺得版本回滾很容易呀.做一個時空穿梭者是不是很爽呢.其實這個代碼回滾是我想寫這一系列的初衷,後面想了想,中間還有很多細節不了解.所以才決定從頭到尾學習分享一下.雖然不是那麽詳細,感覺應對工作中的大部分問題足夠了.

相關文章:

  • 讓你的Linux命令騷起來
  • 華爲都開始用Linux了,你還不來了解下全球第三大桌面操作系統?
  • shell腳本實現Spring boot項目在Linux服務器上自動打包並運行
  • 龍嶺迷窟:陳玉樓本是湘西卸嶺魁首,晚年爲何潦倒,在陝北算命?
  • 最新盤點!學校假期即將到來,新加坡這11個地方最適合打發孩子~
  • 最新盤點!學校假期即將到來,新加坡這11個地方最適合打發孩子
科技

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

©2025 快讀 | 服務協議 | DMCA | 聯繫我們