Git學習-Git時光機之版本回退(二)

Git,是Linus花了兩週時間用C寫的一個分佈式版本控制系統。牛人該怎麼定義?html

零、結論先行

倒敘總結一下:git

  • HEAD指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
    使用命令 git reset --hard HEAD^回退到上一個版本
  • 穿梭前,用git log能夠查看提交歷史,以便肯定要回退到哪一個版本。app

  • 要重返將來,用git reflog查看命令歷史,以便肯定要回到將來的哪一個版本。分佈式

下面繼續咱們的學習:學習

1.Git安裝(略)。this

2.建立Git版本庫(略)——見Git學習-Git配置(一)3d

1、提交Git

接下來,咱們上傳一個文件到Git。編輯一個readme.txt文件,內容以下:版本控制

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.

將其放到E:\My Git Project\learngit目錄下,由於這是以前建立的一個Git倉庫,放到其餘地方Git再厲害也找不到這個文件。指針

  • 將一個文件放到Git倉庫須要兩步:

(1)使用git add將文件添加到倉庫:日誌

$ git add readme.txt

(2)使用git commit將文件提交到倉庫:

git commit -m "wrote a readme file"

  注:git commit命令,-m後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。

2、修改Git

如今,你已經學會了修改文件,而後把修改提交到Git版本庫,如今,再練習一次,修改readme.txt文件以下:

Git is a distributed version control system.
Git is free software distributed under the GPL.

而後嘗試提交:

$ git add readme.txt
$ git commit -m "append GPL"
[master ef7f4d0] append GPL
 1 file changed, 1 insertion(+), 1 deletion(-)

像這樣,你不斷對文件進行修改,而後不斷提交修改到版本庫裏,就比如玩RPG遊戲時,每經過一關就會自動把遊戲狀態存盤,若是某一關沒過去,你還能夠選擇讀取前一關的狀態。有些時候,在打Boss以前,你會手動存盤,以便萬一打Boss失敗了,能夠從最近的地方從新開始。Git也是同樣,每當你以爲文件修改到必定程度的時候,就能夠「保存一個快照」,這個快照在Git中被稱爲commit。一旦你把文件改亂了,或者誤刪了文件,還能夠從最近的一個commit恢復,而後繼續工做,而不是把幾個月的工做成果所有丟失。

如今,咱們回顧一下readme.txt文件一共有幾個版本被提交到Git倉庫裏了:

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add distributed

Git is a distributed version control system.
Git is free software.

版本3:append GPL

Git is a distributed version control system.
Git is free software distributed under the GPL.

3、查看歷史記錄

固然了,在實際工做中,咱們腦子裏怎麼可能記得一個幾千行的文件每次都改了什麼內容,否則要版本控制系統幹什麼。版本控制系統確定有某個命令能夠告訴咱們歷史記錄,在Git中,咱們用git log命令查看:

git log

P.S. 如何實現紅色代碼?
<font color=#DC143C >`git log`</font>
$ git log
commit ef7f4d08f501d446b3450d82ae61b175253db9e4 (HEAD -> master)
Author: Neo <kkokdari@foxmail.com>
Date:   Wed Jan 10 20:40:23 2018 +0800

    append GPL

commit f393b7c23f64365b12f93b39bf3a3ee415e792f3
Author: Neo <kkokdari@foxmail.com>
Date:   Wed Jan 10 20:08:21 2018 +0800

    add distributed

commit 287ec15c090ebe1bc52d7241e21f6d913918bc5c
Author: Neo <kkokdari@foxmail.com>
Date:   Wed Jan 10 19:56:05 2018 +0800

    this is my first readme file

git log命令顯示從最近到最遠的提交日誌,咱們能夠看到3次提交,最近的一次是append GPL,上一次是add distributed,最先的一次是wrote a readme file。
若是嫌輸出信息太多,看得眼花繚亂的,能夠試試加上--pretty=oneline參數:

ef7f4d08f501d446b3450d82ae61b175253db9e4 (HEAD -> master) append GPL
f393b7c23f64365b12f93b39bf3a3ee415e792f3 add distributed
287ec15c090ebe1bc52d7241e21f6d913918bc5c this is my first readme file
  • 友情提示的是,你看到的一大串相似ef7f4d08f的是commit id(版本號),和SVN不同,

Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個很是大的數字,用十六進制表示

每提交一個新版本,實際上Git就會把它們自動串成一條時間線。

4、版本回退

首先,Git必須知道當前版本是哪一個版本,在Git中,用HEAD表示當前版本,也就是最新的提交ef7f4d08f501d446b3450d82ae61b175253db9e4(注意個人提交ID和你的確定不同),上一個版本就是HEAD^,上上一個版本就是HEAD^^,固然往上100個版本寫100個^比較容易數不過來,因此寫成HEAD~100

如今,咱們要把當前版本「append GPL」回退到上一個版本「add distributed」,就可使用git reset命令:

$ git reset --hard HEAD^
HEAD is now at f393b7c add distributed

看看readme.txt的內容是否是版本add distributed:
cat filename命令顯示版本庫對象的內容、類型及大小信息。

$ cat readme.txt
Git is a distributed version control system.
Git is free software.

Git的版本回退速度很是快,由於Git在內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從指向append GPL

git-head

改成指向add distributed

git-head-move

而後順便把工做區的文件更新了。因此你讓HEAD指向哪一個版本號,你就把當前版本定位在哪。

5、回到將來

如今,你回退到了某個版本,關掉了電腦,次日早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦?

在Git中,老是有後悔藥能夠吃的。當你用git reset --hard HEAD^回退到add distributed版本時,再想恢復到append GPL,就必須找到append GPLcommit id。Git提供了一個命令git reflog用來記錄你的每一次命令:

$ git reflog
f393b7c (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
ef7f4d0 HEAD@{1}: commit: append GPL
f393b7c (HEAD -> master) HEAD@{2}: commit: add distributed
287ec15 HEAD@{3}: commit (initial): this is my first readme file

終於舒了口氣,第二行顯示append GPL的commit id是ef7f4d0 ,如今,你又能夠乘坐時光機回到將來了。

找到那個版本號,因而就能夠指定的某個版本:

$ git reset --hard ef7f4d0 
HEAD is now at ef7f4d0 append GPL
  • 整理轉載自 廖雪峯博客 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
相關文章
相關標籤/搜索