GIT基本上是目前最爲先進的分佈式版本控制系統,經過GIT可以很是方便的管理文件多個版本,可以實現版本的回滾,比對等功能,而且支持分佈式也就是多人協同工做。python
GIT也是目前使用做爲普遍的版本控制軟件,大名鼎鼎的Github網站能直接與GIT對接,使用GIT上傳代碼到Github之中。linux
一般來講,Linux系統使用各自版本對應的包管理工具能夠很是方便的安裝GIT。例如sudo apt-get install git,但安裝以後會有一些設置須要配置。git
安裝GIT以後比較常見的一個問題,就是中文亂碼,能夠經過在命令行中設置解決:vim
git config --global core.quotepath false
因爲GIT支持多用戶協做,因此在使用GIT以前,還須要配置身份信息。首先須要在GIT中配置你的用戶名和郵箱地址:緩存
git config --global user.name "name" // 名字 git config --global user.email "123@126.com" // 郵箱
在使用GIT以前,得掌握一個倉庫的概念,也就是repository。這個repository也就是一個目錄,是GIT管理的單位,在一個repository中,全部文件的新建、修改、刪除都會被GIT跟蹤到,並加以管理,以便在之後進行還原等操做。安全
因此,使用GIT,首先要建立一個repository。服務器
建立一個倉庫,主要能夠有兩種方式。分佈式
【init】ide
init的建立方式爲從零開始建立一個倉庫,首先須要有一個目錄,使用cd進入到咱們想要建立倉庫的目錄中,而後使用如下命令:工具
git init
便可將當前目錄轉化爲一個repository。目錄中會出現一個.git目錄,裏面保存着全部的版本信息。
【clone】
除了本身從零開始建立倉庫外,還可使用別人的遠程倉庫來建立,例如Github上有許多項目代碼,均可以使用這種方式拷貝下來。
git clone git://git.kernel.org/pub/scm/.../linux.git
這樣的話會在當前目錄生成一個如出一轍的倉庫。
建立好倉庫以後,就能夠在倉庫之中開始使用命令來控制此倉庫文件的版本了。
在使用這些命令以前,還有幾個GIT的基礎概念須要掌握,分別是:工做區(working directory),暫存區(stage),分支,版本庫。
【status】
在倉庫中使用git status命令能夠查看當前倉庫的狀態:
[root@southnorth lianjia]# git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: lianjia/settings.py # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # setup.py no changes added to commit (use "git add" and/or "git commit -a")
其中主要列出了倉庫當前所處的分支,被修改了的文件,以及沒有被跟蹤的文件。
參數:
【add】
在GIT倉庫之中,雖然咱們說全部的文件均可以被跟蹤,可是這隻限於文本文件的修改,GIT沒法跟蹤二進制文件的修改。
同時,在跟蹤以前也須要先將文件添加到倉庫的索引中,也就是說,使用add命令添加到索引中的文件,纔會被GIT跟蹤。在每次你新建或者修改了文件以後,須要你使用add命令將這個文件先添加到暫存區之中。
git add filename
運行了此命令以後,未跟蹤文件將會從Untracked files:中轉移到Changes not staged for commit:中。
有些時候,可能修改的文件比較多,一個個去用add命令去添加比較麻煩,因此也能夠用*來匹配文件名,如下命令能夠將全部未被跟蹤的文件添加到暫存區中:
git add *
【commit】
在將新文件或者修改事後的文件添加到暫存區以後,就可使用commit命令將其正式提交到倉庫了。可是要注意的是,commit提交到倉庫的文件狀態,是最後一次執行add時文件的狀態,而不是執行commit時文件的狀態。
因此,在提交文件以前,最好都先使用git status檢查一下,有沒有須要添加的文件尚未用add添加到暫存區中。而後就能夠運行命令了:
git commit
直接運行此命令後,會跳出一個編輯界面,通常默認是使用vim。以下所示:
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Your branch is up to date with 'origin/master'. # # Changes to be committed: # modified: "hello.md"
這裏實際上是須要你輸入一些關於這次commit的一些信息,對這次代碼提交作必定的標識,方便之後若是須要還原版本的時候清楚代碼的改動。對此信息保存退出後,則commit提交成功。
參數:
-a - 雖說可使用add命令對commit提交的暫存區作很精細的改動,可是當提交的文件很是多的時候,則add起來會比較的麻煩。因此commit提供了-a參數,使用此參數,則會自動將已被追蹤的修改過的文件添加到緩存區中,不用再手動add添加了。
-m - commit提交的時候須要輸入信息,有時候若是但願輸入的信息比較少,則可使用-m參數直接在命令行輸入。以下所示:
git commit -m 'message'
【rm】
若是須要移除倉庫中已經被追蹤的文件,那麼最好使用GIT提供的rm命令來刪除,會更加安全:
git rm filename
此刪除命令會將磁盤上的文件一併刪除,在commit後,此文件將不會再被追蹤。
參數:
-f - 若是刪除的文件已經被修改過,或者已經被添加到暫存區中,那麼則須要用-f參數強制刪除。這是一個保護措施,由於還未被提交的修改不會被保存下來,是沒法恢復的。
--cached - 若是但願某個倉庫中的文件再也不被GIT跟蹤,可是依然被保存在磁盤裏,這種時候可使用--cached來刪除。在錯誤的添加了文件到倉庫中後,這個參數很是有用。
git rm --cached filename
【reset】
使用GIT最大的一個好處是,GIT會將你提交的每一個commit保存下來,以供你之後在出現問題後,可以很是方便的回滾版本。回滾版本的其中一個命令就是reset。
在你將一些文件使用add命令添加到暫存區以後,使用git status命令查看狀態時能夠看到提示,若是想將添加到暫存區的文件取消暫存則可使用如下命令:
git reset HEAD <file>...
在這裏,HEAD表明的是最近一次的commit,此命令的意思則是將指定文件回滾到最近一次commit提交的狀態。
若是沒有指定文件的話,那麼將會回滾整個倉庫的狀態,以下:
git reset HEAD
版本表示:
回滾的時候能夠指定回滾的版本,版本的表示方式有三種,默認狀況下都是指向最近一次提交:
參數:
【diff】
git diff命令能夠查看兩次文件內容有什麼不一樣。使用如下命令能夠查看工做區和版本庫中最新版本的區別。
git diff HEAD -- <filename>
在這裏--表示的是工做區,HEAD表示的是最近一次commit提交的版本,還能夠用--cached表明暫存區。
在沒有指定的狀況下,是默認查看工做區和暫存區的區別:
git diff <filename>
【log】
使用git log命令,將會用如下的格式輸出提交的commit日誌記錄,若是記錄較多的話,須要按q鍵退出查看。
$ git log commit 69b8e6b3ebff7b84d6190a374475a20482d4c3ba (HEAD -> master, origin/master, origin/HEAD) Author: wnanbei <wnanbei@gmail.com> Date: Thu Nov 15 17:16:53 2018 +0800 add git branch part commit 28056c5055ef9ed4156b74713c0205e8fde44713 Author: wnanbei <wnanbei@gmail.com> Date: Thu Nov 15 15:21:30 2018 +0800 complete basic git command commit 6f6aae904ad7551d49ab952e9e3afae70bc93c50 Author: wnanbei <wnanbei@gmail.com> Date: Thu Nov 8 17:19:46 2018 +0800 add git
參數:
--oneline - 每條commit日誌只顯示一行內容:
$ git log --oneline 69b8e6b (HEAD -> master, origin/master, origin/HEAD) add git branch part 28056c5 complete basic git command 6f6aae9 add git
--skip - 指定跳過前面幾條日誌:
$ git log --skip=4 --oneline b9922fc add git edd4594 change the python file name a9cded2 add git article
-[length] - 指定輸出的日誌數量
$ git log --oneline -2 69b8e6b (HEAD -> master, origin/master, origin/HEAD) add git branch part 28056c5 complete basic git command
--pretty= - 使用其餘格式顯示提交信息,可選項有:oneline、short、medium、full、fuller、email、raw,默認爲medium。
--graph - 在左側以圖形的方式顯示提交的commit變更,更清晰的展現分支的合併等信息。
--decorate - 展現更多的信息,例如HEAD、分支名、tag。
--author - 經過提交者的名字來搜索提交信息。
--grep - 從提交的關鍵字搜索提交信息。
-p - 經過路徑搜索提交信息
git log -p -- config/my.config
【tag】
在GIT中還有一個很是方便的功能,就是打標籤,能夠給某個特定的commit進行標記。比較普遍的一個方式使用它來標記版本號。使用如下命令將會給當前分支最新的一個commit打上tag。
git tag <tagname>
若是你須要指定給某個commit打tag的話,則須要你在命令後面加上commit的id。
使用如下命令能夠查看tag的信息:
git tag # 查看本地全部tag git show <tagname> # 查看指定tag的詳細信息 git ls-remote --tags <remotename> 查看遠程全部tag
須要注意的是,咱們建立的tag都是隻存在於本地的,因此若是要把tag同步到遠程倉庫的話,須要額外單獨的使用命令同步tag。
git push <remotename> <tagName> # 推送單個tag到遠程倉庫 git push <remotename> --tags # 推送全部未推送的tag到遠程倉庫
參數:
在GIT之中,有分支的概念。在這裏舉一個例子,你但願在你的工做項目上新增添一個功能,那麼你就能夠在當前項目的基礎上新開一個分支,而後在這個專門的分支上開發的你新功能,而原來的工做項目不受任何影響。等到你的新功能開發完畢經過測試後,就能夠將這個分支與以前的工做項目分支合併了。
這種開發方式,可以將工做從開發主線上分離開來,避免工做時影響到工做主線。
因爲GIT的分支實現原理跟指針相似,因此建立切換合併分支都是很是迅速的。GIT也很是鼓勵新建一個分支去完成任務,任務完成後和主分支合併,而後刪除掉這個新分支,這樣使用下來與直接在主分支工做是差很少的,可是安全性要高很多。
【branch】
首先,直接使用git branch命令是查看當前倉庫的分支:
git branch
若是在git branch命令後面跟上一個名字,則能夠在當前倉庫新建一個分支:
git branch working
也可使用當前分支的某歷史版本建立分支,這樣的話須要指定具體的commit的ID:
git branch working 169d2dc
須要注意的是,倉庫通常默認會有一個master分支,這個分支其實並無什麼特殊,跟其餘新建的分支沒有什麼區別,只是在git init時默認會建立這樣一個分支,大部分人也懶得去修改。
參數:
-d - 若是在建立以後須要刪除一個分支,能夠加上此參數。
git branch -d working
【checkout】
在建立了分支以後,咱們所處的依然是以前的分支,要切換到新的分支的話,依然是須要咱們手動切換的。
git checkout working
參數:
【merge】
在建立了分支以後,大部分狀況下最終都是要合併的,也就是將分支修改的內容和另外一個分支的修改內容合併到一塊兒。
使用git merge命令將能夠把某一分支與當前分支合併到一塊兒:
git merge working
若是兩個分支之間沒有衝突的話,那麼分支的合併將會很是簡單,GIT會自行決定如何合併兩個分支。可是若是兩個分支之間有文件衝突的話,也就是說兩個分支內都對同一個文件進行了修改這種相似的操做,GIT將沒法決定保留哪個分支的內容。
由於在邏輯層面上,也須要由你本身來決定,在衝突的狀況下,保留哪一個分支的內容。在這種狀況下,合併的時候會顯示相似如下的內容:
CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result.
在衝突的文件內,GIT會將兩個分支的內容都放在了一塊兒,由你自行修改:
<<<<<<< HEAD i am master ======= hello, i am working >>>>>>> working
能夠看到====分割上方的是當前分支的內容,下方是合併的working分支的內容。此時由你自行修改,處理完衝突以後,add添加好就能夠提交了。
在前面講的用法基本上都是本地的GIT用法,可是使用GIT很大的一個優點是能夠多人協做,同時完成項目,那麼這基本必然要涉及到遠程倉庫的使用。遠程倉庫能夠本身在服務器上搭建,也可使用一些其餘人提供的倉庫託管服務,例如Github這個全球最大的同性交友網站。
使用init命令生成的倉庫中,是沒有配置遠程倉庫的,須要自行配置。而若是是使用clone獲取的倉庫,則會未來源的遠程倉庫默認配置爲一個名爲origin的遠程倉庫,這個遠程倉庫沒有什麼特殊,只是默認起名而已。在一些比較複雜的多人合做項目中,會配置有多個遠程倉庫。
【remote】
使用git remote命令便可查看當前倉庫有配置哪些遠程倉庫:
$ git remote origin
若是你須要添加新的遠程倉庫,那麼可使用如下命令:
git remote add <shortname> <url>
<shortname>是你給這個遠程分支起的名字,這個名字只會在本地起做用。
如下還有一些顯示與刪除等命令:
git remote show [remote-name] # 顯示遠程倉庫詳細的信息 git remote rename old_name new_name # 重命名遠程倉庫 git remote rm remote_name # 刪除遠程倉庫
參數:
【fetch】
在配置了遠程倉庫以後,就能夠從遠程倉庫拉取內容了。這個命令會訪問遠程倉庫,從中拉取全部你尚未的數據。 執行完成後,你將會擁有那個遠程倉庫中全部分支的引用,能夠隨時合併或查看。
git fetch [remote-name]
若是須要只拉取某個分支的內容,須要在後面加上分支的名稱。
git fetch origin master # 拉取遠程倉庫origin中的master分支 git fetch origin master:temp # 拉取遠程倉庫origin中的master分支,並命名爲temp分支
須要注意的是,fetch這個命令只是將版本庫中的內容拉取下來,並不會自動合併和修改你工做區中的內容,須要你自行手動合併。
以後須要合併拉取的內容到工做區的話,須要使用git merge命令。
git merge FETCH_HEAD
這裏的FETCH_HEAD是一個版本連接,記錄在本地的一個文件中,指向着目前已經從遠程倉庫取下來的分支的末端版本。
通常來講一個比較常見且安全的使用方式以下:
git fetch origin master:tmp # 在本地新建一個temp分支,並將遠程origin倉庫的master分支代碼下載到本地temp分支 git diff tmp # 來比較本地代碼與剛剛從遠程下載下來的代碼的區別 git merge tmp # 合併temp分支到本地的master分支 git branch -d temp # 若是不想保留temp分支 能夠用這步刪除
【pull】
若是以爲使用fetch命令比較麻煩,且肯定遠程倉庫的內容能夠安全合併的話,那麼可使用pull命令。pull命令實際上是一個混合命令,至關於把git fetch和git merge這兩個命令合併到了一塊兒,一個命令直接解決問題。
git pull origin
【push】
在多人協做完成項目時,本地工做完成後,須要推送到遠程倉庫中,這個時候須要使用git push命令來進行推送。這個命令的用法以下所示:
git push <遠程主機名> <本地分支名>:<遠程分支名>
若是當前分支只有一個遠程分支,那麼主機名與分支名均可以省略:
git push
若是當前分支與遠程分支存在追蹤關係,則能夠省略分支名,只留主機名,例如:
git push origin
若是隻省略遠程分支名,則表示將分支退送到與之存在追蹤關係的分支,若是遠程分支不存在,則建立新的遠程分支:
git push origin master
若是隻省略本地分支名,則表明刪除指定遠程分支:
git push origin :master
在使用GIT管理項目時,咱們項目裏經常會有一些文件是不須要歸入版本管理的,例如Mac系統的.DS_Store之類的默認文件,又好比Python的運行生成的__pycache__目錄。
若是這種文件較多時,咱們添加文件將變得比較的麻煩,因此GIT給咱們提供了一個方式,能夠忽略掉指定的文件。
首先是配置全局忽略,GIT管理的倉庫都能起效。配置的方式有幾種,咱們這裏主要使用.gitignore文件來進行配置。
首先咱們須要建立一個.gitignore文件,這個文件放在哪裏均可以,但推薦的位置是直接放到家目錄中:
touch .gitignore
而後,咱們須要將此文件配置到GIT中(若是有修改文件路徑的話,這裏須要相應的修改):
git config --global core.excludesfile ~/.gitignore
最後,咱們再來編輯.gitignore文件,將須要忽略的文件寫到這個文件中便可,文件內格式以下所示:
.DS_Store __pycache__ *.pyc .vscode
若是須要按照具體的項目來配置特定的忽略文件的話,那麼能夠配置一個.gitignore文件直接放到倉庫的根目錄便可。