首頁 > 軟體

Git工具詳解以及與GitHub的配合使用

2020-06-16 17:14:08

Git和GitHub

概念

git --- 版本控制工具(命令)

工具介紹官方網站:http://git-scm.com

工具下載地址:http://git-scm.com/download/

git是一個開源的分散式版本控制系統,用以有效、高速的處理從很小到非常大的專案版本管理。git是個工具,在linux裡面也就類似gcc這樣的工具一樣,是一個shell命令git是Linus Torvalds為了幫助管理Linux核心開發而開發的一個開放原始碼的版本控制軟體。Torvalds開始著手開發git是為了作為一種過渡方案來替代BitKeeper,後者之前一直是Linux核心開發人員在全球使用的主要原始碼工具。開放原始碼社群中的有些人覺得BitKeeper的許可證並不適合開放原始碼社群的工作,因此 Torvalds決定著手研究許可證更為靈活的版本控制系統。儘管最初git的開發是為了輔助Linux核心開發的過程,但是我們已經發現在很多其他自由軟體專案中也使用了git。例如:很多Freedesktop的專案也遷移到了git上。

Github --- 一個平台(網站)

Github官方網站:https://github.com/

提供給使用者建立git倉儲空間儲存(託管)使用者的一些資料文件或者程式碼等。

Github目前擁有140多萬開發者使用者。隨著越來越多的應用程式轉移到了雲上,Github已經成為了管理軟體開發以及發現已有程式碼的首選方法。GitHub可以託管各種git庫,並提供一個web介面,但與其它像SourceForge或Google Code這樣的平台不同,GitHub的獨特賣點在於從另外一個專案進行分支的簡易性。為一個專案貢獻程式碼非常簡單:首先點選專案站點的“fork”的按鈕,然後將程式碼檢出並將修改加入到剛才分出的程式碼庫中,最後通過內建的“pull request”機制向專案負責人申請程式碼合併。已經有人將GitHub稱為程式碼玩家的MySpace。

Github公有倉庫免費,私有倉庫要收費的!

git和Github的關係

指定了remote連結和使用者資訊(git靠使用者名稱+郵箱識別使用者)之後,git可以幫你將提交過到你本地分支的程式碼push到遠端的git倉庫(任意提供了git託管服務的伺服器上都可以,包括你自己建一個伺服器 或者 GitHub/BitBucket等網站提供的伺服器)或者將遠端倉庫的程式碼 fetch 到本地。

Github只是一個提供儲存空間的伺服器,用來儲存git倉庫當然現在Github已經由一個存放git倉庫的網站空間發展為了一個開源社群(不只具有儲存git倉庫的功能了),你可以參與別人的開源專案,也可以讓別人參與你的開源專案。

Github類似產品

有很多Github類似的平台,用於提供git倉庫的儲存。

BitBucket

公有、私有倉庫都免費。

git和CVS、SVN的區別

git是分散式版本控制系統,程式碼提交是在原生的(如此速度就快),當然生成修補程式(patch)然後push到遠端伺服器上是需要聯網的

CVS、SVN是集中式版本控制系統,程式碼提交都是提交到遠端伺服器上,是需要一直聯網的(如此速度就慢)(這裡的一直聯網不是說你寫程式碼的時候要聯網,而是說你提交程式碼的時候必須聯網;但是git不同,git提交程式碼是原生的不需要聯網,生成patch後push patch才需要聯網,相當於svn的遠端的集中伺服器對於git來說,這個集中的遠端伺服器就在本地)。這個地方比較難理解。

CVS、SVN這樣的集中式版本控制系統,它的完整程式碼倉庫(程式碼倉庫不僅僅只包含了程式碼,還包含各個歷史版本的資訊等)在中心伺服器上,一旦這個中心伺服器掛了,也就是完整的程式碼倉庫掛了,雖然你本地可能之前有從中心伺服器上取得過程式碼,但是那些歷史版本資訊都沒有了,而且你也無法再提交程式碼。

git不同,git沒有中心伺服器的概念,每一個git用戶端(git節點)都含有一個完整的程式碼倉庫(前提是你之前從遠端git倉庫fetch過程式碼),所以那些歷史版本資訊都在你本機上,假如哪一個git節點掛掉了,隨意從其他git節點clone一個程式碼倉庫過來就ok了, 那些原來的程式碼、版本資訊之類的都還是完整的(當然如果你在這個掛掉的git節點上新增的程式碼是沒有掉了的)。

綜上,git的每一個節點(第一次從遠端git倉庫取得程式碼後,該git節點就是一個完整的程式碼倉庫)相當於SVN的中心伺服器,都包含完整的程式碼倉庫

git的工作原理

架構圖

功能特性

git的功能特性:
一般開發者的角度來看,git有以下功能:
1、從遠端伺服器上克隆clone完整的git倉庫(包括程式碼和版本資訊)到自己的機器(單機)上。
2、在自己的機器上根據不同的開發目的,建立分支,修改程式碼。
3、在單機上自己建立的分支上提交程式碼。
4、在單機上合併分支。
5、把遠端伺服器上最新版的程式碼fetch下來,然後跟自己的主分支合併。
6、生成修補程式(patch),把修補程式傳送給主開發者。
7、看主開發者的反饋,如果主開發者發現兩個一般開發者之間有衝突(他們之間可以合作解決的衝突),就會要求他們先解決衝突,然後再由其中一個人提交。如果主開發者可以自己解決,或者沒有衝突,就通過。
8、一般開發者之間解決衝突的方法,開發者之間可以使用pull命令解決衝突,解決完衝突之後再向主開發者提交修補程式。

主開發者的角度看,git有以下功能:
1、檢視郵件或者通過其它方式檢視一般開發者的提交狀態。
2、打上修補程式,解決衝突(可以自己解決,也可以要求開發者之間解決以後再重新提交,如果是開源專案,還要決定哪些修補程式有用,哪些不用)。
3、向遠端伺服器(公共的)提交結果,然後通知所有開發人員。


優點:
1、適合分散式開發,強調個體。
2、遠端伺服器(公共的)壓力和資料量都不會太大。
3、速度快、靈活。
4、任意兩個開發者之間可以很容易的解決衝突。
5、離線工作。(當然提交遠端伺服器或者從遠端伺服器fetch程式碼是要聯網的)。

git中的一些概念和原理

工作區

Working Directory

電腦上能看到的目錄即工作目錄,比如:/e/git_repo/

版本庫

Repository

工作區有一個隱藏目錄.git,這個不算工作區,而是git的版本庫。
git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。構造參見上面的結構圖。

暫存區

Stage

暫存區就是版本庫中的一個區域,具體參見上面的結構圖。

工作區、版本庫、暫存區之間的關係

git工作的流程就是:
第1步,使用git add把檔案從工作區新增到版本庫中的暫存區,git add命令可以多次用;
第2步,使用git commit提交程式碼,就是把暫存區的所有內容提交到當前分支。
綜上,需要提交的檔案修改通通放到暫存區(可能有多次的git add),然後,一次性提交暫存區的所有修改到當前分支(git commit)。

分支

分支(branch)有什麼用呢?假設你準備開發一個新功能,但是需要兩週才能完成,第一周你寫了50%的程式碼,如果立刻提交,由於程式碼還沒寫完,不完整的程式碼庫會導致別人不能幹活了。如果等程式碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。
現在有了分支,就不用怕了。你建立了一個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工作。

分支內部原理

1、如下圖所示,版本的每一次提交(commit),git都將它們根據提交的時間點串聯成一條線。剛開始是只有一條時間線,即master分支,HEAD指向的是當前分支的當前版本。

 

2、當建立了新分支,比如dev分支(通過命令git branch dev完成),git新建一個指標dev,dev=master,dev指向master指向的版本,然後切換到dev分支(通過命令git checkout dev完成),把HEAD指標指向dev,如下圖。

3、在dev分支上編碼開發時,都是在dev上進行指標移動,比如在dev分支上commit一次,dev指標往前移動一步,但是master指標沒有變,如下:

4、當我們完成了dev分支上的工作,要進行分支合併,把dev分支的內容合併到master分支上(通過首先切換到master分支,git branch master,然後合併git merge dev命令完成)。其內部的原理,其實就是先把HEAD指標指向master,再把master指標指向現在的dev指標指向的內容。如下圖。

5、當合併分支的時候出現衝突(confict),比如在dev分支上commit了一個檔案file1,同時在master分支上也提交了該檔案file1,修改的地方不同(比如都修改了同一個語句),那麼合併的時候就有可能出現衝突,如下圖所示。

這時候執行git merge dev命令,git會預設執行合併,但是要手動解決下衝突,然後在master上git add並且git commit,現在git分支的結構如下圖。

可以使用如下命令檢視分支合併情況。

  1. git log --graph --pretty=oneline --abbrev-commit 

6、合併完成後,就可以刪除掉dev分支(通過git branch -d dev命令完成???。

如此,就是分支開發的原理。其好處也是顯而易見的。

分支策略

如何合適地使用分支?

在實際開發中,我們應該按照幾個基本原則進行分支管理:
1、master分支應該是非常穩定的,也就是僅用來發布新版本,平時不要在master分支上編碼開發。master分支應該與遠端倉庫保持同步
2、平常編碼開發都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合併到master上,在master分支發布1.0版本;dev分支也應該與遠端保持同步;(git push/git pull也要解決衝突)
3、你和團隊成員每個人都在原生的dev分支上幹活,每個人都有自己的分支,時不時地往遠端dev分支上push/pull就可以了。(push/pull的時候是要解決衝突的.

上面這個圖是大致示意圖,其實上面這個圖是省略了git push/git pull操作的,比如bob在本地dev分支上,新建了一個feature1分支幹完活,在原生的dev分支上合併了feature1分支,然後要把dev分支push到公共伺服器上,這樣michael才能pull下來bob完成的內容。更詳細一點的圖如下:

GitHub 教學系列文章: 

通過GitHub建立個人技術部落格圖文詳解  http://www.linuxidc.com/Linux/2015-02/114121.htm

GitHub 使用教學圖文詳解  http://www.linuxidc.com/Linux/2014-09/106230.htm 

使用 GitHub / GitLab 的 Webhooks 進行網站自動化部署  http://www.linuxidc.com/Linux/2016-06/131993.htm

多個GitHub帳號的SSH key切換 http://www.linuxidc.com/Linux/2016-05/131080.htm

如何在同一台電腦上使用兩個GitHub賬戶 http://www.linuxidc.com/Linux/2016-05/131079.htm

利用GitHub搭建個人Maven倉庫  http://www.linuxidc.com/Linux/2016-04/130197.htm

一分鐘認識GitHub http://www.linuxidc.com/Linux/2015-11/125089.htm

分享實用的GitHub 使用教學 http://www.linuxidc.com/Linux/2014-04/100556.htm 

GitHub使用操作指南  http://www.linuxidc.com/Linux/2016-10/135782.htm

GitHub使用方法入門基礎  http://www.linuxidc.com/Linux/2017-05/144084.htm


IT145.com E-mail:sddin#qq.com