聽說好的程序員都在用github。
用github有一陣子了西疤,因?yàn)椴粫?huì)用Git烦粒,所以一直是通過GUI客戶端程序去同步代碼的,這樣明顯很low代赁。而且扰她,好多地方都沒搞清楚,比如芭碍,Issue用來干什么徒役?Pull Request怎么使用?
拒絕GUI窖壕,必須命令行忧勿。
看了《Github入門與實(shí)踐》一書杉女,經(jīng)過一番梳理和實(shí)踐,這次我終于懂得用Git和Github了鸳吸。
思維導(dǎo)圖
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是一款免費(fèi)、開源的分布式版本控制系統(tǒng)晌砾,用于敏捷高效地處理任何或小或大的項(xiàng)目坎拐。]
Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個(gè)開放源碼的版本控制軟件。
Git可以幫助我們管理代碼养匈,它是一個(gè)分布式版本控制系統(tǒng)哼勇。它設(shè)計(jì)了倉庫(版本庫)這樣一種管理機(jī)制;同時(shí)呕乎,不同于SVN,CVS集中式的版本控制理念积担,Git是分布式版本控制。
兩者的區(qū)別可以閱讀廖雪峰老師的文章:集中式vs分布式楣嘁。
而且磅轻,Git是通過命令行操作的珍逸。
基本操作
這里只簡(jiǎn)單羅列幾條命令逐虚,具體操作在下面通過Git創(chuàng)建本地倉庫會(huì)介紹到。
-
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
:添加遠(yuǎn)程倉庫 -
git push
:推送至遠(yuǎn)程倉庫 -
git clone
:獲取遠(yuǎn)程倉庫
分支
在進(jìn)行多個(gè)并行作業(yè)時(shí)谆膳,我們會(huì)用到分支叭爱。
master分支是Git默認(rèn)創(chuàng)建的分支,它就像河流的主干漱病,而我們根據(jù)需要买雾,創(chuàng)建的一個(gè)個(gè)分支,就相當(dāng)于河流分化出來的一個(gè)個(gè)小分流杨帽。
我們?cè)诜种线M(jìn)行編程作業(yè)(例如漓穿,每個(gè)負(fù)責(zé)項(xiàng)目的一個(gè)模塊開發(fā)),當(dāng)完成之后注盈,進(jìn)行審核無誤晃危,再合并到主分支master上,這樣就能合理高效地實(shí)現(xiàn)多人并行開發(fā)老客。
特性分支
特性分支僚饭,是集中實(shí)現(xiàn)單一特性(主題),除此之外不進(jìn)行任何作業(yè)的分支胧砰。
在日常開發(fā)過程中鳍鸵,我們常常會(huì)創(chuàng)建數(shù)個(gè)特性分支,同時(shí)在保留一個(gè)隨時(shí)可以發(fā)布軟件的穩(wěn)定分支尉间。穩(wěn)定分支的角色通常由master擔(dān)當(dāng)偿乖。
假設(shè)我們創(chuàng)建了一個(gè)feature-a分支击罪,這一分支主要實(shí)現(xiàn)feature-a,除feature-a的實(shí)現(xiàn)之外不進(jìn)行任何作業(yè)汹想。即便在開發(fā)過程中發(fā)現(xiàn)了Bug外邓,也需要再創(chuàng)建新的分支,在新分支中進(jìn)行修正古掏。
Github
Github是什么损话?
Github是一個(gè)網(wǎng)站。
一些開發(fā)者在使用Git以后槽唾,找不到好的Git托管網(wǎng)站丧枪,于是Tom Preston Werner 和 Chris Wanstrath 就開發(fā)了Github出來,提供Git倉庫托管服務(wù)庞萍。
所以拧烦,在我看來,它們兩者的關(guān)系就是:Git是一個(gè)系統(tǒng)钝计,相當(dāng)于一個(gè)工具恋博,而Github就是基于這樣一個(gè)系統(tǒng)的平臺(tái),讓開發(fā)者更高效地使用Git去托管自己的代碼私恬。
如何使用Github债沮?
因?yàn)镚it是使用倉庫進(jìn)行版本控制的,所以我們?cè)贕ithub的操作也是圍繞著倉庫展開本鸣。
當(dāng)我們想管理一個(gè)項(xiàng)目的代碼時(shí)疫衩,我們就在Github上創(chuàng)建一個(gè)倉庫,然后上傳項(xiàng)目代碼荣德,就實(shí)現(xiàn)了代碼托管闷煤。
所以,一般我們的開發(fā)流程是這樣的:
在本地通過Git建立一個(gè)倉庫涮瞻,我們稱之為“本地倉庫”鲤拿,然后進(jìn)行我們的編程工作。使用Git署咽,可以幫助實(shí)現(xiàn)版本控制近顷。
在Github上建立一個(gè)倉庫艇抠,我們稱之為“遠(yuǎn)程倉庫”幕庐,然后將本地倉庫的內(nèi)容推送到遠(yuǎn)程倉庫,同步代碼歹苦,這樣就實(shí)現(xiàn)了托管功能。
或者督怜,如果是先在Github上建立了倉庫殴瘦,設(shè)置好了項(xiàng)目,那么就將遠(yuǎn)程倉庫的項(xiàng)目克隆到本地倉庫号杠,同理蚪腋。
我個(gè)人的理解是,遠(yuǎn)程倉庫——操作Github姨蟋;本地倉庫——操作Git屉凯。
本地倉庫
創(chuàng)建——初始化倉庫
要使用Git進(jìn)行版本管理,必須先初始化倉庫眼溶。
-
建立一個(gè)目錄悠砚,并初始化倉庫。
如果初始化成功堂飞,執(zhí)行了git init
命令的目錄下就會(huì)生成.git目錄灌旧。這個(gè).git目錄里存著管理當(dāng)前目錄內(nèi)容所需的倉庫數(shù)據(jù)。我們將這個(gè)目錄的內(nèi)容成為“附屬于該倉庫的工作樹”绰筛。
-
查看倉庫狀態(tài)枢泰。
工作樹和倉庫在被操作過程中,狀態(tài)會(huì)不斷變化别智,所以需要經(jīng)常用gti status
查看當(dāng)前狀態(tài)宗苍。
提交——版本更新
編輯完代碼后稼稿,一個(gè)完整的提交流程應(yīng)該是:git status
-> git add
-> git commit
薄榛。
-
git status
——查看倉庫狀態(tài):
Untracked files表示修改過的文件尚未追蹤,即尚未成為倉庫的管理對(duì)象(加入到工作樹中)让歼。
-
git add
——加入暫存區(qū):暫存區(qū)是提交之前的一個(gè)臨時(shí)區(qū)域敞恋。git add
將其加入暫存區(qū),為保存到工作樹中做準(zhǔn)備谋右。
此時(shí)再運(yùn)行git status
硬猫,提示“Change to be committed”,說明是提交狀態(tài)改执。
-
git commit
——保存?zhèn)}庫的歷史記錄:將剛剛的提交狀態(tài)保存啸蜜,這樣就算完成了一個(gè)版本控制。
-m 參數(shù)后的字符串稱作提交信息辈挂,是對(duì)這個(gè)提交的描述衬横。
查看——倉庫狀態(tài)
-
git log——查看提交日志:查看以往倉庫中提交的日志,什么人在什么時(shí)候進(jìn)行了提交或合并终蒂,以及操作前后有怎樣的差別蜂林。
-
git diff——查看更改前后的差別:查看工作樹遥诉、暫存區(qū)、最新提交之間的差別噪叙。
-
查看工作樹和暫存區(qū)的區(qū)別:在test.html中寫點(diǎn)東西矮锈,先不用
git add
,直接運(yùn)行git diff
查看,此時(shí)顯示的是工作樹與最新提交狀態(tài)之間的差別睁蕾。
-
查看工作樹與最新提交的差別:先執(zhí)行
git add
將修改提交到暫存區(qū)苞笨;如果此時(shí)執(zhí)行git diff
,會(huì)發(fā)現(xiàn)沒有任何顯示,這是因?yàn)閳?zhí)行了git add
后工作樹和暫存區(qū)的狀態(tài)并無差別子眶。要查看與最新提交的差別猫缭,要執(zhí)行git diff HEAD
。
-
遠(yuǎn)程倉庫
準(zhǔn)備
-
創(chuàng)建賬戶:如果你還沒有Github賬戶壹店,那么你需要先創(chuàng)建一個(gè)賬戶猜丹。
登錄后,即可使用Github的功能硅卢,創(chuàng)建倉庫射窒。
設(shè)置SSH Key:Github上倉庫與本地倉庫連接,是通過使用了SSH的公開秘鑰認(rèn)證方式進(jìn)行的将塑。所以脉顿,得現(xiàn)在本地生成SSH Key,然后設(shè)置到Github上点寥,才能實(shí)現(xiàn)倉庫的遠(yuǎn)程連接艾疟。
-
打開Git Bash,創(chuàng)建SSH Key敢辩。
運(yùn)行命令:ssh-keygen -t rsa -C "your_email@example.com"
輸入密碼后蔽莱,會(huì)出現(xiàn)以下結(jié)果,表明創(chuàng)建成功:
id_rsa是私有密鑰戚长,id_rsa.pub是公開密鑰盗冷。
-
在Github中添加公開密鑰。
創(chuàng)建——建立遠(yuǎn)程倉庫
-
創(chuàng)建:
倉庫配置:
- 如果想向Github添加手中已有的Git倉庫同廉,建議不要勾選
Initialize this repository with a README
選項(xiàng)仪糖; - Add.gitignore:可以在初始化時(shí)生成.gitignore文件,這個(gè)設(shè)定會(huì)幫我們把不需要在Git倉庫中進(jìn)行版本管理的文件記錄在.gitignore文件中迫肖,省去了每次根據(jù)框架進(jìn)行設(shè)置的麻煩锅劝。若不使用任何框架,則可不選擇蟆湖。
- Add a license:選擇要添加的許可協(xié)議文件故爵,一般可不選。
-
創(chuàng)建成功:
克隆——獲取遠(yuǎn)程倉庫
當(dāng)你是先在Github上創(chuàng)建好項(xiàng)目倉庫時(shí)帐姻,此時(shí)需要把遠(yuǎn)程倉庫克隆到本地稠集,創(chuàng)建一個(gè)本地倉庫奶段。
- 復(fù)制HTTPS鏈接:
-
打開Git Bash,進(jìn)入要作為倉庫的文件目錄:
-
運(yùn)行命令:
git clone https://github.com/Monkey626/test.git
克隆成功:
-
進(jìn)入倉庫:查看當(dāng)前倉庫分支信息剥纷。
執(zhí)行g(shù)it clone命令后痹籍,我們會(huì)默認(rèn)處于master分支下,同時(shí)系統(tǒng)會(huì)自動(dòng)將origin設(shè)置成該遠(yuǎn)程倉庫的標(biāo)識(shí)符(即origin代表了該遠(yuǎn)程倉庫)晦鞋。
同步——更新代碼(從本地倉庫傳到遠(yuǎn)程倉庫)
當(dāng)在本地完成好編程作業(yè)時(shí)蹲缠,此時(shí)需要將代碼同步到遠(yuǎn)程倉庫,以實(shí)現(xiàn)托管悠垛。
- 添加遠(yuǎn)程倉庫:你需要將遠(yuǎn)程倉庫與本地倉庫連接起來线定,我們用
git remote add
命令來設(shè)置本地倉庫的遠(yuǎn)程倉庫。
- 推送至遠(yuǎn)程倉庫:如果想將當(dāng)前本地倉庫分支下的內(nèi)容推送給遠(yuǎn)程倉庫确买,要用
git push
命令斤讥。假定我們?cè)趍aster分支(如果是其他分支,最后的參數(shù)就改為其它分支對(duì)應(yīng)名稱)下操作
同步——更新代碼(從遠(yuǎn)程倉庫拉到本地倉庫)
當(dāng)你的隊(duì)友將完成了編程作業(yè)湾趾,將其代碼推送到遠(yuǎn)程倉庫后芭商,此時(shí),你可能需要將代遠(yuǎn)程倉庫隊(duì)友更新后的代碼拉到本地搀缠,這時(shí)要用到git pull
命令铛楣。
- 運(yùn)行命令行
git pull
:
- 拉取成功:
Github幾大功能
Issue
在軟件開發(fā)過程中,開發(fā)者們?yōu)榱烁橞UG及進(jìn)行軟件相關(guān)討論艺普,進(jìn)而方便管理簸州,創(chuàng)建了Issue。
在Github上歧譬,可以將它作為開發(fā)者之間的交流工具岸浑,多多加以利用。
Issue可以在以下情況使用:
- 發(fā)現(xiàn)軟件的Bug并報(bào)告缴罗;
- 有事想向作者詢問助琐、探討祭埂;
- 事先列出今后準(zhǔn)備實(shí)施的任務(wù)面氓。
Issue支持markdown語法,也支持添加標(biāo)簽便于管理蛆橡。
在Issue里可以添加圖片舌界,可以使用表情。
Pull Request
Pull Request是用戶修改代碼后向?qū)Ψ絺}庫發(fā)送采納請(qǐng)求的功能泰演,也是Github的核心功能呻拌。
Pull Request的流程:
-
Fork:將你要修改代碼的項(xiàng)目倉庫Fork到自己的Github賬號(hào)上,創(chuàng)建一個(gè)屬于你的倉庫睦焕;
-
Clone:將其clone到本地
-
Branch:在本地倉庫創(chuàng)建一個(gè)特性分支(有了更明確的主題藐握,也便于對(duì)方了解自己修改代碼的意圖)靴拱,用于本次代碼修改。
Commit:提交修改
- Push:要從Github發(fā)送Pull Ruquest猾普,Github端的倉庫必須有一個(gè)包含了修改后代碼的分支袜炕。所以,要?jiǎng)?chuàng)建本地特性分支的相應(yīng)遠(yuǎn)程分支初家。
-
Send:發(fā)送Pull Request偎窘。
這樣,就是一個(gè)完整的發(fā)送Pull Request流程溜在。
Wiki
Wiki是一個(gè)使用簡(jiǎn)單的語法就能編寫文檔的功能陌知。
所有有權(quán)限的人都可以對(duì)文中進(jìn)行修改。
Wiki多被用于編寫博客文章掖肋、教程仆葡、使用手冊(cè)。