一、git的安裝
1.1、命令行方式安裝
??1)、下載windows git:https://git-scm.com/downloads
??2)、配置用戶信息
??- git config –-global user.name “zxt”
??- git config –-global user.email “2369470057@qq.com”

1.2、git 圖形界面安裝
??以上是git的命令行方式,也可以使用git的圖形界面,例如SourceTree。由于SourceTree個(gè)人版本的跳過(guò)注冊(cè)方式已經(jīng)無(wú)效,需要下載企業(yè)版本:
??下載地址:https://www.sourcetreeapp.com/enterprise。
??首次點(diǎn)擊msi進(jìn)行安裝 (當(dāng)前最新版SourcetreeEnterpriseSetup_3.0.17.msi),然后在 %programfiles(x86)%\Atlassian\Sourcetree 目錄下找到SourceTree.exe 運(yùn)行后會(huì)出現(xiàn)注冊(cè)界面:

??關(guān)掉sourcetree 打開(kāi)%LocalAppData%\Atlassian\SourceTree,新建文件:accounts.json。

accounts.json內(nèi)容代碼:
[
{
"$id": "1",
"$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",
"Authenticate": true,
"HostInstance": {
"$id": "2",
"$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
"Host": {
"$id": "3",
"$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
"Id": "atlassian account"
},
"BaseUrl": "https://id.atlassian.com/"
},
"Credentials": {
"$id": "4",
"$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
"Username": "",
"Email": null
},
"IsDefault": false
}
]
??然后再運(yùn)行%programfiles(x86)%\Atlassian\Sourcetree\SourceTree.exe即可跳過(guò)注冊(cè)。

??注冊(cè)完成SourceTree最終界面如下:

1.3、git架構(gòu)
??1、倉(cāng)庫(kù): 一個(gè)git倉(cāng)庫(kù)包含工作目錄,與.git目錄。其中.git目錄是工作目錄的下的一級(jí)子目錄。由于所有版本控制相關(guān)信息都在該.git目錄下,整個(gè)工作目錄保持與未版本控制時(shí)一樣的狀態(tài)。
??2、.git目錄: 該目錄下包含所有的配置,日志,分支,頭(HEAD)等版本控制所需的全部信息。
??3、工作目錄: 即版本控制管理的對(duì)象。是某項(xiàng)工作進(jìn)行的需要增減文件,變更文件內(nèi)容等操作所包含于的目錄。該目錄下的所有文件或目錄內(nèi)容可以被git管理。
??4、緩存區(qū)(Index): 主要用來(lái)保存下一次需要提交(正式修改)到git倉(cāng)庫(kù)中的內(nèi)容。又稱為Cache,Staging Area等。
??5、提交(Commit): 一次提交表示一組針對(duì)工作目錄內(nèi)容的修改或操作。例如新增了5個(gè)文件,刪除了2個(gè),修改了3個(gè)。這些修改信息一次性納入git倉(cāng)庫(kù)中,形成了對(duì)工作目錄整體的新的快照。在git中一次提交即對(duì)應(yīng)于新的快照,即可看作一個(gè)臨時(shí)版本。“提交”總是從緩沖區(qū)發(fā)出。
??6、分支(Branch): 分支可以看作一個(gè)指針,總是指向一個(gè)版本樹(shù)中的一個(gè)"提交"。分支幫助用戶指示版本樹(shù)中的某個(gè)分支。
??7、標(biāo)簽(Tag): 標(biāo)簽代表了版本歷史中的某些特殊點(diǎn)的標(biāo)識(shí),例如用來(lái)標(biāo)識(shí)版本發(fā)布點(diǎn)(v1.0,等等)。
??8、頭(HEAD): HEAD即指向當(dāng)前分支的指針。在git操作的命令中HEAD取當(dāng)前分支指向的"版本"(對(duì)應(yīng)于提交,標(biāo)簽等)。
??9、文件狀態(tài):
??已修改(Modified) - 文件已修改,且沒(méi)有存入緩存或者版本庫(kù);
??已緩存(Staged) - 文件最新修改已放入緩存區(qū)中,但尚未存入版本庫(kù);
??已提交(Committed) - 文件最新修改已存入版本庫(kù)。
??10、git可管理廣義的內(nèi)容:
??計(jì)算機(jī)科學(xué)相關(guān)的版本管理,各種設(shè)計(jì)工程的版本管理。
二、git的基本使用
2.1、創(chuàng)建倉(cāng)庫(kù)
1、使用git圖形界面操作。

??然后新建文件,編輯保存,提交(commit)。
2、使用git命令行操作。
??1、初始化版本庫(kù)
??- git init
??什么是版本庫(kù)呢?版本庫(kù)又名倉(cāng)庫(kù),英文名repository,你可以簡(jiǎn)單理解成一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被Git管理起來(lái),每個(gè)文件的修改、刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來(lái)某個(gè)時(shí)刻可以“還原”。
??git init命令瞬間git就把倉(cāng)庫(kù)建好了,可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git的目錄,默認(rèn)是隱藏的,用ls -ah命令就可以看見(jiàn)。
??2、添加文件到版本庫(kù)
??- git add
??- git commit
??git commit命令,-m后面輸入的是本次提交的說(shuō)明,可以輸入任意內(nèi)容,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄。
??一次可以add多個(gè)不同的文件,以空格分隔。
??3、查看倉(cāng)庫(kù)狀態(tài)
??- git status
??git status命令可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài)。

2.1.1、工作區(qū)和暫存區(qū)
??git和其他版本控制系統(tǒng)如SVN的一個(gè)不同之處就是有暫存區(qū)的概念。
??工作區(qū)就是你在電腦里能看到的目錄,工作區(qū)里有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是git的版本庫(kù)。
??git的版本庫(kù)里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有g(shù)it為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向 master的一個(gè)指針叫HEAD。
??前面講了我們把文件往 git 版本庫(kù)里添加的時(shí)候,是分兩步執(zhí)行的:
??第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);
??第二步是用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
??因?yàn)槲覀儎?chuàng)建git版本庫(kù)時(shí),git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支,所以現(xiàn)在git commit就是往master分支上提交更改。
??你可以簡(jiǎn)單理解為,git add命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stage),然后執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支。一旦提交后,如果你又沒(méi)有對(duì)工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的。
2.1.2、其他常用命令
??4、提交日志
??- git log
??git log命令顯示從最近到最遠(yuǎn)的提交日志。如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù):git log --pretty=oneline。
??在 Git中,用HEAD表示當(dāng)前版本,也就是最新的提交commit id,上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過(guò)來(lái),所以寫成HEAD~100。
??現(xiàn)在我們要把當(dāng)前版本回退到上一個(gè)版本,就可以使用git reset命令:
??git reset --hard HEAD^
??或者 git reset commit id
??5、修改與撤銷
??用git diff HEAD -- readme.md命令可以查看工作區(qū)和版本庫(kù)里面最新版本的區(qū)別。
??git checkout -- file可以丟棄工作區(qū)的修改:git checkout -- readme.md
??命令git checkout -- readme.md意思就是,把readme.md文件在工作區(qū)的修改全部撤銷,即讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)。
??當(dāng)然也可以用git reset命令。
??6、刪除文件
??一般情況下,你通常直接在文件管理器中把沒(méi)用的文件刪了,或者用rm命令刪了:
??rm readme.md
??這個(gè)時(shí)候,git 知道你刪除了文件,因此,工作區(qū)和版本庫(kù)就不一致了,git status命令會(huì)立刻告訴你哪些文件被刪除了。
??現(xiàn)在你有兩個(gè)選擇,一是確實(shí)要從版本庫(kù)中刪除該文件,那就用命令git rm刪掉,并且git commit:
??git rm readme.md
??git commit -m "remove readme.md"
??現(xiàn)在,文件就從版本庫(kù)中被刪除了。
??另一種情況是刪錯(cuò)了,因?yàn)榘姹編?kù)里還有呢,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:
??git checkout -- readme.md
2.2、git工作流

??實(shí)際上版本庫(kù)中所有的數(shù)據(jù)都保存在objects里面,index(緩存區(qū))與master中保存的都是指向數(shù)據(jù)的指針。
??git的一般工作流程如下:
??1、git clone 克隆遠(yuǎn)程資源到本地目錄,作為工作目錄;
??2、然后在本地的克隆目錄上添加或修改文件;
??3、如果遠(yuǎn)程修改了,需要同步遠(yuǎn)程的內(nèi)容,直接git pull就可以更新本地的文件;
??4、本地在修改之后,可以通過(guò)git status 查看修改的文件。然后使用git add 添加修改的文件暫到緩沖區(qū);
??5、在添加之后,可以使用git commit添加到當(dāng)前的工作區(qū);
??6、在修改完成后,如果發(fā)現(xiàn)錯(cuò)誤,可以撤回提交并再次修改并提交;
??7、git push將本地的修改推送到遠(yuǎn)程的git服務(wù)器。
2.3、git主要功能
2.3.1、添加遠(yuǎn)程倉(cāng)庫(kù)
??1、創(chuàng)建SSH key:ssh –keygen –t rsa –C youremail@example.com。

??創(chuàng)建 SSH Key。在用戶主目錄下,看看有沒(méi)有.ssh目錄,如果有,再看看這個(gè)目錄下有沒(méi)有id_rsa和id_rsa.pub這兩個(gè)文件,如果已經(jīng)有了,可直接跳到下一步。如果沒(méi)有,打開(kāi) Shell(Windows下打開(kāi)Git Bash),創(chuàng)建SSH Key:
??ssh-keygen -t rsa -C youremail@example.com
??你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認(rèn)值即可。
??如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個(gè)文件,這兩個(gè)就是SSH Key的秘鑰對(duì),id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
??然后登錄GitHub(或者其它Git代碼托管平臺(tái)),打開(kāi)Account settings,SSH Keys頁(yè)面,點(diǎn)Add SSH Key,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容。
??為什么GitHub需要SSH Key呢?因?yàn)镚itHub需要識(shí)別出你推送的提交確實(shí)是你推送的,而不是別人冒充的,而Git支持SSH協(xié)議,所以GitHub只要知道了你的公鑰,就可以確認(rèn)只有你自己才能推送。
??當(dāng)然,GitHub允許你添加多個(gè)Key。假定你有若干電腦,你一會(huì)兒在公司提交,一會(huì)兒在家里提交,只要把每臺(tái)電腦的Key都添加到GitHub,就可以在每臺(tái)電腦上往GitHub推送了。
??2、然后將SSH配置到SourceTree的客戶端。(工具--->選項(xiàng))

??3、添加遠(yuǎn)程倉(cāng)庫(kù)
??1)、git remote add origin git@github.com
??2)、git pull origin master –allow-unrelated-histories
??3)、git push –u origin master

2.3.2、克隆倉(cāng)庫(kù)
??克隆遠(yuǎn)程倉(cāng)庫(kù)中的代碼到本地:git clone git@github.com:zengxt/Test.git。

2.3.3、標(biāo)簽管理
??查看所有標(biāo)簽 git tag
??創(chuàng)建標(biāo)簽 git tag name
??指定提交信息 git tag –a name –m “comment”
??刪除標(biāo)簽 git tag –d name
??標(biāo)簽發(fā)布 git push origin name


2.3.4、分支管理
??查看分支:git branch
??創(chuàng)建分支:git branch name
??切換分支:git checkout name
??合并分支:git merge name (該命令需要在master分支上運(yùn)行)
??刪除分支:git branch –d name
??分支發(fā)布:git push origin name


三、理解 Github Flow
??GitHub Flow 是一個(gè)非常輕便的,基于分支的工作流。非常適合代碼部署非常頻繁的團(tuán)隊(duì)和項(xiàng)目。

??1、創(chuàng)建一個(gè)分支
??當(dāng)你在開(kāi)發(fā)一個(gè)項(xiàng)目的時(shí)候,一般在同一時(shí)刻你會(huì)同時(shí)開(kāi)展多個(gè)想法,其中一些比較成熟了,另一些還是很初級(jí)。有了分支就可以很好的來(lái)進(jìn)行管理了。
??當(dāng)你在項(xiàng)目中創(chuàng)建一個(gè)分支的時(shí)候,你正在搭建一個(gè)可以嘗試新想法的環(huán)境。你在新分支上所做的修改不會(huì)影響到主(master) 分支,所以你能自由實(shí)驗(yàn)和提交修改。在被你的同事審核之前,你的分支是不會(huì)被合并的,所以一切都是安全的。
??深度技巧
??分支是 Git 的一個(gè)核心概念,整個(gè) GitHub Flow 也是基于它的。最重要的規(guī)則只有一個(gè):主(master)分支上的任何內(nèi)容都要保證是可部署的。
??正因?yàn)槿绱耍?dāng)開(kāi)發(fā)一個(gè)新功能或者修復(fù)錯(cuò)誤的時(shí)候,你的新分支獨(dú)立于主分支是極其重要的。你的分支名應(yīng)該見(jiàn)名知義(例如,refactor-authentication,user-content-cache-key,make-retina-avatars), 以便讓其他人知道你正在做什么工作。

??2、添加新版本
??一旦你的分支創(chuàng)建好之后,就可以開(kāi)始做些修改了。不論何時(shí)你添加,編輯或者刪除一個(gè)文件,你就做一個(gè)版本,然后把它們添加到你的分支中。 添加版本的過(guò)程就跟蹤了你在一個(gè)功能分支上的工作進(jìn)展。
??版本也為你的工作創(chuàng)建了一個(gè)透明的歷史,其他人可以跟隨著去理解你所做的工作以及為什么要這樣做。每一個(gè)版本都有一條相關(guān)聯(lián)的版本信息, 版本信息是一段描述,解釋了為什么要做這樣一個(gè)特定的修改。此外,每一個(gè)版本都可以看作是一個(gè)獨(dú)立的修改單元。這樣如果你不小心改錯(cuò)了,或者是改變了開(kāi)發(fā)思路的時(shí)候,就可以來(lái)回滾修改了。
??深度技巧
??版本信息很重要,因?yàn)橐坏┠愕男薷谋煌扑偷椒?wù)器上,它們會(huì)以一個(gè)一個(gè)版本的形式顯示。 通過(guò)書寫清楚的版本信息,你可以更容易讓其他人跟上你的思路并提供反饋。

??3、開(kāi)啟一個(gè) Pull Request
??Pull Request 用來(lái)發(fā)起對(duì)你做的各個(gè)版本的討論。因?yàn)?Pull Request 與底層的Git倉(cāng)庫(kù)代碼是緊密相關(guān)的,任何人都能確切地看到一旦他接受了你的 Pull Request 會(huì)有那些代碼合并進(jìn)來(lái)。
??在開(kāi)發(fā)過(guò)程中的任意時(shí)點(diǎn),你都可以開(kāi)啟一個(gè) Pull Request:當(dāng)你有很少或沒(méi)有代碼,但想要分享一些截圖或基本想法的時(shí)候, 當(dāng)你陷入困境需要幫助和建議的時(shí)候,或者當(dāng)你準(zhǔn)備好讓他人審核你工作的時(shí)候。通過(guò)在你的 Pull Request 信息中使用 GitHub 的@mention 系統(tǒng),你可以向特定的人或團(tuán)隊(duì)請(qǐng)求反饋,不管他們就在大廳的那邊,還是離你有十個(gè)時(shí)區(qū)之遙。
??深度技巧
??Pull Requests 對(duì)貢獻(xiàn)開(kāi)源項(xiàng)目和管理共享倉(cāng)庫(kù)的變動(dòng)是非常有用的。若你正使用 Fork & Pull 模式,Pull Resquest 提供了一種方式來(lái)通知項(xiàng)目維護(hù)者你希望他們考慮一下你提交的修改。若你正使用一個(gè)共享倉(cāng)庫(kù)模式,在提議修改被合并到主分支中之前,Pull Resquest 可以啟動(dòng)對(duì)修改代碼的審核和討論。

??4、討論和代碼審核
??一旦開(kāi)啟了一個(gè) Pull Request,審核你修改的人或團(tuán)隊(duì)會(huì)來(lái)提出問(wèn)題和評(píng)論。有可能是代碼風(fēng)格符不符合項(xiàng)目規(guī)范, 也或者代碼忘了單元測(cè)試,也可能各方面都沒(méi)問(wèn)題。Pull Request 就是為了鼓勵(lì)這種類型的討論而設(shè)計(jì)的。
??根據(jù)對(duì)你所做版本的討論和反饋,你也可以繼續(xù)往你的分支上推送代碼。若有人評(píng)論說(shuō)你忘記做某件事或你的代碼中存在 bug,你可以在你的分支中修復(fù)它,并提交這些修改。Github 將會(huì)在同一個(gè) Pull Request 中展示你的新修改和任何新的反饋。
??深度技巧
??Pull Request 中評(píng)論是用 Markdown 格式書寫的,所以你可以在評(píng)論中嵌入圖片和 emoji 表情符號(hào),使用帶有格式的文本塊,和其它輕量級(jí)格式。

??5、部署
??使用GitHub,您可以從分支進(jìn)行部署,以便在合并到master之前進(jìn)行最終的生產(chǎn)測(cè)試。
??一旦您的Pull Resquest被審核并且分支通過(guò)了您的測(cè)試,您就可以部署您的變更來(lái)在生產(chǎn)中驗(yàn)證它們。如果您的分支引發(fā)問(wèn)題,您可以在生產(chǎn)環(huán)境中回滾它到master。

??6、合并
??一旦大家審核了你的 Pull Request 并且所有代碼通過(guò)了測(cè)試,就是可以把你的代碼合并到主分支了。
??一旦合并之后,Pull Request 會(huì)保留代碼的歷史修改記錄。因?yàn)樗鼈兪强伤阉鞯?,它們讓人可以回到過(guò)去,去理解為什么做這個(gè)決定以及怎樣做的決定。
??深度技巧
??通過(guò)在你的 Pull Request 中包含某些特定關(guān)鍵詞,你就能用代碼關(guān)聯(lián) issues。在你的 Pull Request 被合并的時(shí)候,與其相關(guān)的 issues 也會(huì)關(guān)閉。 例如,輸入這個(gè)短語(yǔ) Closes #32 將會(huì)關(guān)閉倉(cāng)庫(kù)中編號(hào)為32的 issue。
四、GitHub Pages 搭建網(wǎng)站
??Github Pages 是 github 公司提供的免費(fèi)的靜態(tài)網(wǎng)站托管服務(wù),用起來(lái)方便而且功能強(qiáng)大,不僅沒(méi)有空間限制,還可以綁定自己的域名。
??到 https://pages.github.com/上,看到可以創(chuàng)建的網(wǎng)站有兩類,一類是為自己或者是自己的組織創(chuàng)建站點(diǎn),就是新建一個(gè)倉(cāng)庫(kù),倉(cāng)庫(kù)的名字叫做,username.github.io 或者是 orgnizationname.github.io,注意這里的 username 和 orgnizationname 要嚴(yán)格替換成你自己的用戶名或者組織名,大小寫也要區(qū)分,不然就會(huì)有問(wèn)題。然后就往倉(cāng)庫(kù)里面放頁(yè)面內(nèi)容就行了。第二類是為項(xiàng)目創(chuàng)建網(wǎng)站,這個(gè)其實(shí)主要步驟都是一樣的,只不過(guò)稍微比創(chuàng)建用戶或組織網(wǎng)站復(fù)雜一點(diǎn)點(diǎn)。
??1、在項(xiàng)目上新建一個(gè)gh-pages分支(名字不要寫錯(cuò))。
??2、在這個(gè)分支中添加index.html,編寫網(wǎng)頁(yè)內(nèi)容。
??3、訪問(wèn):http://username.github.io/projectname/即可。
