據說好的程序員都在用github。html
用github有一陣子了,由於不會用Git,因此一直是經過GUI客戶端程序去同步代碼的,這樣明顯很low。並且,好多地方都沒搞清楚,好比,Issue用來幹什麼?Pull Request怎麼使用?git
拒絕GUI,必須命令行。程序員
看了《Github入門與實踐》一書,通過一番梳理和實踐,此次我終於懂得用Git和Github了。github
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
[譯:Git是一款免費、開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。]編程
Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。markdown
Git能夠幫助咱們管理代碼,它是一個分佈式版本控制系統。它設計了倉庫(版本庫)這樣一種管理機制;同時,不一樣於SVN,CVS集中式的版本控制理念,Git是分佈式版本控制。框架
二者的區別能夠閱讀廖雪峯老師的文章:集中式vs分佈式。ssh
並且,Git是經過命令行操做的。分佈式
這裏只簡單羅列幾條命令,具體操做在下面經過Git建立本地倉庫會介紹到。工具
git init
:初始化倉庫
git status
:查看倉庫狀態
git add
:向暫存區中添加文件
git commit
:保存倉庫的歷史記錄
git log
:查看提交日誌
git diff
:查看更改先後的差異
git branch
:顯示分支一覽表
git checkout -b
:建立並切換分支
git checkout
:切換分支
git merge
:合併分支
git reset
:回溯歷史版本
git remote add
:添加遠程倉庫
git push
:推送至遠程倉庫
git clone
:獲取遠程倉庫
在進行多個並行做業時,咱們會用到分支。
master分支是Git默認建立的分支,它就像河流的主幹,而咱們根據須要,建立的一個個分支,就至關於河流分化出來的一個個小分流。
咱們在分支上進行編程做業(例如,每一個負責項目的一個模塊開發),當完成以後,進行審覈無誤,再合併到主分支master上,這樣就能合理高效地實現多人並行開發。
特性分支,是集中實現單一特性(主題),除此以外不進行任何做業的分支。
在平常開發過程當中,咱們經常會建立數個特性分支,同時在保留一個隨時能夠發佈軟件的穩定分支。穩定分支的角色一般由master擔當。
假設咱們建立了一個feature-a分支,這一分支主要實現feature-a,除feature-a的實現以外不進行任何做業。即使在開發過程當中發現了Bug,也須要再建立新的分支,在新分支中進行修正。
Github是一個網站。
一些開發者在使用Git之後,找不到好的Git託管網站,因而Tom Preston Werner 和 Chris Wanstrath 就開發了Github出來,提供Git倉庫託管服務。
因此,在我看來,它們二者的關係就是:Git是一個系統,至關於一個工具,而Github就是基於這樣一個系統的平臺,讓開發者更高效地使用Git去託管本身的代碼。
由於Git是使用倉庫進行版本控制的,因此咱們在Github的操做也是圍繞着倉庫展開。
當咱們想管理一個項目的代碼時,咱們就在Github上建立一個倉庫,而後上傳項目代碼,就實現了代碼託管。
因此,通常咱們的開發流程是這樣的:
在本地經過Git創建一個倉庫,咱們稱之爲「本地倉庫」,而後進行咱們的編程工做。使用Git,能夠幫助實現版本控制。
在Github上創建一個倉庫,咱們稱之爲「遠程倉庫」,而後將本地倉庫的內容推送到遠程倉庫,同步代碼,這樣就實現了託管功能。
或者,若是是先在Github上創建了倉庫,設置好了項目,那麼就將遠程倉庫的項目克隆到本地倉庫,同理。
我我的的理解是,遠程倉庫——操做Github;本地倉庫——操做Git。
要使用Git進行版本管理,必須先初始化倉庫。
創建一個目錄,並初始化倉庫。
若是初始化成功,執行了git init
命令的目錄下就會生成.git目錄。這個.git目錄裏存着管理當前目錄內容所需的倉庫數據。咱們將這個目錄的內容成爲「附屬於該倉庫的工做樹」。
查看倉庫狀態。
工做樹和倉庫在被操做過程當中,狀態會不斷變化,因此須要常常用gti status
查看當前狀態。
編輯完代碼後,一個完整的提交流程應該是:git status
-> git add
-> git commit
。
git status
——查看倉庫狀態:
Untracked files表示修改過的文件還沒有追蹤,即還沒有成爲倉庫的管理對象(加入到工做樹中)。
git add
——加入暫存區:暫存區是提交以前的一個臨時區域。git add
將其加入暫存區,爲保存到工做樹中作準備。此時再運行git status
,提示「Change to be committed」,說明是提交狀態。
git commit
——保存倉庫的歷史記錄:將剛剛的提交狀態保存,這樣就算完成了一個版本控制。
-m 參數後的字符串稱做提交信息,是對這個提交的描述。
git log——查看提交日誌:查看以往倉庫中提交的日誌,什麼人在何時進行了提交或合併,以及操做先後有怎樣的差異。
git diff——查看更改先後的差異:查看工做樹、暫存區、最新提交之間的差異。
查看工做樹和暫存區的區別:在test.html中寫點東西,先不用git add
,直接運行git diff
查看,此時顯示的是工做樹與最新提交狀態之間的差異。
查看工做樹與最新提交的差異:先執行git add
將修改提交到暫存區;若是此時執行git diff
,會發現沒有任何顯示,這是由於執行了git add
後工做樹和暫存區的狀態並沒有差異。要查看與最新提交的差異,要執行git diff HEAD
。
建立帳戶:若是你尚未Github帳戶,那麼你須要先建立一個帳戶。
登陸後,便可使用Github的功能,建立倉庫。
設置SSH Key:Github上倉庫與本地倉庫鏈接,是經過使用了SSH的公開祕鑰認證方式進行的。因此,得如今本地生成SSH Key,而後設置到Github上,才能實現倉庫的遠程鏈接。
打開Git Bash,建立SSH Key。
運行命令:ssh-keygen -t rsa -C "your_email@example.com"
輸入密碼後,會出現如下結果,代表建立成功: id_rsa是私有密鑰,id_rsa.pub是公開密鑰。
在Github中添加公開密鑰。
建立:
倉庫配置:
若是想向Github添加手中已有的Git倉庫,建議不要勾選Initialize this repository with a README
選項;
Add.gitignore:能夠在初始化時生成.gitignore文件,這個設定會幫咱們把不須要在Git倉庫中進行版本管理的文件記錄在.gitignore文件中,省去了每次根據框架進行設置的麻煩。若不使用任何框架,則可不選擇。
Add a license:選擇要添加的許可協議文件,通常可不選。
建立成功:
當你是先在Github上建立好項目倉庫時,此時須要把遠程倉庫克隆到本地,建立一個本地倉庫。
複製HTTPS連接:
打開Git Bash,進入要做爲倉庫的文件目錄:
運行命令:git clone https://github.com/Monkey626/test.git
克隆成功:
進入倉庫:查看當前倉庫分支信息。
執行git clone命令後,咱們會默認處於master分支下,同時系統會自動將origin設置成該遠程倉庫的標識符(即origin表明了該遠程倉庫)。
當在本地完成好編程做業時,此時須要將代碼同步到遠程倉庫,以實現託管。
添加遠程倉庫:你須要將遠程倉庫與本地倉庫鏈接起來,咱們用git remote add
命令來設置本地倉庫的遠程倉庫。
推送至遠程倉庫:若是想將當前本地倉庫分支下的內容推送給遠程倉庫,要用git push
命令。假定咱們在master分支(若是是其餘分支,最後的參數就改成其它分支對應名稱)下操做
當你的隊友將完成了編程做業,將其代碼推送到遠程倉庫後,此時,你可能須要將代遠程倉庫隊友更新後的代碼拉到本地,這時要用到git pull
命令。
運行命令行git pull
:
拉取成功:
在軟件開發過程當中,開發者們爲了跟蹤BUG及進行軟件相關討論,進而方便管理,建立了Issue。
在Github上,能夠將它做爲開發者之間的交流工具,多多加以利用。
Issue能夠在如下狀況使用:
發現軟件的Bug並報告;
有事想向做者詢問、探討;
事先列出從此準備實施的任務。
Issue支持markdown語法,也支持添加標籤便於管理。
在Issue裏能夠添加圖片,可使用表情。
Pull Request是用戶修改代碼後向對方倉庫發送採納請求的功能,也是Github的核心功能。
Pull Request的流程:
Fork:將你要修改代碼的項目倉庫Fork到本身的Github帳號上,建立一個屬於你的倉庫;
Clone:將其clone到本地
Branch:在本地倉庫建立一個特性分支(有了更明確的主題,也便於對方瞭解本身修改代碼的意圖),用於本次代碼修改。
Commit:提交修改
Push:要從Github發送Pull Ruquest,Github端的倉庫必須有一個包含了修改後代碼的分支。因此,要建立本地特性分支的相應遠程分支。
Send:發送Pull Request。
這樣,就是一個完整的發送Pull Request流程。
Wiki是一個使用簡單的語法就能編寫文檔的功能。
全部有權限的人均可以對文中進行修改。
Wiki多被用於編寫博客文章、教程、使用手冊。