工程化專題之Git

前言

一個(gè)專業(yè)的程序員,怎么能不掌握Git呢?版本控制領(lǐng)域,已經(jīng)發(fā)展了一段時(shí)間,從古老的CVS,到SVN集中式管理,再到現(xiàn)在的Git。由于Git的分布式、everything is local、分支等諸多特性,讓越來(lái)越多的項(xiàng)目開(kāi)始從SVN遷移到Git進(jìn)行管理。本篇博客將介紹Git的一些重要概念、實(shí)際工作中Git的一些使用方式、背后涉及的一些原理思想等。如果你還對(duì)Maven感興趣,可以閱讀:

《工程化專題之Maven(上)》

《工程化專題之Maven(下)》


Github && Git 中的一些重要概念

Repository:倉(cāng)庫(kù),說(shuō)白了,就是一個(gè)project,對(duì)于我們Java程序員而言,比如就是存放Maven工程的地方。

Star:我想你或多或少瀏覽過(guò)github上的開(kāi)源項(xiàng)目,你可以star它們,可以理解為收藏的意思。在github上,擁有很多star,那是很牛的事情。

Fork:我們經(jīng)常聽(tīng)說(shuō)開(kāi)源貢獻(xiàn),那么到底怎么去做呢?實(shí)際上,你可以fork一個(gè)開(kāi)源項(xiàng)目,比如fork Spring,那么相當(dāng)于你COPY了一份Spring到你的空間,就是一個(gè)獨(dú)立的屬于你的倉(cāng)庫(kù),如果你發(fā)現(xiàn)了什么Bug,或者進(jìn)行什么改進(jìn),都可以在你的倉(cāng)庫(kù)上進(jìn)行。

Pull Request:上面說(shuō)fork,可以進(jìn)行開(kāi)源貢獻(xiàn),但是注意的是fork了倉(cāng)庫(kù)后,你可以在自己的倉(cāng)庫(kù)上進(jìn)行任何修改,但是如果你要把你的修改合并到開(kāi)源項(xiàng)目倉(cāng)庫(kù)中的話,那么你就得發(fā)起一個(gè)Pull Request請(qǐng)求。一旦開(kāi)源作者收到你的Pull Request并同意之后,那么你的代碼將會(huì)同步到開(kāi)源項(xiàng)目之中!

Watch:Watch一個(gè)Repository,就相當(dāng)于社交的關(guān)注一樣,這個(gè)倉(cāng)庫(kù)有什么動(dòng)態(tài),你都會(huì)收到通知。

Issue:簡(jiǎn)單理解,就是一個(gè)代碼上的問(wèn)答、討論而已。

Git的三大區(qū)域:工作區(qū)、暫存區(qū)、本地倉(cāng)庫(kù)

工作區(qū)/暫存區(qū)/本地版本庫(kù)


工作區(qū)/暫存區(qū)/本地版本庫(kù)

SVN中可沒(méi)有這么多概念,在本地編輯后,要么提交到SVN服務(wù)器,要么不提交。為啥Git有這么多概念呢?

工作區(qū)(working area),這個(gè)好理解,就是我們寫代碼工作的地方??墒?,想一想,我們?cè)诠ぷ鲄^(qū)的改動(dòng),有些想提交版本,有些還不想提交,基于此,Git引入暫存區(qū)(index/staging area)的概念,就是哪些要提交到版本庫(kù)的,那么先進(jìn)入暫存區(qū)。暫存區(qū)的內(nèi)容可以提交至本地版本庫(kù)(local repository),這就是所謂的everything is local。本地版本庫(kù),可以和遠(yuǎn)程倉(cāng)庫(kù)(remote repository)交互,實(shí)現(xiàn)多人協(xié)作。

Git的分支思想

git branch


commit對(duì)象


Fast-forward

在實(shí)際開(kāi)發(fā)中,我們的項(xiàng)目(倉(cāng)庫(kù)),一般有一個(gè)master分支,這個(gè)master分支的代碼就是線上運(yùn)行的代碼。我們平時(shí)開(kāi)發(fā)的話,那么先從master拉取最新的代碼,并以此為基礎(chǔ)新建一個(gè)本地開(kāi)發(fā)分支,比如mybranch,然后,我們?cè)趍ybranch上進(jìn)行開(kāi)發(fā),然后把修改提交到mybranch的本地版本庫(kù)。而這個(gè)修改,在Git中叫做commit對(duì)象。

既然,可以有mybranch分支,也可以有很多的其它分支,因此存在分支間的切換、合并。HEAD可以用來(lái)表示當(dāng)前所處的分支。如上圖所示,其實(shí)把mybranch的改動(dòng)合并到master分支上,就相當(dāng)于master的指針指向commit-B即可。這種合并,在Git中就是所謂的“快速合并”。(從這里你也能感受到,其實(shí)分支的合并、切換、銷毀,是非??焖俚?,因?yàn)橹羔樀木壒剩?/b>

Git中的分支,其實(shí)本質(zhì)上就是一個(gè)指向commit對(duì)象的指針,而且是可變的,每次提交,指針會(huì)自動(dòng)向前移動(dòng)。


Git在實(shí)際中的使用方式

Git有命令客戶端Git Bash,也有圖像客戶端,如TortoiseGit,不過(guò)掌握Git的最佳方式依然是命令行。

Git的必要設(shè)置

git config

為什么要設(shè)置用戶名、郵箱呢?

顯然,你要提交代碼,肯定要告訴GIT,你是哪個(gè),這是一個(gè)標(biāo)示。至于郵箱,是因?yàn)楹芏鄷r(shí)候,GIT如果要進(jìn)行通知的話,可以給你發(fā)郵件。而且對(duì)于GIT倉(cāng)庫(kù)而言,是可以根據(jù)用戶來(lái)設(shè)置權(quán)限的。

git init && git clone

git clone

很多時(shí)候,我們開(kāi)發(fā)項(xiàng)目,只需要先利用git clone把現(xiàn)有的倉(cāng)庫(kù)代碼克隆復(fù)制到本地即可。git init一般是在本地創(chuàng)建一個(gè)受Git管理的項(xiàng)目,然后推送到Git服務(wù)器,相當(dāng)于是創(chuàng)建倉(cāng)庫(kù)。

git命令運(yùn)轉(zhuǎn)

git命令運(yùn)轉(zhuǎn)流程

git status

git status

首先,來(lái)說(shuō),我們當(dāng)前處理哪個(gè)分支上,這個(gè)分支的文件是什么狀態(tài)?(這將是我們操作的基礎(chǔ)信息)

git branch

git status/git status -s

接下來(lái),明確我們要在哪個(gè)分支上開(kāi)發(fā),從master創(chuàng)建分支開(kāi)發(fā)?

git checkout -b newBranch (創(chuàng)建并切換)

開(kāi)發(fā)完畢后,我們要切換到master上,想把newBranch合并進(jìn)來(lái):

注意checkout切換分支的最佳方式是保持工作區(qū)域的干凈,什么是干凈呢?就是把變化的全部提交到newBranch本地版本庫(kù),否則git會(huì)提示阻止checkout。

git checkout master

git merge newBranch

假設(shè)在newBranch分支上開(kāi)發(fā)的中途,突然線上有問(wèn)題,我們需要切換到master進(jìn)行問(wèn)題修復(fù),而此時(shí),我們不想提交到newBranch本地版本庫(kù),那么如何完成切換呢?

采用stash機(jī)制,說(shuō)白了,就是在工作區(qū)可以先暫存狀態(tài),既不提交到本地版本庫(kù),又可以切換到其他分支上,待再次切換到newBranch后,可以git apply進(jìn)行工作區(qū)的狀態(tài)恢復(fù)。

如果合并出現(xiàn)沖突,怎么辦?

根據(jù)提示,一般采用人工解決。注意解決沖突后,再利用git add標(biāo)志解決沖突即可。

注意,Git的本地性,在進(jìn)行合并操作(不論是合并本地分支、還是想要合并遠(yuǎn)程分支)時(shí),一定切記,需要先在本地完成merge,解決沖突后,在git push推送到遠(yuǎn)程倉(cāng)庫(kù)上。?

如果Git合并沒(méi)有沖突,是否就是一定沒(méi)有問(wèn)題?

Git很智能,它能夠根據(jù)commit的樹形結(jié)構(gòu),智能的幫助我們分析出最佳合并的途徑,但是合并沒(méi)有問(wèn)題,并不能說(shuō)明合并后的代碼一定是正確的,還是要對(duì)合并后的代碼進(jìn)行測(cè)試!


Git常用命令總結(jié)

git clone <版本庫(kù)的網(wǎng)址>? 會(huì)在本地主機(jī)生成一個(gè)目錄,與遠(yuǎn)程主機(jī)的版本庫(kù)同名

git remote -v? ? 參看遠(yuǎn)程主機(jī)的網(wǎng)址

git fetch <遠(yuǎn)程主機(jī)名> <分支名>? ? 將某個(gè)遠(yuǎn)程主機(jī)的特定分支的更新取回

git branch -ar? 查看所有遠(yuǎn)程分支

git checkout-b newBrach origin/master? 利用git fetch取回遠(yuǎn)程主機(jī)的更新以后,可以在它的基礎(chǔ)上,使用git checkout命令創(chuàng)建一個(gè)新的分支

git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>? git fetch+git merge的合并版本,取回遠(yuǎn)程主機(jī)某個(gè)分支的更新,再與本地的指定分支合并

git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名> 用于將本地分支的更新,推送到遠(yuǎn)程主機(jī)

git add

git commit

git branch

git merge

git log

git diff

git branch -vv 查看本地分支跟蹤的遠(yuǎn)程分支信息

git branch --set-upstream-to=origin/xxx 本地分支和遠(yuǎn)程分支進(jìn)行關(guān)聯(lián)

刪除遠(yuǎn)程分支:git push origin --delete 遠(yuǎn)程分支名稱

刪除本地分支:git branch -d 本地分支名稱

強(qiáng)行刪除本地分支:git branch -D 本地分支名稱

.....


好了,Git的一些基本概念、思想、常用命令就介紹到這里了,相信我們只要掌握了Git的這些知識(shí),在實(shí)際Git使用中,就能有信心駕馭它!

GoodBye~

by zhangfengzhe 2017.10.15

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容