git將全部文件分紅三類:已追蹤的、被忽略的以及未追蹤的。git
能夠在gitignore中配置忽略文件,其格式以下:shell
因爲gitignore文件能夠在不少地方配置,所以其有優先級,優先級由高到低以下:windows
通常開發中,都會在代碼庫的工做區跟目錄指定.gitignore文件bash
對於有些網絡不通獲取其餘狀況,須要使用補丁來合併代碼。git提供了三個特定命令來幫助交換補丁服務器
format-patch命令會以郵件消息的形式生成一個補丁,每一個提交都是一個相對於上個提交的補丁文件。用法以下:網絡
git format-patch -2 -------------最近的兩次提交,生成兩個補丁文件 git format-patch master~4..master~2 -----特定的範圍
補丁文件生成好之後須要發送補丁文件,你能夠直接經過我的郵箱以附件的形式發送,不過git提供了send-email命令來直接發送補丁文件。例如:
git send-email -to my@example.com 0001-A.patch
可是你須要配置你的郵箱的SMTP服務器的地址和端口號才行:
git config --global sendemail.smtpserver smtp.my-isp.com
git config --global sendemail.smtpserverport 465 編輯器
能夠經過查詢郵箱的smtp服務器來配置,通常在郵箱的設置選項裏面能夠看到smtp服務器地址,例如網易的免費郵以下:ide
郵箱 | POP3 服務器(端口110) | SMTP 服務器(端口25) |
---|---|---|
188.com | pop3.188.com | smtp.188.com |
163.com | pop3.163.com | smtp.163.com |
126.com | pop3.126.com | smtp.126.com |
netease.com | pop.netease.com | smtp.netease.com |
yeah.net | pop.yeah.net | smtp.yeah.net |
可使用git am命令來應用補丁,
git am /temp/0001-B.patch工具
當git出現版本庫如提交或者推送事件的時候,會觸發鉤子(特定的腳本),鉤子中能夠處理其餘的一些事情,例如觸發CI構建,或者決定事件是否有效,例如提交的日誌不符合必定的格式,不能提交。
git的鉤子只屬於特定的版本庫,在clone操做的時候並不能複製。也就是每一個開發人員都須要設置經過複製文件的形式把鉤子腳本copy到.git/hooks目錄
通常鉤子分紅兩種:post
在.git/hooks目錄下,預製了不少鉤子樣例文件,直接把相應文件的.sample後綴去除就是一個鉤子文件。提交鉤子的流程以下:
pre-commit hook -----------------可使用--no-verify屏蔽,這個鉤子腳本調用的時候沒有入參,所以只能經過git diff --cache命令來得到提交的內容,而後進行判斷 | V commit-msg hook -------------可使用--no-verify屏蔽,這個鉤子腳本只有一個參數,即.git/COMMIT_EDITMSG文件的路徑位置。用戶能夠經過讀取這個文件來對提交的日誌進行一些校驗 | V actully do the commit | V post-commit hook --------------沒有入參
可使用git help hooks命令來查看當前版本支持的鉤子。
經過git 的對象能夠知道,每次提交存儲的都是一個完整的內容,而不是和上次提交的差別。這樣若是對應比較大的文件,而每次提交對該文件作了小小的改動,會致使對象庫裏面存儲效率很低。
爲了解決這種存儲效率低的問題,git提供了一種打包文件,git首先定位內容很是類似的所有文件,而後爲他們之一存儲整個文件內容,以後計算類似文件之間的差別而且只存儲差別。
打包文件在.git\objects\pack目錄下面。
git對象庫中可能存在大量的未引用的文件,例如git reset命令、git filter-branch命令。若是版本庫中有不少的鬆散對象,執行git reflog expire命令是,都會觸發git gc或者手動觸發gc命令,那麼就會清理對象庫中的文件
filter-branch命令是一個比較重量級的命令,能夠經過自定義的命令來利用它操做不一樣的git對象,從而重寫分支上的提交。
其具體應用以下:
一、修改author和committer,當咱們想把代碼庫公開的時候,可是想替換每一個提交的做者和郵箱地址,那麼可使用以下的命令:
$ git filter-branch --commit-filter ' if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ]; then GIT_AUTHOR_NAME="Scott Chacon"; GIT_AUTHOR_EMAIL="schacon@example.com"; git commit-tree "$@"; else git commit-tree "$@"; fi' HEAD
二、每個提交移除一個文件
這常常發生。 有人粗心地經過 git add . 提交了一個巨大的二進制文件,你想要從全部地方刪除它。 可能偶然地提交了一個包括一個密碼的文件,然而你想要開源項目。 filter-branch 是一個可能會用來擦洗整個提交歷史的工具。 爲了從整個提交歷史中移除一個叫作 passwords.txt 的文件,可使用 --tree-filter 選項給 filter-branch:
$ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21)
Ref 'refs/heads/master' was rewritten
--tree-filter 選項在檢出項目的每個提交後運行指定的命令而後從新提交結果。 在本例中,你從每個快照中移除了一個叫做 passwords.txt 的文件,不管它是否存在。 若是想要移除全部偶然提交的編輯器備份文件,能夠運行相似 git filter-branch --tree-filter 'rm -f *~' HEAD 的命令。
最後將能夠看到 Git 重寫樹與提交而後移動分支指針。 一般一個好的想法是在一個測試分支中作這件事,而後當你決定最終結果是真正想要的,能夠硬重置 master 分支。 爲了讓 filter-branch 在全部分支上運行,能夠給命令傳遞 --all 選項。
對於代碼庫合併可使用以下的步驟:
一、git remote add anoterURL ------------使用git remote命令添加其餘倉庫的url 二、git pull anoternURL --allow-unrelated-histories ------------使用git pull命令拉取其餘倉庫的代碼,注意要使用--allow-unrelated-histories
而若是須要把其餘的代碼庫檢查到當前代碼庫的某個子目錄,須要使用協同模型---子樹合併的方式,請參考後續的博客。
在windows下常用git clone命令或者checkout命令的時候,因爲須要檢查的代碼路徑超過了256致使失敗,這時能夠增長core.longpaths配置來解決。例如:git config core.longpaths true 若是該配置設置之後仍然不能生效,那麼須要檢查一下你的git版本是否太低,把git升級到新版本就能夠了,由於這個參數配置也是須要git高版本才能生效。