首先,為什麼要有git?


我們在工作中,所建立的文檔經常需要修改,又需要保存原來的版本以免將來用到,但是多次更改之後,卻忘了之前都修改了什麼,導致看著之前存儲的一堆文件似乎沒用了。而對於團隊協作,同樣需要標註這些,所以需要一個版本控制的軟體。而git是分散式版本控制系統,優點是每一個git克隆都是一個完整的文件庫,含有全部歷史記錄和修訂追蹤能力,不必伺服器端軟體的支持,離線依然可以工作,也不會因為某個文件庫損壞而丟失掉所有的文件。其中「分支」用來開發,「主幹」保持穩定,開發完成合併分支到主幹即可。

(這裡需要聲明一下,版本控制,只能追蹤文本文件的改動,比如txt文件,網頁,所有的程序代碼等,而圖片、視頻這些二進位文件,版本控制系統並不能知道修改了什麼,微軟的word格式也是二進位格式,所以版本控制系統沒法追蹤word文檔的變化,另外,編碼請使用標準utf-8編碼。)

下面,我們在桌面創建一個test文件夾(windows系統),用git來記錄test文件夾內文件的修訂。

此時,這是一個空文件夾,什麼都沒有,我們需要通過git初始化來讓git能夠記錄。

進入test文件,在文件夾內打開git bash。

輸入命令pwd,可以得到此刻所處的目錄。可以看見此時我們正在test文件中。

此時,文件夾中什麼都沒有,輸入命令git init,初始化git,可以看見文件夾中多了一個名為.git的文件夾,從此刻起,test內部的文件將會通過命令來記錄變化,這個目錄里的所有文件,每個文件的修改、刪除,git都能追蹤,以讓我們掌握版本的更替和信息,也可以在將來的某個時刻可以「還原」。

在git的監控下,所有文件一定在三種狀態下:修改未暫存,暫存待提交,已提交到倉庫。對應著三個區域:工作區域(working directory),暫存區域(stage),以及HEAD指針指向的區域。工作區域就是test文件夾下除了.git文件的所有部分;.git就是git的版本庫,包含暫存區域和真正記錄和保持信息的區域master和其他分支,git初始化時,自動創了第一個分支master,也就是主分支,此時有一個指針叫HEAD指向master(這裡涉及到主幹與分支,後面在寫)

下面,命令touch index.html,可以看見test文件夾下多了一個index.html文件,touch命令就是新建文件的命令,新建文件夾的命令是mkdir + 文件夾名稱。

輸入命令git status,此命令可以告訴我們文件的狀態。

此時,可以看到文件index.html的狀態是未暫存,我們需要先將其放入暫存區中,最後在提交到分支master上。輸入命令git add .或git add index.html.

git add index.html是將index.html文件放入暫存區;git add .是將所有修改後的文件放入暫存區,因為有些時候我們並非只修改一個文件。

可以看到提示告訴我們文件可以被提交分支了,或者使用命令git rm --cached刪除這個緩存文件。輸入命令git commit -m "touch index.html"

此時,文件index.html已經提交到分支master上,工作區域很乾凈,沒有需要提交的。

那麼此時,如果我修改index.html文件呢?輸入命令vim index.html,使用vim打開編輯這個文件。

輸入i進入編輯狀態,輸入hello world,按ESC退出編輯狀態,按:wq保存並退出vim,返回到git bash。

輸入命令git status,我們來看看此時index.html文件的狀態,可以看到此時它處於修改未暫存的狀態,將其提交到版本庫

接下來我們來查看兩次的版本。輸入命令git log

紅色圓圈是兩次版本的更改記錄,第一次提交時我們注釋了

第二次提交時我們注釋了

而綠色圓圈實際上就是版本號commit id,如果我們想回到某個版本,比如此時我們是在hello world版本中,如果我們打開index.html可以看見裡面如下

此時輸入命令

git reset --hard 47d455,47d455是上一版commit id的前面幾位。我們將回到touch index.html的版本

雙擊打開index.html

可以看到此時回退到新建index.html時的狀態,index.html里什麼都沒有

我們可以在返回剛才的版本,只要我們有版本的commit id,我們就可以隨時回到某一個版本。

輸入命令:git reflog,這個命令是記錄commit id的

可以看到版本更替時的commit id.命令:git reset --hard 170f3fe

打開index.html,可以看到

接下來說一下分支和合併

上面說了,git初始化時,自動創建了master分支,也就是我們的主分支,HEAD指針指向了master分支,所以,我們修改的文件的記錄是保存在master分支中的。但是開發的時候,實際上我們應該是保證master主幹的穩定,所以應該新建一個分支來開發和debug,完成以後合併到主幹上即可,特別是多人協作,每個人都建立一個自己的分支來開發,開發完成後合併到主幹,互相不影響,還不耽誤進度。

命令:git branch dev,建立dev分支,相當於克隆了一個master分支,此時與master內容一樣。

命令git branch,顯示分支,可以看見有dev和master兩個分支,master分支前面的*表示此時HEAD指針指向master.

命令git checkout dev,進入dev分支,指針指向dev,可以看到此時*號在dev前面

打開index.html,可以看到和master分支下的index.html一樣

此時,我們修改加入一行「I like coding」.命令vim index.html,修改後,記得提交git commit版本庫

然後我們在返回分支master,命令: cat index.html,顯示index.html內容

可以看到master並沒有任何改變,此時我們可以把dev分支的修改合併到master上,

命令git merge --no-ff -m "merge dev I like coding" dev。合併dev到master上,並保存分支信息。打開master下的index.html,可以看到合併了。

命令:git branch -D dev,刪除dev分支。可以看到此時只剩master分支

推薦閱讀:

相关文章