git權威指南總結六:git協議和工作協同

git支持的協議

git提供了豐富的協議支持,比如:SSH/GIT/HTTP/HTTPS/FTP等等。所有的協議主要可以分爲兩大類:智能協議和啞協議
智能協議:在會話中使用智能協議,會在會話的兩個版本庫的各自一段中打開相應的程序進行數據交換。使用智能協議最直觀的印象就是在數據傳輸過程中會有清晰的進度顯示,並且因爲是按需傳輸所以傳輸量更小,傳輸速度更快。SSH/GIT及本地協議(file://)等就屬於智能協議
啞協議:和智能協議相對的就是啞協議。使用啞協議訪問遠程版本庫的時候,遠程版本庫不會自動運行輔助程序,而是完全依靠客戶端去主動發現。使用啞協議最直觀的印象就是傳輸速度慢,而且傳輸進度不可見,不知道什麼時候才能完成數據傳輸。FTP等就屬於啞協議
以git項目本身爲例,看看如何使用不同的協議地址進行版本庫克隆的
使用智能git協議:git clone git://git.kernel.org/pub/scm/git/git.git
使用HTTP(S)啞協議:git clone http://www.kernel.org/pub/scm/git.git
使用HTTP(S)智能協議:git clone https://github.com/git/git.git


多用戶協同的本地模擬

這裏我們使用本地協議模擬多用戶操作,本地協議地址爲:file:///path/repo.git
首先,創建一個裸版本庫git init --bare test/share.git,這裏需要注意一點是:創建的裸版本庫需要放在gitpath目錄下,即bin目錄所在包下
然後,我們創建第一個user1用戶克隆之前創建的版本庫,不過這次克隆和之前的克隆不一樣,我們使用本地協議進行克隆:git clone file:///test/share.git user1,即可假設user1爲一個用戶
可以爲用戶設置專屬用戶名和郵箱地址:git config user.name Xxx git config user.email Xxxx,這裏只是進行局部配置,不需要使用任何參數
接下來,user1中進行一次提交echo "hello world" > index.txt; git add index.txt; ;git commit -m "async commit test1;",然後將user1用戶的提交推送到上游版本庫中git push origin master
然後我們創建用戶user2克隆版本庫,模擬多個用戶進行操作git clone file:///test/share.git user2
可以爲用戶設置專屬用戶名和郵箱地址:git config user.name Xxx git config user.email Xxxx,這裏只是進行局部配置,不需要使用任何參數
然後現在使用命令:git log --pretty=oneline -1查看歷史提交版本,可以看到歷史提交版本會顯示之前在user1中提交ID


強制非快進式推送

首先我們需要知道什麼叫做非快進式推送,所謂快進式推送,是指要推送的本地版本庫的提交是建立在遠程版本庫相應分支的現有提交基礎上的,簡單來說就是遠程版本庫相應分支的最新提交和本地版本庫最新提交的祖先提交相等
比如user1用戶修改了readme.txt文件並進行了提交,而user2用戶此時也對readme.txt文件進行修改並進行提交,而此時的user2的提交會失敗,這是因爲非快進式推送導致的,git不能判斷提交哪一個推送,所以就默認只會保存第一個提交
如果此時想要強制提交user2用戶對readme.txt文件的修改,可以使用強制提交命令:git push -f origin master即可


避免非快進式推送:合併後推送

事實上,理性的工作協同要儘量避免使用非快進式推送,如果在向服務器推送過程中由於他人的提交導致遇到了非快進式推送的警告,可以使用如下操作代替強制推送:執行git pull獲取服務器最新數據並和本地的提交進行合併,合併成功後再向服務器進行提交
主要來說,合併後推送主要分爲兩步:
1.git pull:獲取上游版本庫最新提交,並和本地的提交進行合併
2.git push:將合併後的數據進行提交


如何禁止非快進式推送

有兩種方式來禁止該推送方式:
1.改變版本庫的配置變量:receive denyNonFastForwords設置爲true可以禁止任何用戶的非快進式推送
git config receive.denyNonFastForwords true
2.通過鉤子腳本進行設置,這種方式可以設置:只對部分用戶進行限制,而允許特定的用戶執行非快進式推送


參考文獻

git權威指南一書
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章