聽說好的程序員都在用github。
用github有一陣子了,因為不會用Git,所以一直是通過GUI客戶端程序去同步代碼的,這樣明顯很low。而且,好多地方都沒搞清楚,比如,Issue用來干什么?Pull Request怎么使用?
拒絕GUI,必須命令行。
看了《Github入門與實踐》一書,經(jīng)過一番梳理和實踐,這次我終于懂得用Git和Github了。
思維導圖
Git
Git是什么?
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是一款免費、開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項目。]
Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件。
Git可以幫助我們管理代碼,它是一個分布式版本控制系統(tǒng)。它設計了倉庫(版本庫)這樣一種管理機制;同時,不同于SVN,CVS集中式的版本控制理念,Git是分布式版本控制。
兩者的區(qū)別可以閱讀廖雪峰老師的文章:集中式vs分布式。
而且,Git是通過命令行操作的。
基本操作
這里只簡單羅列幾條命令,具體操作在下面通過Git創(chuàng)建本地倉庫會介紹到。
-
git init
:初始化倉庫 -
git status
:查看倉庫狀態(tài) -
git add
:向暫存區(qū)中添加文件 -
git commit
:保存?zhèn)}庫的歷史記錄 -
git log
:查看提交日志 -
git diff
:查看更改前后的差別 -
git branch
:顯示分支一覽表 -
git checkout -b
:創(chuàng)建并切換分支 -
git checkout
:切換分支 -
git merge
:合并分支 -
git reset
:回溯歷史版本 -
git remote add
:添加遠程倉庫 -
git push
:推送至遠程倉庫 -
git clone
:獲取遠程倉庫
分支
在進行多個并行作業(yè)時,我們會用到分支。
master分支是Git默認創(chuàng)建的分支,它就像河流的主干,而我們根據(jù)需要,創(chuàng)建的一個個分支,就相當于河流分化出來的一個個小分流。
我們在分支上進行編程作業(yè)(例如,每個負責項目的一個模塊開發(fā)),當完成之后,進行審核無誤,再合并到主分支master上,這樣就能合理高效地實現(xiàn)多人并行開發(fā)。
特性分支
特性分支,是集中實現(xiàn)單一特性(主題),除此之外不進行任何作業(yè)的分支。
在日常開發(fā)過程中,我們常常會創(chuàng)建數(shù)個特性分支,同時在保留一個隨時可以發(fā)布軟件的穩(wěn)定分支。穩(wěn)定分支的角色通常由master擔當。
假設我們創(chuàng)建了一個feature-a分支,這一分支主要實現(xiàn)feature-a,除feature-a的實現(xiàn)之外不進行任何作業(yè)。即便在開發(fā)過程中發(fā)現(xiàn)了Bug,也需要再創(chuàng)建新的分支,在新分支中進行修正。
Github
Github是什么?
Github是一個網(wǎng)站。
一些開發(fā)者在使用Git以后,找不到好的Git托管網(wǎng)站,于是Tom Preston Werner 和 Chris Wanstrath 就開發(fā)了Github出來,提供Git倉庫托管服務。
所以,在我看來,它們兩者的關系就是:Git是一個系統(tǒng),相當于一個工具,而Github就是基于這樣一個系統(tǒng)的平臺,讓開發(fā)者更高效地使用Git去托管自己的代碼。
如何使用Github?
因為Git是使用倉庫進行版本控制的,所以我們在Github的操作也是圍繞著倉庫展開。
當我們想管理一個項目的代碼時,我們就在Github上創(chuàng)建一個倉庫,然后上傳項目代碼,就實現(xiàn)了代碼托管。
所以,一般我們的開發(fā)流程是這樣的:
在本地通過Git建立一個倉庫,我們稱之為“本地倉庫”,然后進行我們的編程工作。使用Git,可以幫助實現(xiàn)版本控制。
在Github上建立一個倉庫,我們稱之為“遠程倉庫”,然后將本地倉庫的內(nèi)容推送到遠程倉庫,同步代碼,這樣就實現(xiàn)了托管功能。
或者,如果是先在Github上建立了倉庫,設置好了項目,那么就將遠程倉庫的項目克隆到本地倉庫,同理。
我個人的理解是,遠程倉庫——操作Github;本地倉庫——操作Git。
本地倉庫
創(chuàng)建——初始化倉庫
要使用Git進行版本管理,必須先初始化倉庫。
-
建立一個目錄,并初始化倉庫。
如果初始化成功,執(zhí)行了git init
命令的目錄下就會生成.git目錄。這個.git目錄里存著管理當前目錄內(nèi)容所需的倉庫數(shù)據(jù)。我們將這個目錄的內(nèi)容成為“附屬于該倉庫的工作樹”。
-
查看倉庫狀態(tài)。
工作樹和倉庫在被操作過程中,狀態(tài)會不斷變化,所以需要經(jīng)常用gti status
查看當前狀態(tài)。
提交——版本更新
編輯完代碼后,一個完整的提交流程應該是:git status
-> git add
-> git commit
。
-
git status
——查看倉庫狀態(tài):
Untracked files表示修改過的文件尚未追蹤,即尚未成為倉庫的管理對象(加入到工作樹中)。
-
git add
——加入暫存區(qū):暫存區(qū)是提交之前的一個臨時區(qū)域。git add
將其加入暫存區(qū),為保存到工作樹中做準備。
此時再運行git status
,提示“Change to be committed”,說明是提交狀態(tài)。
-
git commit
——保存?zhèn)}庫的歷史記錄:將剛剛的提交狀態(tài)保存,這樣就算完成了一個版本控制。
-m 參數(shù)后的字符串稱作提交信息,是對這個提交的描述。
查看——倉庫狀態(tài)
-
git log——查看提交日志:查看以往倉庫中提交的日志,什么人在什么時候進行了提交或合并,以及操作前后有怎樣的差別。
-
git diff——查看更改前后的差別:查看工作樹、暫存區(qū)、最新提交之間的差別。
-
查看工作樹和暫存區(qū)的區(qū)別:在test.html中寫點東西,先不用
git add
,直接運行git diff
查看,此時顯示的是工作樹與最新提交狀態(tài)之間的差別。
-
查看工作樹與最新提交的差別:先執(zhí)行
git add
將修改提交到暫存區(qū);如果此時執(zhí)行git diff
,會發(fā)現(xiàn)沒有任何顯示,這是因為執(zhí)行了git add
后工作樹和暫存區(qū)的狀態(tài)并無差別。要查看與最新提交的差別,要執(zhí)行git diff HEAD
。
-
遠程倉庫
準備
-
創(chuàng)建賬戶:如果你還沒有Github賬戶,那么你需要先創(chuàng)建一個賬戶。
登錄后,即可使用Github的功能,創(chuàng)建倉庫。
設置SSH Key:Github上倉庫與本地倉庫連接,是通過使用了SSH的公開秘鑰認證方式進行的。所以,得現(xiàn)在本地生成SSH Key,然后設置到Github上,才能實現(xiàn)倉庫的遠程連接。
-
打開Git Bash,創(chuàng)建SSH Key。
運行命令:ssh-keygen -t rsa -C "your_email@example.com"
輸入密碼后,會出現(xiàn)以下結(jié)果,表明創(chuàng)建成功:
id_rsa是私有密鑰,id_rsa.pub是公開密鑰。
-
在Github中添加公開密鑰。
創(chuàng)建——建立遠程倉庫
-
創(chuàng)建:
倉庫配置:
- 如果想向Github添加手中已有的Git倉庫,建議不要勾選
Initialize this repository with a README
選項; - Add.gitignore:可以在初始化時生成.gitignore文件,這個設定會幫我們把不需要在Git倉庫中進行版本管理的文件記錄在.gitignore文件中,省去了每次根據(jù)框架進行設置的麻煩。若不使用任何框架,則可不選擇。
- Add a license:選擇要添加的許可協(xié)議文件,一般可不選。
-
創(chuàng)建成功:
克隆——獲取遠程倉庫
當你是先在Github上創(chuàng)建好項目倉庫時,此時需要把遠程倉庫克隆到本地,創(chuàng)建一個本地倉庫。
- 復制HTTPS鏈接:
-
打開Git Bash,進入要作為倉庫的文件目錄:
-
運行命令:
git clone https://github.com/Monkey626/test.git
克隆成功:
-
進入倉庫:查看當前倉庫分支信息。
執(zhí)行git clone命令后,我們會默認處于master分支下,同時系統(tǒng)會自動將origin設置成該遠程倉庫的標識符(即origin代表了該遠程倉庫)。
同步——更新代碼(從本地倉庫傳到遠程倉庫)
當在本地完成好編程作業(yè)時,此時需要將代碼同步到遠程倉庫,以實現(xiàn)托管。
- 添加遠程倉庫:你需要將遠程倉庫與本地倉庫連接起來,我們用
git remote add
命令來設置本地倉庫的遠程倉庫。
- 推送至遠程倉庫:如果想將當前本地倉庫分支下的內(nèi)容推送給遠程倉庫,要用
git push
命令。假定我們在master分支(如果是其他分支,最后的參數(shù)就改為其它分支對應名稱)下操作
同步——更新代碼(從遠程倉庫拉到本地倉庫)
當你的隊友將完成了編程作業(yè),將其代碼推送到遠程倉庫后,此時,你可能需要將代遠程倉庫隊友更新后的代碼拉到本地,這時要用到git pull
命令。
- 運行命令行
git pull
:
- 拉取成功:
Github幾大功能
Issue
在軟件開發(fā)過程中,開發(fā)者們?yōu)榱烁橞UG及進行軟件相關討論,進而方便管理,創(chuàng)建了Issue。
在Github上,可以將它作為開發(fā)者之間的交流工具,多多加以利用。
Issue可以在以下情況使用:
- 發(fā)現(xiàn)軟件的Bug并報告;
- 有事想向作者詢問、探討;
- 事先列出今后準備實施的任務。
Issue支持markdown語法,也支持添加標簽便于管理。
在Issue里可以添加圖片,可以使用表情。
Pull Request
Pull Request是用戶修改代碼后向?qū)Ψ絺}庫發(fā)送采納請求的功能,也是Github的核心功能。
Pull Request的流程:
-
Fork:將你要修改代碼的項目倉庫Fork到自己的Github賬號上,創(chuàng)建一個屬于你的倉庫;
-
Clone:將其clone到本地
-
Branch:在本地倉庫創(chuàng)建一個特性分支(有了更明確的主題,也便于對方了解自己修改代碼的意圖),用于本次代碼修改。
Commit:提交修改
- Push:要從Github發(fā)送Pull Ruquest,Github端的倉庫必須有一個包含了修改后代碼的分支。所以,要創(chuàng)建本地特性分支的相應遠程分支。
-
Send:發(fā)送Pull Request。
這樣,就是一個完整的發(fā)送Pull Request流程。
Wiki
Wiki是一個使用簡單的語法就能編寫文檔的功能。
所有有權(quán)限的人都可以對文中進行修改。
Wiki多被用于編寫博客文章、教程、使用手冊。