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
接下來,咱們上傳一個文件到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再厲害也找不到這個文件。指針
(1)使用git add將文件添加到倉庫:日誌
$ git add readme.txt
(2)使用git commit將文件提交到倉庫:
git commit -m "wrote a readme file"
注:git commit命令,-m後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。
如今,你已經學會了修改文件,而後把修改提交到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.
固然了,在實際工做中,咱們腦子裏怎麼可能記得一個幾千行的文件每次都改了什麼內容,否則要版本控制系統幹什麼。版本控制系統確定有某個命令能夠告訴咱們歷史記錄,在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
Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個很是大的數字,用十六進制表示
每提交一個新版本,實際上Git就會把它們自動串成一條時間線。
首先,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指向哪一個版本號,你就把當前版本定位在哪。
如今,你回退到了某個版本,關掉了電腦,次日早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦?
在Git中,老是有後悔藥能夠吃的。當你用git reset --hard HEAD^
回退到add distributed
版本時,再想恢復到append GPL
,就必須找到append GPL
的commit 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