工欲善其事必先利其器,對(duì)于乘風(fēng)破浪的程序員后浪們來說,最基礎(chǔ)也最重要的工具便是Git了。Git是程序員代碼的托管平臺(tái),與同事一起協(xié)作辦公的工具,代碼變更的記錄存儲(chǔ),所以Git知識(shí)的掌握非常重要,利用好工具也能更好的服務(wù)于工作。大家今天有福利了,因?yàn)榻裉煳覀儠?huì)詳細(xì)的給大家介紹Git相關(guān)知識(shí),全方位的讓你掌握Git~
本文介紹的內(nèi)容包含Git初階之Git是什么?、Git初階之Git的理論基礎(chǔ)、Git初階之Git的常用基礎(chǔ)命令、Git中階之沖突處理、Git高階之回退。
Git是什么?
Git是一個(gè)分布式版本控制系統(tǒng),存儲(chǔ)文件內(nèi)容和文件變更記錄。所謂分布式是相對(duì)于集中式而言的,集中式是有一臺(tái)中心服務(wù)器,所有的文件都存儲(chǔ)在上面,這樣出現(xiàn)的問題是如果這個(gè)服務(wù)器宕機(jī)了或壞掉了,那么所有的文件都沒了。分布式就是去中心化,每臺(tái)服務(wù)器都可以存儲(chǔ)項(xiàng)目?jī)?nèi)容,這樣即使某一臺(tái)壞掉了,其他的人還可以從別的服務(wù)器去拷貝獲取內(nèi)容。所謂版本控制系統(tǒng)就是存儲(chǔ)代碼、文檔等內(nèi)容,并且把每次內(nèi)容的變更詳情都清晰的記錄下來。常用的Git工具有Github、Gitlab、Gitee等。Git的分布式文件系統(tǒng)概念就好像是在一個(gè)家庭里把錢全交給老婆管,每一次的進(jìn)賬出賬全以本本記錄下來,老婆如果跟著別人跑了或者自己去炒股,那么所有的錢都沒了,但如果是家里每個(gè)人都管一部分,這個(gè)即使老婆這部分沒了,老公那剩余的錢還可以支撐整個(gè)家庭,而每一次錢的變動(dòng)(比如增加多少、花在什么地方、誰花的)全都清清楚楚記錄下來。
Git的理論基礎(chǔ)
理論基礎(chǔ)1之基礎(chǔ)概念。在Git中最基礎(chǔ)的三個(gè)概念是工作區(qū)workspace、倉庫repository、暫存區(qū)Index。所謂工作區(qū)就是電腦上的本地文件和目錄,通過Git的版本控制,構(gòu)成了工作區(qū)。所謂暫存區(qū)就是暫時(shí)存放代碼的地方。所謂倉庫就是存儲(chǔ)代碼的地方,包含本地倉庫和遠(yuǎn)程倉庫,本地倉庫用于自己寫新代碼,寫好了先提交到暫存區(qū),經(jīng)過多次提交感覺差不多了,最后在提交到遠(yuǎn)程倉庫。整體的工作流程就像是儲(chǔ)蓄,比如擺地?cái)偟某绦騿T小ke,他通過每天的辛苦勞動(dòng),每天的收錢罐(暫存區(qū))都有對(duì)應(yīng)的錢,辛苦忙完一天后,小ke會(huì)盤算每天的進(jìn)賬,把錢放到家里的存錢罐(本地倉庫),擺地?cái)偤軖赍X啊(哼?還寫什么代碼呢,擺攤?cè)タ?,不到一月,小ke已經(jīng)掙了一萬有余了,存錢罐也快放不下來,再說也不太安全,因此小ke找個(gè)時(shí)間就去銀行(遠(yuǎn)程倉庫)把錢存起來了。以前小ke只能在家或離家比較近的地方才能使用自己的錢(因?yàn)榇驽X罐在家),如果存錢罐丟了就啥都沒有了,而現(xiàn)在把錢存在銀行里,走遍大江南北,都可以使用自己的錢,如果把密碼告訴別人,別人也可以來使用自己的錢,而且每筆消費(fèi)銀行都有流水單記錄清清楚楚,再也不擔(dān)心錢丟了。
Git的常用命令
在日常開發(fā)中我們最常用到的命令有g(shù)itclone、gitcheckout -b dev、gitadd、gitcommit、gitlog、gitdiff 、gitstatus 、gitpull 、gitpush。一個(gè)完整的項(xiàng)目開發(fā)流程大概如下,加入新團(tuán)隊(duì)接手一個(gè)項(xiàng)目后,在進(jìn)入開發(fā)前,先使用gitclone將遠(yuǎn)程版本庫的內(nèi)容克隆到本地,為了不污染master分支(保持穩(wěn)定版本,發(fā)布生產(chǎn)環(huán)境),我們使用gitcheckout -bdev創(chuàng)建一個(gè)新的dev分支進(jìn)行新功能的開發(fā),新功能進(jìn)入開發(fā)后,每天在本地寫的代碼都可以提交,這邊便于快速驗(yàn)證和團(tuán)隊(duì)成員check,使用gitadd .命令邊可以把所有的代碼從本地文件夾提交到暫存區(qū),使用gitcommit -m “this is a description"便可以將暫存區(qū)內(nèi)容提交到本地倉庫,使用gitstatus便可以查看工作區(qū)的狀態(tài)(是否有變動(dòng)、變動(dòng)內(nèi)容等),在本地倉庫使用gitlog看所有的提交日志,使用gitdiff看暫存區(qū)和工作區(qū)的差別,在本地倉庫差不多完事兒后,使用gitpush origin dev可以把本地的代碼提交到遠(yuǎn)程倉庫的dev分支了,使用gitmergemaster便可以把當(dāng)前dev分支的內(nèi)容合并到master分支。至此,所有有遠(yuǎn)程倉庫權(quán)限的人都可以查看代碼,寫新的代碼提交,因此每次進(jìn)行新的開發(fā)之前,都需要gitpull 拉起遠(yuǎn)程所有分支更新并合并到本地分支進(jìn)行開發(fā),保障始終在最新的內(nèi)容上做修改。
Git的沖突處理
在Git中多個(gè)人合作開發(fā),對(duì)同一個(gè)倉庫進(jìn)行內(nèi)容修改,多個(gè)開發(fā)分支并存,那么出現(xiàn)沖突是很正常的。對(duì)于同一個(gè)文件,不同的人拉取了不同的分支,基于這個(gè)文件去做改動(dòng)和修改,最后要把修改合并到master分支,那么應(yīng)該以哪個(gè)為準(zhǔn)呢?這個(gè)時(shí)候沖突就產(chǎn)生了。常用的沖突解決方案也很簡(jiǎn)單,根據(jù)git的反饋找到?jīng)_突文件,查看沖突內(nèi)容,決定要保留哪些、拋棄哪些,最后再重新提交就可以了。就像和朋友一起在地?cái)偵腺I烤串的時(shí)候,你說要3串牛肉串、他說要5串牛肉串、我說要10串牛肉串,那么沖突就產(chǎn)生了,老板到底聽誰的呢?解決方案就是我們?nèi)齻€(gè)人中的老板決定好要多少串,拋棄已存在的選擇,告訴攤販就可以了。
Git的撤銷與回退處理
撤銷與回退是非常正常的事情,比如我們?cè)谖⑿虐l(fā)錯(cuò)了消息,需要撤回啊、上線的某個(gè)版本有故障需要回退啊,再正常不過了。所以Git也提供這樣的機(jī)制,支持將修改后的文件撤銷回上一個(gè)版本、撤銷多余的提交等。
因?yàn)間it中的代碼可以存儲(chǔ)在各個(gè)區(qū)域,比如工作區(qū)、暫存區(qū)、本地倉庫、遠(yuǎn)程倉庫,所以每個(gè)地方git都提供了對(duì)應(yīng)的代碼回退策略。在工作區(qū)的代碼,也就是本地目錄的代碼,使用gitcheckout —就可以舍棄所有修改,使用gitcheckout — 666.txt就可以只舍棄666.txt這個(gè)文件。在暫存區(qū)的代碼,也就是只使用了gitadd命令進(jìn)行提交,使用gitreset HEAD可以丟棄所有代碼,使用gitreset HEAD666.txt就可以只舍棄666.txt這個(gè)文件。在本地倉庫的代碼因?yàn)橐呀?jīng)提交到倉庫里了,倉庫里存儲(chǔ)的就是代碼變更記錄,只能回退到某一次的修改了,使用gitlog可以獲取所有的提交并找到自己想要回退的commitID,使用gitreset -hard <commitID>可以回退到你想要的某個(gè)版本,使用gitreset —hardHEAD^回退到最新的一次提交。當(dāng)你的代碼提交到遠(yuǎn)程倉庫后,和在本地倉庫一樣的思路只能回退某個(gè)版本了,使用gitlog可查看所有的提交記錄,使用gitreset —hard <commitID>或使用gitrevert <commitID>回退到某次提交,最后使用gitpush origin HEAD —force強(qiáng)制提交。
長(zhǎng)江后浪推前浪,一浪更比一浪強(qiáng),掌握了扎實(shí)的git知識(shí)后,便可以將git工具使用游刃有余,更高效的coding,來吧,乘風(fēng)破浪的程序后浪們,talkis cheap ,show me the code~~