2021-05-12 14:32:11
Git從入門到學會
Git簡介
Git是什麼?
Git和SVN一樣都是一種高效的管理程式碼的系統。
Git是目前世界上最先進的分散式版本控制系統(沒有之一)。
建立版本庫
什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
第一步,建立一個版本庫非常簡單,首先,選擇一個合適的地方,建立一個空目錄:
1
2
|
$ mkdir text $ cd text / |
第二步,通過git init
命令把這個目錄變成Git可以管理的倉庫:
1
2
|
$ git init Initialized empty Git repository in F: / text / .git / |
瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),細心的讀者可以發現當前目錄下多了一個.git
的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裡面的檔案,不然改亂了,就把Git倉庫給破壞了。
把檔案新增到版本庫
為了能夠更好地利用Git,我們就需要把我們自己的程式碼放到Git倉庫中,讓Git倉庫更好的進行管理,我們既可以直接在我們新建好的倉庫中直接生成程式碼檔案,也可以把我們寫好的程式碼檔案拖動到這個我們新建的Git倉庫中,然而此時只是單單的把我們的程式碼放到了Git倉庫中的工作區中,而非真正的交由Git進行管理,所以我們還需要進行下面幾步。
1
|
$ vim readme.txt #新建一個檔案 |
第一步,用命令git add
告訴Git,把檔案新增到暫存區:
1
|
$ git add readme.txt |
第二步,用命令git commit
告訴Git,把檔案提交到倉庫:
1
|
$ git commit - m "creat new project" |
簡單解釋一下git commit
命令,-m
後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄裡方便地找到改動記錄。
小結
現在總結一下今天學的兩點內容:
初始化一個Git倉庫,使用git init
命令。
新增檔案到Git倉庫,分兩步:
-
第一步,使用命令
git add <file>
,注意,可反復多次使用,新增多個檔案; -
第二步,使用命令
git commit
,完成。
檔案狀態
git status
命令可以讓我們時刻掌握倉庫當前的狀態
1、程式碼未add前,在工作區的狀態
2、程式碼經過add,把檔案新增到暫存區以後
3、用命令git commit
告訴Git,把檔案提交到倉庫以後
雖然Git告訴我們readme.txt被修改了(沒有add以及commit以前,只是簡單的修改了程式碼),但如果能看看具體修改了什麼內容,自然是很好的。比如你休假兩週從國外回來,第一天上班時,已經記不清上次怎麼修改的readme.txt,所以,需要用git diff
這個命令看看:
版本回退
版本回退是在你編寫程式碼的過程中,由於出現了某種錯誤,而需要返回上一個版本的情況。一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit
恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。
我們每次commit都會生成一個新的版本,在實際工作中,我們腦子裡不可能記得一個幾千行的檔案每次都改了什麼內容,不然要版本控制系統幹什麼。版本控制系統肯定有某個命令可以告訴我們歷史錄
1、在Git中,我們用git log
命令檢視:
2、git log
命令顯示從最近到最遠的提交紀錄檔,我們可以看到3次提交, 如果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上--pretty=oneline
引數:
需要友情提示的是,你看到的一大串類似3628164...882e1e0
的是commit id
(版本號),和SVN不一樣,Git的commit id
不是1,2,3……遞增的數位,而是一個SHA1計算出來的一個非常大的數位,用十六進位制表示,而且你看到的commit id
和我的肯定不一樣,以你自己的為準。為什麼commit id
需要用這麼一大串數位表示呢?因為Git是分散式的版本控制系統,後面我們還要研究多人在同一個版本庫裡工作,如果大家都用1,2,3……作為版本號,那肯定就衝突了。
那麼到底版本回退該怎麼做呢?首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD
表示當前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數不過來,所以寫成HEAD~100
。
1>版本回退,就可以使用git reset
命令(我們也可以取ID號的前幾位,而不必都寫上):
2>版本回退,我們也可以利用HEAD~x(上一個版本就是
HEAD^
,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數不過來,所以寫成HEAD~100
。)
--hard
引數的意義就是可以讓你看到當前的版本回退的位置
3、還有一個問題就是如果你已經實現了版本的回退,然而我發現並不是我程式碼的問題,我回退錯了,我不想回退了,或者是我Git已經關閉了,找不到新版本的commit id
怎麼辦?
Git提供了一個命令git reflog
用來記錄你的每一次命令:
這樣我就可以通過找到新版本的commit id,進行反回退
小結
現在總結一下:
-
HEAD
指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。 -
穿梭前,用
git log
可以檢視提交歷史,以便確定要回退到哪個版本。 -
要重返未來,用
git reflog
檢視命令歷史,以便確定要回到未來的哪個版本。
工作區和暫存區
工作區(Working Directory)
就是你在電腦裡能看到的目錄,比如我的learngit
資料夾就是一個工作區:
版本庫(Repository)
工作區有一個隱藏目錄.git
,這個不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master
,以及指向master
的一個指標叫HEAD
。
所以,git add
命令實際上就是把要提交的所有修改放到暫存區(Stage),然後,執行git commit
就可以一次性把暫存區的所有修改提交到分支。
管理修改
Git管理的是修改,而不是檔案
下面我們就用範例來證明,首先我們先修改一個檔案,修改完以後我們用add把檔案加到暫存區中,然後在繼續修改此檔案,然後再用commit進行提交,然後利用status來檢視
第一次修改 -----> git add
------> 第二次修改 ----> git commit---->status
我們可以看到怎麼第二次的修改沒有被提交,為什麼呢?
你看,我們前面講了,Git管理的是修改,當你用git add
命令後,在工作區的第一次修改被放入暫存區,準備提交,但是,在工作區的第二次修改並沒有放入暫存區,所以,git commit
只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。
那怎麼提交第二次修改呢?你可以繼續git add
再git commit
,也可以別著急提交第一次修改,先git add
第二次修改,再git commit
,就相當於把兩次修改合併後一塊提交了:
第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
小結
現在,你又理解了Git是如何跟蹤修改的,每次修改,如果不add
到暫存區,那就不會加入到commit
中。
復原修改
1、如果當你修改了程式碼,然後又發現修改錯誤以後,想復原前面的操作的時候該怎麼辦呢?
既然錯誤發現得很及時,就可以很容易地糾正它。你可以刪掉最後一行,手動把檔案恢復到上一個版本的狀態。如果用git status
檢視一下:
你可以發現,Git會告訴你,git checkout -- file
可以丟棄工作區的修改:
2、如果當你修改了程式碼,已經add到暫存區而沒有進行commit操作的時候,想復原前面的操作的時候該怎麼辦呢?
Git同樣告訴我們,用命令git reset HEAD file
可以把暫存區的修改復原掉(unstage),重新放回工作區:
然後再通過第一種的情況來想復原前面的操作
小結
又到了小結時間。
場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
。
場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file
,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要復原本次提交,參考版本回退一節,不過前提是沒有推播到遠端庫。
刪除檔案
在Git中,刪除也是一個修改操作,我們實戰一下,先新增一個新檔案test.txt到Git並且提交:
一般情況下,你通常直接在檔案管理器中把沒用的檔案刪了,或者用rm
命令刪了:
這個時候,Git知道你刪除了檔案,因此,工作區和版本庫就不一致了,git status
命令會立刻告訴你哪些檔案被刪除了:
現在你有兩個選擇,一是確實要從版本庫中刪除該檔案,那就用命令git rm
刪掉,並且git commit
:
現在,檔案就從版本庫中被刪除了。
另一種情況是刪錯了,因為版本庫裡還有呢,所以可以很輕鬆地把誤刪的檔案恢復到最新版本:
Git 教學系列文章:
GitHub 使用教學圖文詳解 http://www.linuxidc.com/Linux/2014-09/106230.htm
Git 標籤管理詳解 http://www.linuxidc.com/Linux/2014-09/106231.htm
Git 分支管理詳解 http://www.linuxidc.com/Linux/2014-09/106232.htm
Git 遠端倉庫詳解 http://www.linuxidc.com/Linux/2014-09/106233.htm
Git 本地倉庫(Repository)詳解 http://www.linuxidc.com/Linux/2014-09/106234.htm
Git 伺服器搭建與用戶端安裝 http://www.linuxidc.com/Linux/2014-05/101830.htm
Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm
分享實用的GitHub 使用教學 http://www.linuxidc.com/Linux/2014-04/100556.htm
相關文章