官方網站:http://git-scm.comphp
Git是目前世界上最早進的分佈式版本控制系統(沒有之一)。html
Git有什麼特色?簡單來講就是:高端大氣上檔次!html5
1、Git安裝python
首先,你能夠試着輸入git
,看看系統有沒有安裝Git:linux
$ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git
像上面的命令,有不少Linux會友好地告訴你Git沒有安裝,還會告訴你如何安裝Git。git
若是你碰巧用Debian或Ubuntu Linux,經過一條sudo apt-get install git
就能夠直接完成Git的安裝,很是簡單。github
老一點的Debian或Ubuntu Linux,要把命令改成sudo apt-get install git-core
,由於之前有個軟件也叫GIT(GNU Interactive Tools),結果Git就只能叫git-core
了。因爲Git名氣實在太大,後來就把GNU Interactive Tools改爲gnuit
,git-core
正式改成git
。sql
若是是其餘Linux版本,能夠直接經過源碼安裝。先從Git官網下載源碼,而後解壓,依次輸入:./config
,make
,sudo make install
這幾個命令安裝就行了。shell
若是你正在使用Mac作開發,有兩種安裝Git的方法。windows
一是安裝homebrew,而後經過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/。
第二種方法更簡單,也是推薦的方法,就是直接從AppStore安裝Xcode,Xcode集成了Git,不過默認沒有安裝,你須要運行Xcode,選擇菜單「Xcode」->「Preferences」,在彈出窗口中找到「Downloads」,選擇「Command Line Tools」,點「Install」就能夠完成安裝了。
Xcode是Apple官方IDE,功能很是強大,是開發Mac和iOS App的必選裝備,並且是免費的!
實話實說,Windows是最爛的開發平臺,若是不是開發Windows遊戲或者在IE裏調試頁面,通常不推薦用Windows。不過,既然已經上了微軟的賊船,也是有辦法安裝Git的。
Windows下要使用不少Linux/Unix的工具時,須要Cygwin這樣的模擬環境,Git也同樣。Cygwin的安裝和配置都比較複雜,就不建議你折騰了。不過,有高人已經把模擬環境和Git都打包好了,名叫msysgit,只須要下載一個單獨的exe安裝程序,其餘什麼也不用裝,絕對好用。
msysgit是Windows版的Git,從https://git-for-windows.github.io下載(網速慢的同窗請移步國內鏡像),而後按默認選項安裝便可。
安裝完成後,在開始菜單裏找到「Git」->「Git Bash」,蹦出一個相似命令行窗口的東西,就說明Git安裝成功!
安裝完成後,還須要最後一步設置,在命令行輸入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
由於Git是分佈式版本控制系統,因此,每一個機器都必須自報家門:你的名字和Email地址。你也許會擔憂,若是有人故意冒充別人怎麼辦?這個沒必要擔憂,首先咱們相信你們都是善良無知的羣衆,其次,真的有冒充的也是有辦法可查的。
注意git config
命令的--global
參數,用了這個參數,表示你這臺機器上全部的Git倉庫都會使用這個配置,固然也能夠對某個倉庫指定不一樣的用戶名和Email地址。
2、建立版本庫
因此,建立一個版本庫很是簡單,首先,選擇一個合適的地方,建立一個空目錄:
$ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit
pwd
命令用於顯示當前目錄。在個人Mac上,這個倉庫位於/Users/michael/learngit
。
若是你使用Windows系統,爲了不遇到各類莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文。
第二步,經過git init
命令把這個目錄變成Git能夠管理的倉庫:
$ git init Initialized empty Git repository in /Users/michael/learngit/.git/
瞬間Git就把倉庫建好了,並且告訴你是一個空的倉庫(empty Git repository),細心的讀者能夠發現當前目錄下多了一個.git
的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裏面的文件,否則改亂了,就把Git倉庫給破壞了。
若是你沒有看到.git
目錄,那是由於這個目錄默認是隱藏的,用ls -ah
命令就能夠看見。
也不必定必須在空目錄下建立Git倉庫,選擇一個已經有東西的目錄也是能夠的。不過,不建議你使用本身正在開發的公司項目來學習Git,不然形成的一切後果概不負責。
首先這裏再明確一下,全部的版本控制系統,其實只能跟蹤文本文件的改動,好比TXT文件,網頁,全部的程序代碼等等,Git也不例外。版本控制系統能夠告訴你每次的改動,好比在第5行加了一個單詞「Linux」,在第8行刪了一個單詞「Windows」。而圖片、視頻這些二進制文件,雖然也能由版本控制系統管理,但無法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是隻知道圖片從100KB改爲了120KB,但到底改了啥,版本控制系統不知道,也無法知道。
不幸的是,Microsoft的Word格式是二進制格式,所以,版本控制系統是無法跟蹤Word文件的改動的,前面咱們舉的例子只是爲了演示,若是要真正使用版本控制系統,就要以純文本方式編寫文件。
由於文本是有編碼的,好比中文有經常使用的GBK編碼,日文有Shift_JIS編碼,若是沒有歷史遺留問題,強烈建議使用標準的UTF-8編碼,全部語言使用同一種編碼,既沒有衝突,又被全部平臺所支持。
使用Windows的童鞋要特別注意:
千萬不要使用Windows自帶的記事本編輯任何文本文件。緣由是Microsoft開發記事本的團隊使用了一個很是弱智的行爲來保存UTF-8編碼的文件,他們自做聰明地在每一個文件開頭添加了0xefbbbf(十六進制)的字符,你會遇到不少難以想象的問題,好比,網頁第一行可能會顯示一個「?」,明明正確的程序一編譯就報語法錯誤,等等,都是由記事本的弱智行爲帶來的。建議你下載Notepad++代替記事本,不但功能強大,並且免費!記得把Notepad++的默認編碼設置爲UTF-8 without BOM便可:
言歸正傳,如今咱們編寫一個readme.txt
文件,內容以下:
Git is a version control system. Git is free software.
必定要放到learngit
目錄下(子目錄也行),由於這是一個Git倉庫,放到其餘地方Git再厲害也找不到這個文件。
和把大象放到冰箱須要3步相比,把一個文件放到Git倉庫只須要兩步。
第一步,用命令git add
告訴Git,把文件添加到倉庫:
$ git add readme.txt
執行上面的命令,沒有任何顯示,這就對了,Unix的哲學是「沒有消息就是好消息」,說明添加成功。
第二步,用命令git commit
告訴Git,把文件提交到倉庫:
$ git commit -m "wrote a readme file" [master (root-commit) cb926e7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
簡單解釋一下git commit
命令,-m
後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。
嫌麻煩不想輸入-m "xxx"
行不行?確實有辦法能夠這麼幹,可是強烈不建議你這麼幹,由於輸入說明對本身對別人閱讀都很重要。實在不想輸入說明的童鞋請自行Google,我不告訴你這個參數。
git commit
命令執行成功後會告訴你,1個文件被改動(咱們新添加的readme.txt文件),插入了兩行內容(readme.txt有兩行內容)。
爲何Git添加文件須要add
,commit
一共兩步呢?由於commit
能夠一次提交不少文件,因此你能夠屢次add
不一樣的文件,好比:
$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files."
如今總結一下今天學的兩點內容:
初始化一個Git倉庫,使用git init
命令。
添加文件到Git倉庫,分兩步:
第一步,使用命令git add <file>
,注意,可反覆屢次使用,添加多個文件;
第二步,使用命令git commit
,完成。
3、平常操做
要隨時掌握工做區的狀態,使用git status
命令。
若是git status
告訴你有文件被修改過,用git diff
能夠查看修改內容。
版本回退:
HEAD
指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
能夠查看提交歷史,以便肯定要回退到哪一個版本。
要重返將來,用git reflog
查看命令歷史,以便肯定要回到將來的哪一個版本。
你能夠繼續git add
再git commit
,也能夠彆着急提交第一次修改,先git add
第二次修改,再git commit
,就至關於把兩次修改合併後一塊提交了:
第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
每次修改,若是不add
到暫存區,那就不會加入到commit
中
撤銷修改
場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file
。
$ git checkout -- readme.txt $ git status # On branch master nothing to commit (working directory clean)
場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file
,就回到了場景1,第二步按場景1操做。
$ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次修改,不過前提是沒有推送到遠程庫。
$ git reset --hard 3628164 HEAD is now at 3628164 append GPL
刪除文件
命令git rm
用於刪除一個文件。若是一個文件已經被提交到版本庫,那麼你永遠不用擔憂誤刪,可是要當心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容。
$ git rm test.txt rm 'test.txt' $ git commit -m "remove test.txt" [master d17efd8] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
4、遠程倉庫
第1步:建立SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa
和id_rsa.pub
這兩個文件,若是已經有了,可直接跳到下一步。若是沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你須要把郵件地址換成你本身的郵件地址,而後一路回車,使用默認值便可,因爲這個Key也不是用於軍事目的,因此也無需設置密碼。
若是一切順利的話,能夠在用戶主目錄裏找到.ssh
目錄,裏面有id_rsa
和id_rsa.pub
兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa
是私鑰,不能泄露出去,id_rsa.pub
是公鑰,能夠放心地告訴任何人。
第2步:登錄GitHub,打開「Account settings」,「SSH Keys」頁面:
而後,點「Add SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub
文件的內容:
點「Add Key」,你就應該看到已經添加的Key:
爲何GitHub須要SSH Key呢?由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此,GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。
添加遠程庫
首先,登錄GitHub,而後,在右上角找到「Create a new repo」按鈕,建立一個新的倉庫:
在Repository name填入learngit
,其餘保持默認設置,點擊「Create repository」按鈕,就成功地建立了一個新的Git倉庫:
目前,在GitHub上的這個learngit
倉庫仍是空的,GitHub告訴咱們,能夠從這個倉庫克隆出新的倉庫,也能夠把一個已有的本地倉庫與之關聯,而後,把本地倉庫的內容推送到GitHub倉庫。
如今,咱們根據GitHub的提示,在本地的learngit
倉庫下運行命令:
$ git remote add origin git@github.com:michaelliao/learngit.git
請千萬注意,把上面的michaelliao
替換成你本身的GitHub帳戶名,不然,你在本地關聯的就是個人遠程庫,關聯沒有問題,可是你之後推送是推不上去的,由於你的SSH Key公鑰不在個人帳戶列表中。
添加後,遠程庫的名字就是origin
,這是Git默認的叫法,也能夠改爲別的,可是origin
這個名字一看就知道是遠程庫。
下一步,就能夠把本地庫的全部內容推送到遠程庫上:
$ git push -u origin master Counting objects: 19, done. Delta compression using up to 4 threads. Compressing objects: 100% (19/19), done. Writing objects: 100% (19/19), 13.73 KiB, done. Total 23 (delta 6), reused 0 (delta 0) To git@github.com:michaelliao/learngit.git * [new branch] master -> master Branch master set up to track remote branch master from origin.
把本地庫的內容推送到遠程,用git push
命令,其實是把當前分支master
推送到遠程。
因爲遠程庫是空的,咱們第一次推送master
分支時,加上了-u
參數,Git不但會把本地的master
分支內容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。
推送成功後,能夠馬上在GitHub頁面中看到遠程庫的內容已經和本地如出一轍:
從如今起,只要本地做了提交,就能夠經過命令:
$ git push origin master
把本地master
分支的最新修改推送至GitHub,如今,你就擁有了真正的分佈式版本庫!
當你第一次使用Git的clone
或者push
命令鏈接GitHub時,會獲得一個警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)?
這是由於Git使用SSH鏈接,而SSH鏈接在第一次驗證GitHub服務器的Key時,須要你確認GitHub的Key的指紋信息是否真的來自GitHub的服務器,輸入yes
回車便可。
Git會輸出一個警告,告訴你已經把GitHub的Key添加到本機的一個信任列表裏了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
這個警告只會出現一次,後面的操做就不會有任何警告了。
若是你實在擔憂有人冒充GitHub服務器,輸入yes
前能夠對照GitHub的RSA Key的指紋信息是否與SSH鏈接給出的一致。
要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git
;
關聯後,使用命令git push -u origin master
第一次推送master分支的全部內容;
此後,每次本地提交後,只要有必要,就可使用命令git push origin master
推送最新修改;
克隆遠程庫
要克隆一個倉庫,首先必須知道倉庫的地址,而後使用git clone
命令克隆。
Git支持多種協議,包括https
,但經過ssh
支持的原生git
協議速度最快。
$ git clone git@github.com:michaelliao/gitskills.git Cloning into 'gitskills'... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done. $ cd gitskills $ ls README.md
5、分支管理
Git的分支是不同凡響的,不管建立、切換和刪除分支,Git在1秒鐘以內就能完成!不管你的版本庫是1個文件仍是1萬個文件。
Git鼓勵大量使用分支:
查看分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
當Git沒法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。用git log --graph
命令能夠看到分支合併圖。
咱們切換回master
:
$ git checkout master Switched to branch 'master'
準備合併dev
分支,請注意--no-ff
參數,表示禁用Fast forward
:
$ git merge --no-ff -m "merge with no-ff" dev Merge made by the 'recursive' strategy. readme.txt | 1 + 1 file changed, 1 insertion(+)
由於本次合併要建立一個新的commit,因此加上-m
參數,把commit描述寫進去。
合併後,咱們用git log
看看分支歷史:
$ git log --graph --pretty=oneline --abbrev-commit * 7825a50 merge with no-ff |\ | * 6224937 add merge |/ * 59bc1cb conflict fixed ...
能夠看到,不使用Fast forward
模式,merge後就像這樣:
Fast forward
模式,但這種模式下,刪除分支後,會丟掉分支信息。
若是要強制禁用Fast forward
模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就能夠看出分支信息。
下面咱們實戰一下--no-ff
方式的git merge
:
首先,仍然建立並切換dev
分支:
$ git checkout -b dev Switched to a new branch 'dev'
修改readme.txt文件,並提交一個新的commit:
$ git add readme.txt $ git commit -m "add merge" [dev 6224937] add merge 1 file changed, 1 insertion(+)
如今,咱們切換回master
:
$ git checkout master Switched to branch 'master'
準備合併dev
分支,請注意--no-ff
參數,表示禁用Fast forward
:
$ git merge --no-ff -m "merge with no-ff" dev Merge made by the 'recursive' strategy. readme.txt | 1 + 1 file changed, 1 insertion(+)
由於本次合併要建立一個新的commit,因此加上-m
參數,把commit描述寫進去。
合併後,咱們用git log
看看分支歷史:
$ git log --graph --pretty=oneline --abbrev-commit * 7825a50 merge with no-ff |\ | * 6224937 add merge |/ * 59bc1cb conflict fixed ...
能夠看到,不使用Fast forward
模式,merge後就像這樣:
在實際開發中,咱們應該按照幾個基本原則進行分支管理:
首先,master
分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在dev
分支上,也就是說,dev
分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev
分支合併到master
上,在master
分支發佈1.0版本;
你和你的小夥伴們每一個人都在dev
分支上幹活,每一個人都有本身的分支,時不時地往dev
分支上合併就能夠了。
首先肯定要在哪一個分支上修復bug,假定須要在master
分支上修復,就從master
建立臨時分支:
$ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 6 commits. $ git checkout -b issue-101 Switched to a new branch 'issue-101'
如今修復bug,須要把「Git is free software ...」改成「Git is a free software ...」,而後提交:
$ git add readme.txt $ git commit -m "fix bug 101" [issue-101 cc17032] fix bug 101 1 file changed, 1 insertion(+), 1 deletion(-)
修復完成後,切換到master
分支,並完成合並,最後刪除issue-101
分支:
$ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 2 commits. $ git merge --no-ff -m "merged bug fix 101" issue-101 Merge made by the 'recursive' strategy. readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) $ git branch -d issue-101 Deleted branch issue-101 (was cc17032).
開發一個新feature,最好新建一個分支;
若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <name>
強行刪除。
$ git branch -d feature-vulcan error: The branch 'feature-vulcan' is not fully merged. If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
銷燬失敗。Git友情提醒,feature-vulcan
分支尚未被合併,若是刪除,將丟失掉修改,若是要強行刪除,須要使用命令git branch -D feature-vulcan
。
如今咱們強行刪除:
$ git branch -D feature-vulcan Deleted branch feature-vulcan (was 756d4af).
多人合做
查看遠程庫信息,使用git remote -v
;
本地新建的分支若是不推送到遠程,對其餘人就是不可見的;
從本地推送分支,使用git push origin branch-name
,若是推送失敗,先用git pull
抓取遠程的新提交;
在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致;
創建本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name
;
從遠程抓取分支,使用git pull
,若是有衝突,要先處理衝突。
6、標籤管理
命令git tag <name>
用於新建一個標籤,默認爲HEAD
,也能夠指定一個commit id;
git tag -a <tagname> -m "blablabla..."
能夠指定標籤信息;
git tag -s <tagname> -m "blablabla..."
能夠用PGP簽名標籤;
命令git tag
能夠查看全部標籤。
命令git push origin <tagname>
能夠推送一個本地標籤;
命令git push origin --tags
能夠推送所有未推送過的本地標籤;
命令git tag -d <tagname>
能夠刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>
能夠刪除一個遠程標籤。
使用Github:
git clone git@github.com:XXXXX/YYYYYY.git
7、搭建Git服務器
搭建Git服務器須要準備一臺運行Linux的機器,強烈推薦用Ubuntu或Debian,這樣,經過幾條簡單的apt
命令就能夠完成安裝。
假設你已經有sudo
權限的用戶帳號,下面,正式開始安裝。
第一步,安裝git
:
$ sudo apt-get install git
第二步,建立一個git
用戶,用來運行git
服務:
$ sudo adduser git
第三步,建立證書登陸:
收集全部須要登陸的用戶的公鑰,就是他們本身的id_rsa.pub
文件,把全部公鑰導入到/home/git/.ssh/authorized_keys
文件裏,一行一個。
第四步,初始化Git倉庫:
先選定一個目錄做爲Git倉庫,假定是/srv/sample.git
,在/srv
目錄下輸入命令:
$ sudo git init --bare sample.git
Git就會建立一個裸倉庫,裸倉庫沒有工做區,由於服務器上的Git倉庫純粹是爲了共享,因此不讓用戶直接登陸到服務器上去改工做區,而且服務器上的Git倉庫一般都以.git
結尾。而後,把owner改成git
:
$ sudo chown -R git:git sample.git
第五步,禁用shell登陸:
出於安全考慮,第二步建立的git用戶不容許登陸shell,這能夠經過編輯/etc/passwd
文件完成。找到相似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改成:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣,git
用戶能夠正常經過ssh使用git,但沒法登陸shell,由於咱們爲git
用戶指定的git-shell
每次一登陸就自動退出。
第六步,克隆遠程倉庫:
如今,能夠經過git clone
命令克隆遠程倉庫了,在各自的電腦上運行:
$ git clone git@server:/srv/sample.git Cloning into 'sample'... warning: You appear to have cloned an empty repository.
剩下的推送就簡單了。
若是團隊很小,把每一個人的公鑰收集起來放到服務器的/home/git/.ssh/authorized_keys
文件裏就是可行的。若是團隊有幾百號人,就無法這麼玩了,這時,能夠用Gitosis來管理公鑰。
這裏咱們不介紹怎麼玩Gitosis了,幾百號人的團隊基本都在500強了,相信找個高水平的Linux管理員問題不大。
有不少不但視源代碼如生命,並且視員工爲竊賊的公司,會在版本控制系統裏設置一套完善的權限控制,每一個人是否有讀寫權限會精確到每一個分支甚至每一個目錄下。由於Git是爲Linux源代碼託管而開發的,因此Git也繼承了開源社區的精神,不支持權限控制。不過,由於Git支持鉤子(hook),因此,能夠在服務器端編寫一系列腳原本控制提交等操做,達到權限控制的目的。Gitolite就是這個工具。
配置Git的時候,加上--global
是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用。
配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config
文件中:
$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [remote "origin"] url = git@github.com:michaelliao/learngit.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [alias] last = log -1
別名就在[alias]
後面,要刪除別名,直接把對應的行刪掉便可。
而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig
中:
$ cat .gitconfig [alias] co = checkout ci = commit br = branch st = status [user] name = Your Name email = your@email.com
配置別名也能夠直接修改這個文件,若是改錯了,能夠刪掉文件從新經過命令配置。
讓Git顯示顏色,會讓命令輸出看起來更醒目:
$ git config --global color.ui true
$ git config --global alias.st status
忽略某些文件時,須要編寫.gitignore
;
.gitignore
文件自己要放到版本庫裏,而且能夠對.gitignore
作版本管理!
GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽:https://github.com/github/gitignore
忽略文件的原則是:
.class
文件; 例子:
假設你在Windows下進行Python開發,Windows會自動在有圖片的目錄下生成隱藏的縮略圖文件,若是有自定義目錄,目錄下就會有Desktop.ini
文件,所以你須要忽略Windows自動生成的垃圾文件:
# Windows: Thumbs.db ehthumbs.db Desktop.ini
而後,繼續忽略Python編譯產生的.pyc
、.pyo
、dist
等文件或目錄:
# Python: *.py[cod] *.so *.egg *.egg-info dist build
加上你本身定義的文件,最終獲得一個完整的.gitignore
文件,內容以下:
# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
最後一步就是把.gitignore
也提交到Git,就完成了!固然檢驗.gitignore
的標準是git status
命令是否是說working directory clean
。
使用Windows的童鞋注意了,若是你在資源管理器裏新建一個.gitignore
文件,它會很是弱智地提示你必須輸入文件名,可是在文本編輯器裏「保存」或者「另存爲」就能夠把文件保存爲.gitignore
了。
有些時候,你想添加一個文件到Git,但發現添加不了,緣由是這個文件被.gitignore
忽略了:
$ git add App.class The following paths are ignored by one of your .gitignore files: App.class Use -f if you really want to add them.
若是你確實想添加該文件,能夠用-f
強制添加到Git:
$ git add -f App.class
或者你發現,多是.gitignore
寫得有問題,須要找出來到底哪一個規則寫錯了,能夠用git check-ignore
命令檢查:
$ git check-ignore -v App.class .gitignore:3:*.class App.class
Git會告訴咱們,.gitignore
的第3行規則忽略了該文件,因而咱們就能夠知道應該修訂哪一個規則。