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

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)git

二、本地版本控制系統

本地版本控制系統大多都是採用某種簡單的數據庫來記錄文件的歷次更新差別。最流行的本地版本控制系統爲RCS,其工做原理是在硬盤上保存補丁集(補丁是指文件修訂先後的變化),經過應用全部的補丁,能夠從新計算出各個版本的文件內容。
Git工程開發實踐(一)——Git基礎github

三、集中式版本控制系統

集中式版本控制系統(CVCS,Centralized Version Control Systems )都有一個單一的集中管理的服務器,保存全部文件的修訂版本,而協同工做的開發人員都經過客戶端連到服務器,取出最新的文件或者提交更新。集中式版本控制系統有CVS、Subversion、Perforce 等。
Git工程開發實踐(一)——Git基礎
集中式版本控制系統的優勢:相比本地版本控制系統,每一個人均可以在必定程度上看到項目中的其餘人正在作些什麼。管理員能夠輕鬆掌控每一個開發者的權限,而且管理一個CVCS遠比在各個客戶端上維護本地數據庫簡單。
集中式版本控制系統的缺點:中央服務器的單點故障。若是中央服務器宕機,開發人員沒法提交更新,沒法協同工做。若是中央服務器的數據庫所在磁盤發生損壞而且沒有備份,將致使數據丟失。數據庫

四、分佈式版本控制系統

分佈式版本控制系統(DVCS,Distributed Version Control System )中,客戶端並不僅提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來,所以,任何一處協同工做用的服務器發生故障,均可以用任何一個鏡像出來的本地倉庫恢復。分佈式版本控制系統的每一次的克隆操做都是一次對代碼倉庫的完整備份。
常見的分佈式版本控制系統有Git、Mercurial、Darcs、Bazaar等。
Git工程開發實踐(一)——Git基礎
分佈式版本控制系統的特色是分佈式,每個節點都擁有倉庫的完整鏡像,每一個節點均可以做爲服務器,也能夠做爲客戶端。爲了團隊協同開發進行分支合併,一般會將一個節點設置成僞中央服務器
分佈式版本控制系統的優勢:
A、提交分支不須要聯網,客戶端本地保存着全部歷史記錄。
B、不依賴服務器的穩定性,風險分散。
分佈式版本控制系統的缺點:
A、同步多人的修改稍繁。
B、缺乏權限管理系統。
分佈式版本控制系統的適用場景:
A、開源軟件的開發
B、同步需求不頻繁或者異地的多人協做安全

2、Git基礎

一、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把數據看做是對小型文件系統的一組快照。每次提交更新或在Git中保存項目狀態時,主要對當時的所有文件製做一個快照並保存快照的索引。若是文件沒有修改,Git再也不從新存儲該文件,而是隻保留一個連接指向原來存儲的文件。
Git工程開發實踐(一)——Git基礎服務器

二、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分佈式

三、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用戶信息,而且寫入到每一次提交中,不可更改。ide

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

四、Git經常使用術語

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

五、Git工做區

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

六、Git工做流程

Git提交的基本工做流程以下:
A、在工做目錄中添加、修改、刪除文件。
B、將工做目錄中須要進行版本管理的文件添加到暫存區。
C、將暫存區的文件提交到本地倉庫。
Git工程開發實踐(一)——Git基礎操作系統

七、.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
相關文章
相關標籤/搜索