一、引入
在開發一個軟件項目時,本地只有幾十行代碼或幾百行代碼時還可以維護,但當代碼達到一定的數量后或兩三個人共同開發一個項目時,就很容易會出現代碼混亂、沖突、排錯難等問題。一旦開發完工以后發現整個項目運行不了,提交的代碼也無法確認到責任人,導致維護項目時需要花費數倍的時間。為解決上述問題,版本控制系統應運而生。
版本控制是指對軟件開發過程中各種程序代碼、配置文件及說明文檔等文件變更的管 理,是軟件配置管理的核心思想之一。
二、版本控制系統
2.1、本地版本控制
本地版本控制系統許多人習慣用復制整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區別。這么做唯一的 好處就是簡單,但是特別容易犯錯。有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件,無法識別文件中的修改。
2.2、集中化的版本控制系統
如何讓處於不同系統上的開發者協同工作?於是,集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS)應運而生。這類系統,諸如 CVS、Subversion(SVN) 以及Perforce 等,都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這台服務器,取出最新的文件或者提交更新。多年以來,這已成為版本控制系統的標准做法。
2.3、分布式版本控制系統
在這類系統中,像Git、Mercurial、Bazaar 以及 Darcs 等,客戶端並不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像(克隆)下來。這么一來,任何一處協同工作用的服務器發生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復。因為每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。
三、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、Git的工作原理
上面這幅圖很好的解釋了Git的工作原理:
工作區:clone的代碼或者開發自己編寫的代碼文件所在的目錄,通常是代碼所在的一個服務的目錄。
暫存區:用於存儲在工作區中對代碼進行修改后的文件所保存的地方,使用 git add . 添加到暫存區
本地倉庫:用於存儲在工作區和暫存區中改過的文件地方,使用git commit 進行提交
遠程倉庫:多個開發共同提交代碼的倉庫,即gitlab服務器。
四、案例環境
服務器 | IP地址 | 主機名 | 角色 |
centos7.x | 192.168.100.111 | gitserver | git服務器 |
centos7.x | 192.168.100.112 | git | git客戶端 |
案例一:部署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" 建立跟蹤)
案例二:部署win10 的git客戶端
軟件包下載:https://git-scm.com/downloads
訪問以上網站:(選擇windows)
下載好之后,安裝就默認下一步
這樣我們把代碼克隆下來
測試提交:
配置好郵箱后,我們再次提交就OK了
查看更新
這里就是舉個例子,公司的話不會寫的這么簡單(最后提交)
案例三:Git相關命令使用場景
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 對象 |
2. 常用配置
git config --global user.name "admin" #配置git使用用戶 git config --global user.email admin@163.com #配置git使用郵箱 git config --global color.ui true #語法高亮 git config --list #查看全局配置 git add . # 添加文件到暫存區 git commit -m "111" # 提交到本地倉庫 git status # 查看工作區的狀態 git push # 推送到遠程倉庫(即gitlab服務器) git pull # 獲取最新的代碼到本地(克隆的成本比較高,一般選擇git pull來只獲取沒有的那部分) git log # 查看操作日志 git reset --hard 版本ID號 # 回退到指定id的版本 git branch # 查看當前所在分支 git checkout -b dev # 創建dev分支,並切換 git checkout dev # 切換到dev分支