1. 程式人生 > >Git工程開發實踐(一)——Git基礎

Git工程開發實踐(一)——Git基礎

其中 it管理 操作系統 linux發行版 ict src conflict 例如 行合並

Git工程開發實踐(一)——Git基礎

一、版本控制系統

1、版本控制系統簡介

版本控制系統(VCS,Version Control Systems)是一種記錄一個或若幹文件內容變化,以便將來查閱特定版本修訂情況的系統。
版本控制系統分為:
A、本地版本控制系統(LVCS,Local Version Control Systems)
B、集中式版本控制系統(CVCS,Centralized Version Control Systems)
C、分布式版本控制系統(DVCS,Distributed Version Control System)

2、本地版本控制系統

本地版本控制系統大多都是采用某種簡單的數據庫來記錄文件的歷次更新差異。最流行的本地版本控制系統為RCS,其工作原理是在硬盤上保存補丁集(補丁是指文件修訂前後的變化),通過應用所有的補丁,可以重新計算出各個版本的文件內容。

技術分享圖片

3、集中式版本控制系統

集中式版本控制系統(CVCS,Centralized Version Control Systems )都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的開發人員都通過客戶端連到服務器,取出最新的文件或者提交更新。集中式版本控制系統有CVS、Subversion、Perforce 等。
技術分享圖片
集中式版本控制系統的優點:相比本地版本控制系統,每個人都可以在一定程度上看到項目中的其他人正在做些什麽。管理員可以輕松掌控每個開發者的權限,並且管理一個CVCS遠比在各個客戶端上維護本地數據庫簡單。
集中式版本控制系統的缺點:中央服務器的單點故障。如果中央服務器宕機,開發人員無法提交更新,無法協同工作。如果中央服務器的數據庫所在磁盤發生損壞並且沒有備份,將導致數據丟失。

4、分布式版本控制系統

分布式版本控制系統(DVCS,Distributed Version Control System )中,客戶端並不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來,因此,任何一處協同工作用的服務器發生故障,都可以用任何一個鏡像出來的本地倉庫恢復。分布式版本控制系統的每一次的克隆操作都是一次對代碼倉庫的完整備份。
常見的分布式版本控制系統有Git、Mercurial、Darcs、Bazaar等。
技術分享圖片
分布式版本控制系統的特點是分布式,每一個節點都擁有倉庫的完整鏡像,每個節點都可以作為服務器,也可以作為客戶端。為了團隊協同開發進行分支合並,通常會將一個節點設置成偽中央服務器

分布式版本控制系統的優點:
A、提交分支不需要聯網,客戶端本地保存著所有歷史記錄。
B、不依賴服務器的穩定性,風險分散。
分布式版本控制系統的缺點:
A、同步多人的修改稍繁。
B、缺少權限管理系統。
分布式版本控制系統的適用場景:
A、開源軟件的開發
B、同步需求不頻繁或者異地的多人協作

二、Git基礎

1、Git簡史

Linux內核開源項目有廣泛的參與者,但在1991-2002年間,世界各地的Linux內核開發者把源代碼文件通過diff的方式發給Linus,然後由Linus本人通過手工方式合並代碼,因此絕大多數的 Linux 內核維護工作都花在了提交補丁和保存歸檔的繁瑣事務上。雖然Linux內核社區有很多人提議使用集中式版本控制系統對Linux內核項目進行管理,但Linus堅持拒絕使用必須聯網(龜速)才能使用的集中式版本控制系統以及付費的商業版本控制系統。到2002年,BitMover授權Linux內核社區免費使用商業分布式版本控制系統BitKeeper來管理和維護代碼。
2005年,BitMover公司發現活躍於Linux內核社區的Andrew(Samba開發者)試圖破解BitKeeper的協議,於是收回了Linux內核社區使用BitKeeper的免費授權。 但Linux項目千萬行級別的代碼管理不可能再回到石器時代的手動合並,於是Linus基於使用BitKeeper的經驗教訓與Linux項目團隊的需求,使用了兩周時間開發出了Git初始版本,一個月後Git已經用於Linux內核項目源碼的管理。 目前Git由Linux社區的其它開發人員在持續開發。
大部分版本控制系統,如CVS、Subversion、Perforce、Bazaar等以文件變更列表的方式存儲信息。通常保存的信息是一組基本文件和每個文件隨時間逐步累積的差異。
技術分享圖片
Git把數據看作是對小型文件系統的一組快照。每次提交更新或在Git中保存項目狀態時,主要對當時的全部文件制作一個快照並保存快照的索引。如果文件沒有修改,Git不再重新存儲該文件,而是只保留一個鏈接指向原來存儲的文件。
技術分享圖片

2、Git安裝

Linux發行版:
Fedora:sudo yum install git
Debian:sudo apt-get install git
Windows:
https://git-scm.com/download/win
Git for Windows(msysGit)
GitHub for Windows
Mac OS:
OSX Git:http://git-scm.com/download/mac

3、Git配置

Git使用git config工具來設置控制Git外觀和行為的配置變量。
git config --system
在/etc/gitconfig文件讀寫配置變量,包含系統上每一個用戶及倉庫的通用配置,對當前操作系統所有用戶、倉庫有效
git config --global
在~/.gitconfig 或 ~/.config/git/config文件讀寫配置變量,對當前用戶有效
git config --local
在倉庫的.git/config文件讀寫配置變量,針對當前倉庫有效。
低級別的Git配置信息會覆蓋上一級別的配置信息,所以當前倉庫的配置信息(.git/config) 會覆蓋 /etc/gitconfig 中的配置信息。
通常,安裝完Git後需要設置用戶信息,如用戶名稱與郵件地址。因為每一個Git提交操作都會使用Git用戶信息,並且寫入到每一次提交中,不可更改。

git config --global user.name "username"
git config --global user.email "[email protected]"
Git配置信息查看:git config --list
Git某項配置信息查看:git config <key>
刪除某項配置信息:git config --global unset <key>

4、Git常用術語

分支(branch):在一個時間點,復制一份處於版本控制之下的文件,可以獨立的互不幹擾的對拷貝進行各自開發。
檢出(checkout):在本地創建一份倉庫的工作拷貝。
提交(commit):將本地的修改寫回到倉庫或合並到倉庫。
沖突(conflict):當多個開發者同時提交對同一個文件的修改,而且版本控制系統不能對其進行合並,就會引發沖突,需要手動處理。
合並(merge):把所有對文件的修改統一到文件裏。
倉庫(repository):當前的和歷史的處於版本控制下的文件所在的地方。

5、Git工作區

Git本地有三個工作區域:工作目錄(Work Directory)、暫存區(Stage/Index)、本地倉庫(Repository)。
工作目錄:工作目錄/工作空間,存放項目代碼的目錄
暫存區:暫存區,用於臨時存放改動,本質是一個文件,保存即將提交到文件列表信息
本地倉庫:安全存放提交的所有版本的數據,其中HEAD指向最新放入倉庫的版本
遠程倉庫(Remote Repository):托管代碼的服務器
技術分享圖片
Directory:Git管理的工程目錄,包含工作目錄和Git管理空間。
Work Directory:工作目錄,存放通過Git進行版本控制的目錄和文件,是開發者工作的目錄。
.git:存放Git管理信息的目錄,初始化倉庫時自動創建。
Index/Stage:暫存區,即待提交更新區,本質是一個文件(.git/index),保存有下次將提交的文件列表信息。
Repository:本地倉庫,存放在本地的版本倉庫。
HEAD:HEAD指針,用於指向當前分支的一個提交。
Stash:儲藏,是一個工作狀態保存棧,用於保存/恢復工作目錄的臨時狀態。

6、Git工作流程

Git提交的基本工作流程如下:
A、在工作目錄中添加、修改、刪除文件。
B、將工作目錄中需要進行版本管理的文件添加到暫存區。
C、將暫存區的文件提交到本地倉庫。
技術分享圖片

7、.gitignore文件過濾

工程開發中,在進行Git提交時,並不是所有的文件都需要提交,比如一些自動生成的文件,可以配置.gitignore來忽略一些不需要提交的文件。
Git對於.gitignore 配置文件是按行從上到下進行規則匹配的,如果前面的規則匹配的範圍更大,則後面的規則將不會生效。
不同工程應用開發的.gitignore模板集合如下:
https://github.com/github/gitignore
.gitignore文件語法規範如下:

    A、空行或是以#開頭的行即註釋行將被忽略;
    B、可以在前面添加正斜杠/來避免遞歸;可以在後面添加正斜杠/來忽略文件夾,例如build/即忽略    build文件夾
    C、可以使用!來否定忽略;
    D、*用來匹配零個或多個字符;
    E、[]用來匹配括號內的任一字符,如[abc],也可以在括號內加連接符,如[0-9]匹配0至9的數;
    F、?用來匹配單個字符;

.gitignore示例如下:

# 忽略 .a 文件
*.a
# 但否定忽略 lib.a, 盡管已經在前面忽略了 .a 文件
!lib.a
# 僅在當前目錄下忽略 TODO 文件, 但不包括子目錄下的 subdir/TODO
/TODO
# 忽略 build/ 文件夾下的所有文件
build/
# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有的 .pdf 文件 在 doc/ directory 下的
doc/**/*.pdf

Git工程開發實踐(一)——Git基礎