Git分支及其協同開發

Git分支

Git鼓勵在工作流程中頻繁的使用分支與合併,哪怕一天之內進行很多次
1:Git的必殺技特性:分支模型
2:Git分支處理非常的輕量級,可以瞬間完成新建分支
3:分支切換比較快捷方便
4:分支是Git強大獨特的地方
想要很好的理解Git分支,需要先理解Git是如何保存數據的

Git是如何保存數據的

上一篇文章中說到,Git保存的不是文件的變化或者差異,而是一系列不同時刻的文件快照。
1:git add暫存的操作步驟
1:通過SHA-1哈希算法爲每個文件計算校驗和,校驗和和文件名是一一對應的
2:使用blob對象將當前版本的文件快照保存到Git倉庫中
3:將檢驗和信息加入到暫存區域等待提交操作
檢驗和:長度爲40的SHA-1值字符串

首先通過git add把文件加入到暫存區域
在這裏插入圖片描述
然後通過git ls-files查看暫存區域中有哪些文件,然後再通過git ls-files -s – a.txt或者使用git ls-files -s查看文件對應的blob對象
在這裏插入圖片描述
通過git cat-file -p 對應的檢驗和值 可以查看文件中的內容
在這裏插入圖片描述
文件快照:是指添加文件那一時刻的文件內容

2:git commit的操作步驟
1:按照提交的文件目錄,計算每個目錄的檢驗和
2:倉庫中將上面的目錄結構、對應的檢驗和保存爲樹對象
3:創建一個提交對象,包含了樹對象指針、提交信息
4:爲後面需要的時候重現本次保存的快照

測試時建立了一個文件夾然後在裏面新建了兩個文件,然後提交它們
在這裏插入圖片描述
通過git log查看提交日誌:
可以看到commit後面有一串字符串,就是提交對象
在這裏插入圖片描述
通過git cat-file -p命令可以看到對應的樹對象和提交的信息
在這裏插入圖片描述
然後再次查看,可以看到下面有blog對象和樹對象
在這裏插入圖片描述
保存在Git數據庫中的內容都是使用校驗和哈希值來做索引的,不是用文件名
此時git倉庫中的對象,簡單使用下面圖示說明:
在這裏插入圖片描述
1:兩個blog對象,保存了文件快照
2:一個樹對象,記錄了目錄結構和和blog對象索引
3:一個提交對象,包含指向前面樹對象指針和提交信息

做出修改後再次提交:
修改後再次提交,產生的提交對象中會包含一個指向上次提交對象的指針:parent
在這裏插入圖片描述
第一次提交parent爲空,後面每次更新提交都有一個parent指向上次的提交對象

Git分支的本質

Git分支本質上是:指向提交對象的可變指針,默認分支名字是master;master分支會在每次的提交操作中自動向前移動
在這裏插入圖片描述
master分支並不是一個特殊的分支,它和其他分支沒有區別,git init命令默認創建的是master分支,名字可以修改

Git分支的操作

1:創建分支
Git創建一個新分支,只是創建了一個可以移動的新指針
git branch 分支名稱: 只創建一個新分支,並不切換分支
在這裏插入圖片描述
git checkout -b 分支名稱:創建並且切換分支
在這裏插入圖片描述
根據上圖可以清楚的看出兩種創建分支的區別
在這裏插入圖片描述
看到上面的圖,或許會有疑問,master和dev都指向同一個提交對象,那麼它不還是同一個嗎?下面將會解釋
怎麼知道當前是在哪一個分支上面呢?
通過名爲HEAD的特殊指針,指向當前所在的本地分支
在這裏插入圖片描述
通過 git log --oneline --decorate查看各個分支當前所指的對象,及查看當前所在的分支
在這裏插入圖片描述
可以看到當前所在的分支是master,三個分支都指向同一個提交對象b36b052
2:分支切換
通過git checkout 分支名稱命令切換分支:
在這裏插入圖片描述
在這裏插入圖片描述
當提交一次時,dev分支會隨着提交操作自動向前移動
在這裏插入圖片描述
在這裏插入圖片描述
然後切換到master分支再次提交一次,master會向前移動,提交歷史會產生分叉
在這裏插入圖片描述
在這裏插入圖片描述
查看分叉歷史:
可以通過git log --oneline --decorate --graph --all命令查看
在這裏插入圖片描述
Git分支總結
1:Git分支只包含所指對象校驗和的文件,創建和銷燬非常高效
2:創建一個新分支就相當於往一個文件中寫入41字節(40字節的校驗和與一個換行符)
3:根據父對象尋找共同的祖先進行合併同樣的高效
4:鼓勵開發人員頻繁的創建和使用分支

其他版本的控制系統:
1:創建分支將項目文件複製一遍,保存到特定的目錄
2:項目越大,耗費的時間就越長
3:使用分支
在這裏插入圖片描述
4:使用分支修復緊急的問題
在這裏插入圖片描述
假如現在正在dev上進行開發,然後主管過來說之前上線的版本出了一個問題,很急切的需要修復,那麼,我們可以創建一個新的分支去修改問題:
在這裏插入圖片描述
在這裏插入圖片描述
創建新分支hotfix,在上面進行開發修復問題,測試確保修復了bug,然後我們就需要把hotfix的代碼合併到master上去,因爲正常使用來說,master是保持一個穩定的版本,很少去直接修改它
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
合併之後,最新的修改已經在master上面了,可以進行發佈了;hotfix和master沒有分歧或者說是修改了同一個文件,可以快進合併(fast-forward),只需要將master指針向前移動即可
然後可以刪除無用的分支hotfix,通過命令git branch -d 分支名稱刪除
在這裏插入圖片描述
在這裏插入圖片描述
5:合併分支
非直接先祖的合併
現在需要合併C2、C3該怎麼操作?
在這裏插入圖片描述
一個合併提交操作:
master分支所在的提交不是dev分支所在提交的直接先祖
Git用兩個分支的末端快照(C2和C3)以及共同祖先(C1),進行合併
將三方合併結果做成新的快照並自動創建的新提交(C4)
不需要dev分支時,可以刪除
在這裏插入圖片描述
6:合併時反生衝突
在兩個分支中對同一個文件同一個地方進行了修改,合併時會發生衝突
Git會做合併,但是不會創建一個新的合併提交,需要自己去解決衝突
在這裏插入圖片描述
在這裏插入圖片描述
打開文件可以看到衝突的地方
在這裏插入圖片描述
解決衝突:
1:打開包含衝突的文件然後手動解決衝突
2:可以保留一方的修改,也可以合併兩方的修改
3:刪除<<<<<、======、>>>>>
4:使用git add標記爲衝突已解決
在這裏插入圖片描述

遠程倉庫與本地倉庫分支開發

1:從遠程倉庫拉取代碼
通過git clone命令可以從遠程倉庫把代碼拉取到本地,在本地中,有遠程分支和本地的master分支,遠程分支是和遠程倉庫中的分支一一對應的
在這裏插入圖片描述
2:遠程倉庫和本地提交修改
本地修改後的代碼可以合併到遠程倉庫
在這裏插入圖片描述
3:拉取遠程差異
當有人提交代碼合併到遠程倉庫時,可以使用git fetch命令把這部分提交的內容拉取到本地的遠程分支上(origin是遠程倉庫的名字,拉取代碼的時候可以通過下面的命令修改:git clone -o 倉庫名稱)
在這裏插入圖片描述

一個項目多個遠程倉庫

一個項目也許會有多個遠程倉庫,可以拉取多個遠程倉庫到本地
1:添加新的遠程倉庫
通過git remote add [shortName] [url] 命令可以添加一個新的遠程倉庫
在這裏插入圖片描述
2:從新的倉庫拉取差異
同樣的,可以使用git fetch命令拉取
在這裏插入圖片描述

遠程倉庫操作命令

1:git push origin serverfix:x 推送本地serverfix分支到遠程x分支
2:git checkout --track origin/x 跟蹤遠程分支x
3:git checkout -b serverfix origin/x 拉取基於遠程的本地工作分支
4:git fetch origin 抓取本地沒有的數據,不修改工作內容,拉取到本地的遠程分支上,需要自己合併內容
5:git pull origin 等同於git fetch接着git merge,單獨使用後面兩個命令更加清楚
6:git push origin --delete x 刪除遠程分支,服務器會保留數據一段時間等待垃圾回收運行

協同開發

1:長期分支工作模式
漸進穩定分支的流水線模式
各個分支的作用:
master:保留完全穩定的代碼
develop:用來做後續開發或者測試穩定性,一旦達到穩定狀態可以合併到master
topic:完成某個特性的分支
在這裏插入圖片描述
隨着提交的不斷進行,即指針一直向右移動,穩定分支master會落後一大截,前沿分支的指針比較靠前
在這裏插入圖片描述
這種方式的優點:
1:用這種方式可以維護不同層次的穩定性
2:每個分支具有不同級別的穩定性
3:當它們穩定後,再合併到具有更高穩定性的分支中
4:再龐大或者複雜的項目中,這種模式很有幫助

2:特性分支工作模式
特性分支是一種短期分支,用來實現單一特性或者相關工作
在這裏插入圖片描述
然後如果分支進行了合併,簡單畫圖如下:
在這裏插入圖片描述
特性分支對任何規模的項目都適用

Git flow工作流

其中有兩個比較重要的點:
1: master
存放正式發佈的版本,可以作爲項目歷史版本記錄分支,不直接提交代碼,僅用於保持一個線上運行代碼的code base
2: develop
分支爲主開發分支,一般不直接提交代碼
在這裏插入圖片描述
緊急修復線上的bug,可以從matser拉取一個hotfix分支進行修復,修復完成後合併到master分支和develop分支;其他一般基礎開發的部分是從develop上進行拉取分支,一般來說,develop不直接提交代碼,完成開發的測試工作一般是在release分支進行,因爲develop分支上可能會有多個開發人員進行代碼的合併,可能會影響到測試的結果
Git flow工作流程是圍繞項目發佈定義的嚴格分支模型,比特性分支模型複雜,爲大規模項目提供了一個框架

分支介紹:
1:release
基於最新的develop分支創建,當開發的新功能足夠發佈一個新的版本(或者接近新版本發佈的截止日期),從develop分支創建一個release分支作爲新版本的起點,用於測試,所有的測試Bug都在這個分支進行修改。測試完成後合併到master分支並打上版本號,同時也合併到develop分支,更新最新的開發分支,(一旦有了release分支之後,不要從develop分支上合併新的改動到release分支),同一時間只有一個,生命週期很短,只是爲了發佈

2:hotfix
分支是基於master分支創建的,主要目的是對線上版本的Bug進行修復,完成後直接合併到master分支和develop分支,如果當前還有新功能release分支,也同步到release分支上,同一時間只有一個,生命週期很短

3:feature
這個分支是新功能分支,feature分支都是基於develop分支創建的,開發完成後會合併到develop分支上,可以同時存在多個
在這裏插入圖片描述

GitLub安裝搭建

下面通過演示國內CentOS7的鏡像安裝包的方式來搭建GitLub
1:安裝依賴軟件

sudo yum install -y curl policycoreutils-python openssh-server openssh- client postfix
#設置ssh服務開機啓動
sudo systemctl enable sshd
sudo systemctl start sshd
#設置postifx郵件服務開機自啓動
sudo systemctl enable postfix
sudo systemctl start postfix

2:下載gitlab安裝包
在清華大學開源軟件鏡像站,https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce下面也能找到更加 新的版本,以及gitlab-ee版本

#安裝wget
yum -y install wget

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm

rpm -i gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm

3:修改gitlab配置
指定gitlab服務器ip和自定義端口,設置爲自己機器的ip地址和端口號,後面在瀏覽器登錄gitlab會用到這個地址

vim /etc/gitlab/gitlab.rb
external_url "http://ip:port"

4:重置並啓動GitLab

#查看gitlab所有安裝包的文件存儲位置
rpm -qal |grep gitlab
#進入gitlab文件位置,我的例子中在/opt/gitlab目錄
bin/gitlab-ctl reconfigure
bin/gitlab-ctl restart

5: 用戶名密碼設置

sudo bin/gitlab-rails console production
Loading production environment (Rails 4.1.12)
irb(main):001:0> u=User.where(id:1).first
=> #<User id: 1, email: "[email protected]", encrypted_password: "$2a$10$foLIteHM6rRrV/crdQU1POzH84T.Bz2L6FbzvPIMTgm...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2020-02-23 04:18:10", updated_at: "2020-02-23 04:18:11", name: "Administrator", admin: true, projects_limit: 10000, skype: "", linkedin: "", twitter: "", authentication_token: "A6khrCzAC5yqBvJQ-hVg", theme_id: 2, bio: nil, failed_attempts: 0, locked_at: nil, username: "root", can_create_group: true, can_create_team: false, state: "active", color_scheme_id: 1, notification_level: 1, password_expires_at: "2020-02-23 04:18:09", created_by_id: nil, last_credential_check_at: nil, avatar: nil, confirmation_token: "XcbcpbBEdxVgYCTJS-kL", confirmed_at: "2020-02-23 04:18:11", confirmation_sent_at: "2020-02-23 04:18:10", unconfirmed_email: nil, hide_no_ssh_key: false, website_url: "", notification_email: "[email protected]", hide_no_password: false, password_automatically_set: false, location: nil, encrypted_otp_secret: nil, encrypted_otp_secret_iv: nil, encrypted_otp_secret_salt: nil, otp_required_for_login: false, otp_backup_codes: nil, public_email: "", dashboard: 0, project_view: 0, consumed_timestep: nil>
irb(main):002:0> u.password='12345678'
=> "12345678"
irb(main):003:0> u.password_confirmation='12345678'
=> "12345678"
irb(main):004:0> u.save!
=> true
irb(main):005:0> exit

6:登錄檢測
根據前面配置的ip和端口號到瀏覽器進行訪問,通過前面配置的用戶名和密碼進行登錄
在這裏插入圖片描述
在這裏插入圖片描述
通過瀏覽器訪問出現上面的內容即搭建成功,在此之前可能會出現無法訪問的情況,需要關閉防火牆和開放上面設置的端口,具體操作如下:

CentOS7防火牆設置

CentOS 7默認使用firewalld服務操作防火牆,默認處於開啓狀態。通過firewall-cmd命令可以操作防火牆

1:查看防火牆狀態
systemctl status firewalld
在這裏插入圖片描述
2:查看防火牆規則
firewall-cmd --list-all
在這裏插入圖片描述
如果添加了8080/tcp的規則,就是這樣:
在這裏插入圖片描述
默認時沒有開發任何端口和協議,但開放了ssh服務,所以網絡連接設置成功後,就可以在終端程序中直接通過ssh登錄系統

3:開放端口
firewall-cmd --zone=public --add-port=1000/tcp --permanent
參數說明:
• --zone:指定規則應用的區域,通過firewall-cmd --get-active-zones可以查看網卡所屬的區域,一般情況下指定public即可。
• --add-port:指定需要開放的端口和協議。
• --permanent:表示永久生效,沒有此參數重啓後會失效。
添加端口後,需要重新加載配置才能生效。

4:移除端口
移除端口使用–remove-port參數,移除端口後也要重新加載配置才能生效
firewall-cmd --zone= public --remove-port=8080/tcp --permanent

5:重新加載防火牆配置
重新加載防火牆配置可以使用–reload參數
firewall-cmd --reload
或者重啓防火牆服務
systemctl restart firewalld

6:關閉防火牆
如果需要關閉防火牆,直接停止firewalld服務即可
systemctl stop firewalld
防火牆關閉後不會有任何提示,可以使用systemctl status firewalld命令查看服務狀態
在這裏插入圖片描述
防火牆關閉後firewall-cmd命令就無法使用了
在這裏插入圖片描述
但停止firewalld服務只能臨時關閉,重啓後會再次開啓,如果需要永久關閉,還需要將firewalld服務禁止掉
systemctl disable firewalld

使用GitLub

下面通過idea演示使用GitLub
在設置中點擊GitHub然後添加賬號和密碼
在這裏插入圖片描述
然後在VCS中點擊下面的內容選擇Git
在這裏插入圖片描述
輸入Git倉庫中項目的地址clone項目到本地
在這裏插入圖片描述
成功之後在右下角可以看到下面的內容:
在這裏插入圖片描述
在這裏插入圖片描述
點擊New Branch可以新建分支,選中分支,點擊左側checkout可以切換分支
在這裏插入圖片描述
修改文件後右鍵文件可以提交:
在這裏插入圖片描述
也可以選擇導航欄上的按鈕進行提交
在這裏插入圖片描述

結束語

總體的Git分支相關的內容到這就結束了,具體的根據不同的ide有不同的操作方式,可以自己操作下加深使用的印象

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