工程化專題之Git

前言

一個專業的程序員,怎麼能不掌握Git呢?版本控制領域,已經發展了一段時間,從古老的CVS,到SVN集中式管理,再到如今的Git。因爲Git的分佈式、everything is local、分支等諸多特性,讓愈來愈多的項目開始從SVN遷移到Git進行管理。本篇博客將介紹Git的一些重要概念、實際工做中Git的一些使用方式、背後涉及的一些原理思想等。git

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

Repository:倉庫,說白了,就是一個project,對於咱們Java程序員而言,好比就是存放Maven工程的地方。程序員

Star:我想你或多或少瀏覽過github上的開源項目,你能夠star它們,能夠理解爲收藏的意思。在github上,擁有不少star,那是很牛的事情。github

Fork:咱們常常據說開源貢獻,那麼到底怎麼去作呢?實際上,你能夠fork一個開源項目,好比fork Spring,那麼至關於你COPY了一份Spring到你的空間,就是一個獨立的屬於你的倉庫,若是你發現了什麼Bug,或者進行什麼改進,均可以在你的倉庫上進行。服務器

Pull Request:上面說fork,能夠進行開源貢獻,可是注意的是fork了倉庫後,你能夠在本身的倉庫上進行任何修改,可是若是你要把你的修改合併到開源項目倉庫中的話,那麼你就得發起一個Pull Request請求。一旦開源做者收到你的Pull Request並贊成以後,那麼你的代碼將會同步到開源項目之中!app

Watch:Watch一個Repository,就至關於社交的關注同樣,這個倉庫有什麼動態,你都會收到通知。分佈式

Issue:簡單理解,就是一個代碼上的問答、討論而已。ide

Git的三大區域:工做區、暫存區、本地倉庫

工程化專題之Git

工程化專題之Git

SVN中可沒有這麼多概念,在本地編輯後,要麼提交到SVN服務器,要麼不提交。爲啥Git有這麼多概念呢?測試

工做區(working area),這個好理解,就是咱們寫代碼工做的地方。但是,想想,咱們在工做區的改動,有些想提交版本,有些還不想提交,基於此,Git引入暫存區(index/staging area)的概念,就是哪些要提交到版本庫的,那麼先進入暫存區。暫存區的內容能夠提交至本地版本庫(local repository),這就是所謂的everything is local。本地版本庫,能夠和遠程倉庫(remote repository)交互,實現多人協做。fetch

Git的分支思想

工程化專題之Git

工程化專題之Git

工程化專題之Git

在實際開發中,咱們的項目(倉庫),通常有一個master分支,這個master分支的代碼就是線上運行的代碼。咱們平時開發的話,那麼先從master拉取最新的代碼,並以此爲基礎新建一個本地開發分支,好比mybranch,而後,咱們在mybranch上進行開發,而後把修改提交到mybranch的本地版本庫。而這個修改,在Git中叫作commit對象。命令行

既然,能夠有mybranch分支,也能夠有不少的其它分支,所以存在分支間的切換、合併。HEAD能夠用來表示當前所處的分支。如上圖所示,其實把mybranch的改動合併到master分支上,就至關於master的指針指向commit-B便可。這種合併,在Git中就是所謂的「快速合併」。(從這裏你也能感覺到,其實分支的合併、切換、銷燬,是很是快速的,由於指針的緣故)

Git中的分支,其實本質上就是一個指向commit對象的指針,並且是可變的,每次提交,指針會自動向前移動。

Git在實際中的使用方式

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

Git的必要設置

工程化專題之Git

爲何要設置用戶名、郵箱呢?

顯然,你要提交代碼,確定要告訴GIT,你是哪一個,這是一個標示。至於郵箱,是由於不少時候,GIT若是要進行通知的話,能夠給你發郵件。並且對於GIT倉庫而言,是能夠根據用戶來設置權限的。

git init && git clone

工程化專題之Git

不少時候,咱們開發項目,只須要先利用git clone把現有的倉庫代碼克隆複製到本地便可。git init通常是在本地建立一個受Git管理的項目,而後推送到Git服務器,至關因而建立倉庫。

git命令運轉

工程化專題之Git

git status

工程化專題之Git

首先,來講,咱們當前處理哪一個分支上,這個分支的文件是什麼狀態?(這將是咱們操做的基礎信息)

git branch

git status/git status -s

接下來,明確咱們要在哪一個分支上開發,從master建立分支開發?

git checkout -b newBranch (建立並切換)

開發完畢後,咱們要切換到master上,想把newBranch合併進來:

注意checkout切換分支的最佳方式是保持工做區域的乾淨,什麼是乾淨呢?就是把變化的所有提交到newBranch本地版本庫,不然git會提示阻止checkout。

git checkout master

git merge newBranch

假設在newBranch分支上開發的中途,忽然線上有問題,咱們須要切換到master進行問題修復,而此時,咱們不想提交到newBranch本地版本庫,那麼如何完成切換呢?

採用stash機制,說白了,就是在工做區能夠先暫存狀態,既不提交到本地版本庫,又能夠切換到其餘分支上,待再次切換到newBranch後,能夠git apply進行工做區的狀態恢復。

若是合併出現衝突,怎麼辦?

根據提示,通常採用人工解決。注意解決衝突後,再利用git add標誌解決衝突便可。

注意,Git的本地性,在進行合併操做(不管是合併本地分支、仍是想要合併遠程分支)時,必定切記,須要先在本地完成merge,解決衝突後,在git push推送到遠程倉庫上。

若是Git合併無衝突,是否就是必定沒有問題?

Git很智能,它可以根據commit的樹形結構,智能的幫助咱們分析出最佳合併的途徑,可是合併無問題,並不能說明合併後的代碼必定是正確的,仍是要對合並後的代碼進行測試!

Git經常使用命令總結

git clone <版本庫的網址> 會在本地主機生成一個目錄,與遠程主機的版本庫同名

git remote -v 參看遠程主機的網址

git fetch <遠程主機名> <分支名> 將某個遠程主機的特定分支的更新取回

git branch -ar 查看全部遠程分支

git checkout-b newBrach origin/master 利用git fetch取回遠程主機的更新之後,能夠在它的基礎上,使用git checkout命令建立一個新的分支

git pull <遠程主機名> <遠程分支名>:<本地分支名> git fetch+git merge的合併版本,取回遠程主機某個分支的更新,再與本地的指定分支合併

git push <遠程主機名> <本地分支名>:<遠程分支名> 用於將本地分支的更新,推送到遠程主機

git add

git commit

git branch

git merge

git log

git diff

.....

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

相關文章
相關標籤/搜索