把认为哪个个分支不想让别人动,就把这个分支设置为保护分支,并且只有授权的用户才可以向这个分支推送代码
在实际使用过程中,我们通常会保持 master 分支稳定,用于生产环境的版本发布,
只有授权的用户
才可以向 master 合并代码。
要实现此功能,我们需要将 master 设置为保护分支,并
授权什么用户
可以向 master 用户推送代码。
使用 root 用户点击 git_test 仓库页面左下角的 Settings
进入设置页面,选择设置菜单栏下面的 Repository 选项
[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
在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
* master
[root@ci-node2 git_test]# git checkout dev
Switched to branch 'dev'
Your branch is up-to-date with 'origin/dev'.
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.