設置保護分支
把認為哪個個分支不想讓別人動,就把這個分支設置為保護分支,並且只有授權的用戶才可以向這個分支推送代碼
在實際使用過程中,我們通常會保持 master 分支穩定,用於生產環境的版本發布,只有授權的用戶才可以向 master 合並代碼。
要實現此功能,我們需要將 master 設置為保護分支,並授權什么用戶可以向 master 用戶推送代碼。
使用 root 用戶點擊 git_test 倉庫頁面左下角的 Settings

進入設置頁面,選擇設置菜單欄下面的 Repository 選項

進入 repository 設置頁面

展開 Protected Branches


設置完成后,在倉庫分支頁面,可看到 master 分支后面出現一個綠色的 protected 標記。意味着master分支被保護

只有master角色可以合並申請到master分支,才可以push代碼到master分支,對於master分支操作,只有master才可以做
admin是master身份
dev沒有權限往master分支push推送代碼,也沒有權限往master合並申請

ci-node1 對應master
ci-node2對應dev用戶
此時我們再嘗試在 ci-node2 上推送 master 分支到 GitLab
在dev分支 切換到master分支
[root@ci-node2 git_test]# git branch * dev master [root@ci-node2 git_test]# git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'
創建新文件,然后提交,在ci-node2客戶端推送
[root@ci-node2 git_test]# touch ci-node2 [root@ci-node2 git_test]# git add . [root@ci-node2 git_test]# git commit -m "commit ci-node2 on ci-node2" [master 2bd2e88] commit ci-node2 on ci-node2 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ci-node2
報錯
我們發現此時我們已經不能在 ci-node2 上向 GitLab 上推送 master 分支,因為我們ci-node2 綁定的是 dev 用戶,dev 用戶屬於 developer 角色,
master 分支不允許 developer角色向其推送內容。
[root@ci-node2 git_test]# git push -u origin master Counting objects: 2, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 234 bytes | 0 bytes/s, done. Total 2 (delta 1), reused 0 (delta 0) remote: GitLab: You are not allowed to push code to protected branches on this project. To 192.168.31.11:test/git_test.git ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'git@192.168.31.11:test/git_test.git
例子2
在dev分支
[root@ci-node2 git_test]# git branch * dev master
[root@ci-node2 git_test]# ll total 4 -rw-r--r-- 1 root root 21 Mar 30 00:11 a -rw-r--r-- 1 root root 0 Mar 30 00:34 dev -rw-r--r-- 1 root root 0 Mar 30 00:11 master -rw-r--r-- 1 root root 0 Mar 30 00:11 test
創建一個文件 然后提交
[root@ci-node2 git_test]# touch ci-node2
[root@ci-node2 git_test]# ll total 4 -rw-r--r-- 1 root root 21 Mar 30 00:11 a -rw-r--r-- 1 root root 0 Apr 1 23:05 ci-node2 -rw-r--r-- 1 root root 0 Mar 30 00:34 dev -rw-r--r-- 1 root root 0 Mar 30 00:11 master -rw-r--r-- 1 root root 0 Mar 30 00:11 test
[root@ci-node2 git_test]# git add . [root@ci-node2 git_test]# git commit -m "touch ci-node2 file on dev branch" [dev be5cdbe] touch ci-node2 file on dev branch 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ci-node2
推送到dev用戶
[root@ci-node2 git_test]# git push -u origin dev Counting objects: 2, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 247 bytes | 0 bytes/s, done. Total 2 (delta 1), reused 0 (delta 0) remote: remote: To create a merge request for dev, visit: remote: http://192.168.31.11/test/git_test/merge_requests/new?merge_request%5Bsource_branch%5D=dev remote: To 192.168.31.11:test/git_test.git a0e7b8d..be5cdbe dev -> dev Branch dev set up to track remote branch dev from origin.
推上去了

切換到master分支
[root@ci-node2 git_test]# git checkout master Switched to branch 'master'
把dev分支合並到master 分支
[root@ci-node2 git_test]# git merge dev Updating cc7da0e..be5cdbe Fast-forward ci-node2 | 0 dev | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ci-node2 create mode 100644 dev
推送到master分支
報錯原因 因為ci-node2 公鑰綁定gitlab dev用戶上 ,gitlab上設置dev用戶是開發者,開發者沒有權限推送到master
[root@ci-node2 git_test]# git push -u origin master Total 0 (delta 0), reused 0 (delta 0) remote: GitLab: You are not allowed to push code to protected branches on this project. To 192.168.31.11:test/git_test.git ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'git@192.168.31.11:test/git_test.git'
回到ci-node1 上 推master分支
[root@ci-node1 git_test]# git push -u gitlab master Branch master set up to track remote branch master from gitlab. Everything up-to-date
ci-node2 上做了修改 推送了倉庫內容,ci-node1現在本地倉庫和遠程倉庫 內容 不一致,導致以上情況
這時候需要 用git fetch命令
git fetch 使用
上面我們在 ci-node2 向 gitlab 上的遠程倉庫推送了新的內容,此時對於 ci-node1 上的 git_test 倉庫來說,它的遠程倉庫已經更新,所以需要將這些更新取回本地,這時就需 要用到 git fetch 命令。
fetch到本地,然后合並,再推送
[root@ci-node1 git_test]# git fetch remote: Counting objects: 4, done. remote: Compressing objects: 100% (4/4), done. remote: Total 4 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (4/4), done. From 192.168.31.11:test/git_test * [new branch] dev -> gitlab/dev
合並 把更新內容合並到本地
[root@ci-node1 git_test]# git merge gitlab/dev Updating cc7da0e..be5cdbe Fast-forward ci-node2 | 0 dev | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ci-node2 create mode 100644 dev
有ci-node2文件
[root@ci-node1 git_test]# ll total 4 -rw-r--r-- 1 root root 21 Mar 21 23:53 a -rw-r--r-- 1 root root 0 Apr 2 23:49 ci-node2 -rw-r--r-- 1 root root 0 Apr 2 23:49 dev -rw-r--r-- 1 root root 0 Mar 21 18:31 master -rw-r--r-- 1 root root 0 Mar 18 00:20 test
再推送
推成功了
[root@ci-node1 git_test]# git push -u gitlab master Total 0 (delta 0), reused 0 (delta 0) To 192.168.31.11:test/git_test.git cc7da0e..be5cdbe master -> master Branch master set up to track remote branch master from gitlab.
再看看gitlab 有ci-node2文件

現在ci-node1 客戶端上 對ci-node2 文件追加內容 ,提交
[root@ci-node1 git_test]# echo "222" >> ci-node2 [root@ci-node1 git_test]# git add . [root@ci-node1 git_test]# git commit -m "modify ci-node2 file on master branch" [master b5692cb] modify ci-node2 file on master branch 1 file changed, 1 insertion(+)
再推送
[root@ci-node1 git_test]# git push -u gitlab master Counting objects: 3, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 273 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) To 192.168.31.11:test/git_test.git be5cdbe..b5692cb master -> master Branch master set up to track remote branch master from gitlab
推送成功再去看看 gitlab,推上來了,dev用戶推不上來,ci-node1 可以推上來,ci-node1 公鑰綁定的是root用戶 admin用戶,
ci-node2 公鑰綁定要dev用戶,我們設置master分支只有master角色才能推送

不讓dev用戶推到master分支,dev用戶只能推到dev分支上,做完還可以提個申請,申請把代碼合並到master
切換到dev分支
[root@ci-node2 git_test]# git branch dev * master [root@ci-node2 git_test]# git checkout dev Switched to branch 'dev' Your branch is up-to-date with 'origin/dev'.
我們創建一個文件 ci-node2 然后提交 推送到gitlab 上的dev用戶
[root@ci-node2 git_test]# touch ci-node2 [root@ci-node2 git_test]# ll total 4 -rw-r--r-- 1 root root 21 Mar 30 00:11 a -rw-r--r-- 1 root root 0 Apr 4 18:36 ci-node2 -rw-r--r-- 1 root root 0 Mar 30 00:34 dev -rw-r--r-- 1 root root 0 Mar 30 00:11 master -rw-r--r-- 1 root root 0 Mar 30 00:11 test [root@ci-node2 git_test]# git add . [root@ci-node2 git_test]# git commit -m "touch ci-node2 file on dev branch" [dev 30de0f6] touch ci-node2 file on dev branch 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ci-node2
[root@ci-node2 git_test]# git remote origin
[root@ci-node2 git_test]# git push -u origin dev Counting objects: 2, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 247 bytes | 0 bytes/s, done. Total 2 (delta 1), reused 0 (delta 0) remote: remote: To create a merge request for dev, visit: remote: http://192.168.31.11/test/git_test/merge_requests/new?merge_request%5Bsource_branch%5D=dev remote: To 192.168.31.11:test/git_test.git a0e7b8d..30de0f6 dev -> dev Branch dev set up to track remote branch dev from origin.
在gitlab登錄dev用戶 在dev分支上做了改動 ,然后可以在web界面提交合並申請 把dev分支合並到master分支
dev分支上收到推送的ci-node2文件

出現界面填信息


然后退出來,登錄root用戶 發現合並請求


這里可以看合並了什么東西 有什么改變

沒有問題就merge

點完merge以后,他會告訴你 已經合並過來了

再看看 master分支的倉庫 ci-node2 合並進來master

沒有權限推送到master,你可以在提合並申請,合並申請有合並內容,
