1、引入
在開發一個軟體專案時,本地只有幾十行程式碼或幾百行程式碼時還可以維護,但當程式碼達到一定的數量後或兩三個人共同開發一個專案時,就很容易會出現程式碼混亂、衝突、排錯難等問題。一旦開發完工以後發現整個專案執行不了,提交的程式碼也無法確認到責任人,導致維護專案時需要花費數倍的時間。為解決上述問題,版本控制系統應運而生。
版本控制是指對軟體開發過程中各種程式程式碼、配置檔案及說明文件等檔案變更的管 理,是軟體配置管理的核心思想之一。
2、版本控制系統
2.1、本地版本控制
本地版本控制系統許多人習慣用複製整個專案目錄的方式來儲存不同的版本,或許還會改名加上備份時間以示區別。這麼做唯一的 好處就是簡單,但是特別容易犯錯。有時候會混淆所在的工作目錄,一不小心會寫錯檔案或者覆蓋意想外的檔案,無法識別檔案中的修改。
2.2、集中化的版本控制系統
如何讓處於不同系統上的開發者協同工作?於是,集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS)應運而生。這類系統,諸如 CVS、Subversion(SVN) 以及Perforce 等,都有一個單一的集中管理的伺服器,儲存所有檔案的修訂版本,而協同工作的人們都通過客戶端連到這臺伺服器,取出最新的檔案或者提交更新。多年以來,這已成為版本控制系統的標準做法。
2.3、分散式版本控制系統
在這類系統中,像Git、Mercurial、Bazaar 以及 Darcs 等,客戶端並不只提取最新版本的檔案快照,而是把程式碼倉庫完整地映象(克隆)下來。這麼一來,任何一處協同工作用的伺服器發生故障,事後都可以用任何一個映象出來的本地倉庫恢復。因為每一次的克隆操作,實際上都是一次對程式碼倉庫的完整備份。
3、Git介紹
官網:https://git-scm.com 官方中文手冊: https://git-scm.com/book/zh/v2
git是一個分散式版本控制軟體,最初由林納斯·託瓦茲(Linus Torvalds)創作,於2005年以GPL釋出。最初目的是為更好地管理Linux核心開發而設計。
3.1、Git發展史
自2002年開始,林納斯·託瓦茲決定使用BitKeeper作為Linux核心主要的版本控制系統用以維護程式碼。因為BitKeeper為專有軟體,這個決定在社群中長期遭受質疑。在Linux社群中,特別是理查德·斯托曼與自由軟體基金會的成員,主張應該使用開放原始碼的軟體來作為Linux核心的版本控制系統。林納斯·託瓦茲曾考慮過採用現成軟體作為版本控制系統(例如Monotone),但這些軟體都存在一些問題,特別是效能不佳。現成的方案,如CVS的架構,受到林納斯·託瓦茲的批評。
2005年,安德魯·垂鳩寫了一個簡單程式,可以連線BitKeeper的儲存庫,BitKeeper著作權擁有者拉里·麥沃伊認為安德魯·垂鳩對BitKeeper內部使用的協議進行逆向工程,決定收回無償使用BitKeeper的授權。Linux核心開發團隊與BitMover公司進行蹉商,但無法解決他們之間的歧見。林納斯·託瓦茲決定自行開發版本控制系統替代BitKeeper,以十天的時間,編寫出第一個git版本。
Git 是一個開源的分散式版本控制系統,用以有效、高速的處理從很小到非常大的專案版本管理。一個原始 Git 版本倉庫,可以讓其他主機克隆這個原始版本倉庫,從而使得一個Git 版本倉庫可以同時分佈到不同的主機上,並且每臺主機的版本庫都是一樣的,並沒有主次之分,極大的保證了資料的安全性,並使得使用者能夠自主選擇 Git 伺服器推送檔案了,其實部署一個 Git 伺服器是一件非常簡單的事情。
如上所述,作為一個分散式的版本控制系統,在 Git 中並不存在主庫這樣的概念。每一 份複製出的庫都可以獨立使用,任何兩個庫之間的不一致之處都可以進行合併。
GitHub 是一個面向開源及私有軟體專案的託管平臺,因為只支援 Git 作為唯一的版本庫格式進行託管,故名 GitHub。GitHub 可以提供給使用者空間建立 Git 倉儲,儲存使用者的一些資料文件或者程式碼等。
GitHub 作為開原始碼庫以及版本控制系統,目前擁有 140 多萬開發者使用者。隨著越多的應用程式轉移到了雲上,GitHub 已經成為了管理軟體開發以及發現已有程式碼的首選方法。
GitHub 可以託管各種 Git 庫,並提供一個 Web 介面,但與其它像 SourceForge 或 Google Code 這樣的服務不同,GitHub 的獨特賣點在於從另外一個專案進行分支的簡易性。為一個專案貢獻程式碼非常簡單:首先點選專案站點的“fork”的按鈕,然後將程式碼檢出並將修改加入到剛才分出的程式碼庫中,最後通過內建的“pull request”機制向專案負責人申請程式碼合併。
Gitlab 是一個基於 Git 的專案管理軟體,用於倉庫管理系統的開源專案。使用 Git 作為程式碼管理工具,並在此基礎上搭建起來 Web 服務。
Git、Gitlab、Github 都是基於 Git 的,可以說是 Git 的衍生品。
3.2、Git功能特性
- 克隆資料庫版本:從伺服器上克隆資料庫(包括程式碼和版本資訊)到本機上;
- 提交程式碼:在本機上自己建立的分支上提交程式碼;
- 合併分支:在本機上合併分支;
- 拉取合併分支:新建一個分支,把伺服器上最新版的程式碼 Fetch 下來,然後跟自己的主分支合併;
- 程式碼衝突解決:一般開發者之間解決衝突的方法,開發者之間可以使用 pull 命令解決衝突,解決完衝突之後再向主開發者提交補丁。
3.3、案例環境
伺服器 | IP地址 | 主機名 | 角色 |
centos7.x | 192.168.100.111 | gitserver | git伺服器 |
centos7.x | 192.168.100.112 | git | git客戶端 |
3.4、部署Git
第一步:
初始化環境
[root@gitclient ~]# systemctl stop firewalld [root@gitclient ~]# iptables -F [root@gitclient ~]# setenforce 0
第二步:(臨時使用)
Centos自帶git
[root@gitclient ~]# rpm -q git git-1.8.3.1-23.el7_8.x86_64
安裝方法
[root@gitclient ~]# yum -y install git
第三步:(推薦使用)
Git下載地址: https://github.com/git/git/releases
安裝依賴
[root@gitclient ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
編譯安裝
[root@gitclient ~]# wget https://github.com/git/git/archive/v2.22.0.tar.gz [root@gitclient ~]# tar xf git-2.22.0.tar.gz -C /usr/src/ [root@gitclient ~]# cd /usr/src/git-2.22.0/ [root@git git-2.22.0]# make configure [root@git git-2.22.0]# ./configure --prefix=/usr/local/git && make && make install [root@git git-2.22.0]# ln -sf /usr/local/git/bin/git /usr/bin/ [root@git git-2.22.0]# git --version # 這裡就安裝完成了 git version 2.22.0
第四步:
[root@gitclient ~]# git config --global user.name "crushlinux" #配置git使用使用者 [root@gitclient ~]# git config --global user.email "crushlinux@163.com" #配置git使用郵箱 [root@gitclient ~]# git config --global color.ui true #語法高亮 [root@gitclient ~]# git config --list #檢視全域性配置 user.name=crushlinux user.email=crushlinux@163.com color.ui=true
4、初始化及獲取 Git 倉庫
Git伺服器操作
[root@gitserver ~]# mkdir git_data.git [root@gitserver ~]# cd git_data.git/ [root@gitserver git_data.git]# git --bare init 初始化空的 Git 版本庫於 /root/git_data.git/
Git客戶端操作
[root@gitclient ~]# ssh-keygen [root@gitclient ~]# ssh-copy-id 192.168.200.111 [root@gitclient ~]# git clone root@192.168.200.111:/root/git_data.git 正克隆到 'git_data'... warning: 您似乎克隆了一個空倉庫。 [root@gitclient ~]# cd git_data/ [root@git git_data]# git status 位於分支 master 尚無提交 無檔案要提交(建立/拷貝檔案並使用 "git add" 建立跟蹤)
4.1、Git命令常規操作
命令 |
命令說明 |
add |
新增檔案內容至暫存區(索引) |
bisect |
通過二分查詢定位引入 bug 的變更 |
branch |
列出、建立或刪除分支 |
checkout |
檢出一個分支或路徑到工作區 |
clone |
克隆一個版本庫到一個新目錄 |
commit |
記錄變更到版本庫(本地) |
diff |
顯示提交之間、提交和工作區之間等的差異 |
fetch |
從另外一個版本庫下載物件和引用 |
grep |
輸出和模式匹配的行 |
init |
建立一個空的 |
Git |
版本庫或重新初始化一個已存在的版本庫 |
log |
顯示提交日誌 |
merge |
合併兩個或更多開發歷史 |
mv |
移動或重新命名一個檔案、目錄或符號連結 |
pull |
獲取併合並另外的版本庫或一個本地分支 |
push |
更新遠端引用和相關的物件 |
rebase |
本地提交轉移至更新後的上游分支中 |
reset |
重置當前HEAD到指定狀態 |
rm |
從工作區和索引中刪除檔案 |
show |
顯示各種型別的物件 |
status |
顯示工作區狀態 |
tag |
建立、列出、刪除或校驗一個GPG簽名的 tag 物件 |
4.2、Git工作原理圖示