Git分布式版本控制
SVN 集中式的版本控制系統,只有一個中央數據倉庫,如果中央數據倉庫掛了或者不可訪問,所有的使用者無法使用SVN,無法進行提交或者備份文件
Git 分布式的版本控制系統,在每個使用者電腦就有一個完整的數據倉庫,沒有網絡依然可以使git,當然為了習慣團隊協作,會將本地數據同步到git服務器或者GitHub等代碼倉庫
二、Git介紹
Git是一款免費、開源的分布式版本控制系統,用於敏捷高效地處理任何或小或大的項目。
Git的三種重要模式,分別是已提交、已修改、已暫存
已提交(committed):表示數據文件已經順利提交到Git數據庫中。
已修改(modified):表示數據文件已經被修改,但未被保存到Git數據庫中。
已暫存(staged):表示數據文件已經被修改,並會在下次提交時提交到Git數據庫中。
提交前的數據文件可能會被隨意修改或丟失,但只要把文件快照順利提交到Git數據庫中,那就可以完全放心了,流程為:
1.在工作目錄中修改數據文件。
2.將文件的快照放入暫存區域。
3.將暫存區域的文件快照提交到Git倉庫中。
三、Git安裝
[root@git-node1 ~]# getenforce #確認Selinux關閉狀態
Disabled
[root@git-node1 ~]# systemctl stop firewalld #關閉防火墻
yum install git -y
四、Git全局配置
git config --global user.name "zcf" # 配置git使用用戶
git config --global user.email "[email protected]" # 配置git使用郵箱
git config --global color.ui true # 語法高亮
git config --list # 查看全局配置
五、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 對象
六、Git初始化目錄
工作目錄(git_data ):當前存放數據的地方
暫存區域(.git):暫時存放數據的地方
本地倉庫(.git):永久存放數據的地方
mkdir git_data
cd git_data/
# 初始化
git init
# 查看工作區狀態
git status
七、Git添加文件
[root@git git_data]# touch readme
[root@git git_data]# git status
# 未跟蹤的文件:
# (使用 "git add <file>..." 以包含要提交的內容)
#
# readme ###發現新建的readme文件 工作目錄
[root@git git_data]# git status
# 位於分支 master
# 要提交的變更:
# (使用 "git reset HEAD <file>..." 撤出暫存區)
#
# 新文件: readme ####暫存區域
[root@git git_data]# git commit -m "the first commit"
[master 8ad0e05] the first commit
1 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme #####存放到本地倉庫
八、Git 刪除暫存區數據
#####有些時候會向把已經添加到暫存區的文件移除,但仍然希望文件在工作目錄中不丟失,換句話說,就是把文件從追蹤清單中刪除。
###沒有添加到暫存區的數據直接rm刪除即可
##已經添加到暫存區的數據
Git rm --cached database ##將文件從Git暫存區域的追蹤列表移除(並不會刪除當前目錄內的數據文件)
git rm -f database ##講文件數據從Git暫存區和工作目錄一起刪除
####沒有添加到暫存區的數據直接mv/rename 改名即可
####已經添加到暫存區的數據
git mv readme notice
九、Git歷史記錄
#查看提交歷史記錄
git log
#查看最近幾條記錄
git log -2
#-p顯示每次提交的內容差異,例如僅查看最近一次差異
git log -p -1
#--stat簡要顯示數據增改行數,這樣能夠看到提交中修改過的內容,對文件添加或移動的行數,並在最後列出所有增減行的概要信息
git log --stat -2
#--pretty根據不同的格式展示提交的歷史信息
git log --pretty=oneline
#以更詳細的模式輸出提交的歷史記錄
git log --pretty=fuller -2
#查看當前所有提交記錄的簡短SHA-1哈希字串與提交者的姓名,其他格式見備註。
git log --pretty=fomat:"%h %cn"
還可以使用format參數來指定具體的輸出格式,這樣非常便於後期編程的提取分析哦,常用的格式有:
%s 提交說明。
%cd 提交日期。
%an 作者的名字。
%cn 提交者的姓名。
%ce 提交者的電子郵件。
%H 提交對象的完整SHA-1哈希字串。
%h 提交對象的簡短SHA-1哈希字串。
%T 樹對象的完整SHA-1哈希字串。
%t 樹對象的簡短SHA-1哈希字串。
%P 父對象的完整SHA-1哈希字串。
%p 父對象的簡短SHA-1哈希字串。
%ad 作者的修訂時間。
十、Git還原數據
Git服務程序中有一個叫做HEAD的版本指針,當用戶申請還原數據時,其實就是將
HEAD指針指向到某個特定的提交版本,但是因為Git是分布式版本控制系統,為了避
免歷史記錄沖突,故使用了SHA-1計算出十六進制的哈希字串來區分每個提交版本,
另外默認的HEAD版本指針會指向到最近的一次提交版本記錄,而上一個提交版本會
叫HEAD^,上上一個版本則會叫做HEAD^^,當然一般會用HEAD~5來表示往上數第
五個提交版本。
git reset --hard HEAD^ #→還原歷史提交版本上一次
git reset --hard 3de15d4 #→找到歷史還原點的SHA-1值後,就可以還原(值不寫全,系統
會自動匹配)
#####還原未來數據
什麽是未來數據?就是你還原到歷史數據了,但是你後悔了,想撤銷更改,但是git
log已經找不到這個版本了。
git reflog #→查看未來歷史更新點
十一、Git標簽
Git標簽使用前面回滾使用的是一串字符串,又長又難記。
git tag v1.0 #→當前提交內容打一個標簽(方便快速回滾),每次提交都可以打個tag。
git tag #→查看當前所有的標簽
git show v1.0 #→查看當前1.0版本的詳細信息
git tag v1.2 -m "version 1.2 release is test" #→創建帶有說明的標簽,-a指定標簽名字, -m指定說明文字
git tag -d v1.0 #→我們為同一個提交版本設置了兩次標簽,刪除之前的v1.0
[root@centos7 git_data]# git reset --hard 0bdf2e7
HEAD is now at 0bdf2e7 modified README file
[root@centos7 git_data]# git reset --hard V1.0
####對比數據
git diff可以對比當前文件與倉庫已保存文件的區別,知道了對README作了什麽修改後,再把它提交到倉庫就放?多了。
git diff README
十二、分支結構
在實際的項目開發中,盡量保證master分支穩定,僅用於發布新版本,平時不要隨便直接修改裏面的數據文件。
那在哪幹活呢?幹活都在dev分支上。每個人從dev分支創建自己個人分支,開發完合並到dev分支,最後dev分支合並到master分支。
[root@gitlab git_data]# git status
# On branch master #默認就在master分支
[root@gitlab git_data]# git branch dev #創建dev分支
[root@gitlab git_data]# git branch #查看當前所在分支/查看所有分支
dev
* master
[root@gitlab git_data]# git checkout dev #切換分支到dev
[root@gitlab git_data]# git branch #查看當前所在分支/查看所有分支
* dev
master
[root@gitlab git_data]# git branch dev #創建dev分支
[root@gitlab git_data]# git branch #查看當前所在分支/查看所有分支
dev
* master
[root@gitlab git_data]# git checkout dev #切換分支到dev
[root@gitlab git_data]# git branch #查看當前所在分支/查看所有分支
* dev
master
註:切換分支之前請務必commit,否則修改會丟失。
[root@gitlab git_data]# git checkout dev #切換分支到dev
[root@gitlab git_data]# echo "dev branch" >> kkk.txt
[root@gitlab git_data]# git status
[root@gitlab git_data]# git commit -a -m "dev-commit" #提交
十三、分支自動合並
1)自動合並:只有文件同一行內容沒有沖突,就可以自動合並
[root@gitlab git_data]# git checkout master #切換到master分支
Switched to branch 'master'
[root@gitlab git_data]# git merge dev #把dev分支自動合並到當前分支
Updating 242bac0..995e05e
Fast-forward
kkk.txt | 2 ++
1 file changed, 2 insertions(+)
2)合並沖突: 文件沖突 – 文件的同一行有不同的內容
模擬沖突(分別修改不同分支文件中的同一行的內容並提交):
echo "master-test" >>kkk.txt #在master分支向文件輸出測試內容
git commit -a -m "this is master-test" #提交
git checkout dev #切換分支到dev
echo "dev-test" >> kkk.txt #在dev分支向文件輸出測試內容
git commit -a -m "this is dev-test" #提交
git branch master #再次切換到master分支
git merge dev #進行合並
3)合並沖突:
[root@gitlab git_data]# git merge dev
Auto-merging kkk.txt
CONFLICT (content): Merge conflict in kkk.txt
Automatic merge failed; fix conflicts and then commit the result.
4)手動解決合並沖突
修改提交的文件,保留要留下的內容,其他沖突內容刪除
[root@gitlab git_data]# cat kkk.txt
test
dev branch
<<<<<<< HEAD
master-test
=======
dev-test
>>>>>>> dev
#比如要保留master-test,其他提示內容都刪除,刪除後文件內容如下:
[root@gitlab git_data]# cat kkk.txt
test
dev branch
master-test
#再次提交
[root@gitlab git_data]# git commit -a -m "解決合並沖突"
[master 071f8cd] 解決合並沖突
#重新進行合並
[root@gitlab git_data]# git merge dev
Already up-to-date.
可以看到,沖突已經解決。
5)刪除dev分支
git branch -d dev
十四、windows客戶端使用
windows的git,本質是windows上的linux系統
TortoiseGit-2.2.0.0-64bit 給git加外殼, svn客戶端的git版本
十五、Git服務器
1)使用GitHub或者碼雲等公共代碼倉庫
2)使用GitLab私有倉庫
私有倉庫GITLAB
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
機器內存給大點
yum localinstall gitlab-ce-9.1.4-ce.0.el7.x86_64.rpm
gitlab-ctl reconfigure #→初始化,就執行一次
gitlab-ctl status/stop/start
通過瀏覽器訪問頁面,設置初始密碼,其他操作類似GitHUB。
賬戶: root 密碼自己設置為12345678
註:gitlab搭配ssh默認端口引發的血戰
[ sed -i ‘s/#Port 22/Port 52113/g’ /etc/ssh/sshd_config
#如果是默認的22,就必須修改,否則不生效,我這裏改為了52113
systemctl restart sshd #重啟sshd服務
grep “ssh_port” /etc/gitlab/gitlab.rb #修改gitlab裏面的ssh_prot端口為自己服務器的sshd端口,聲明gitlab.yml中的配置會被這個給覆蓋
gitlab_rails[‘gitlab_shell_ssh_port’] = 52113
gitlab-ctl reconfigure #gitlab重新加載配置文件即可
十六、GITHUB使用
Github顧名思義是一個Git版本庫的托管服務,是目前全球最大的軟件倉庫,擁有上百
萬的開發者用戶,也是軟件開發和尋找資源的最佳途徑, Github不僅可以托管各種Git
版本倉庫,還擁有了更美觀的Web界面,您的代碼文件可以被任何人克隆,使得開發
者為開源項貢獻代碼變得更加容易,當然也可以付費購買私有庫,這樣高性價比的私
有庫真的是幫助到了很多團隊和企業
Git分布式版本控制