gitlab代码拉取与推送
本例子中演示的gitlab版本为15.9.0,可使用如下命令查看版本,如下:
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
创建项目
1、首先使用管理员用户登录gitlab,创建groups,如图:

组选择了private,如图:

2、在groups中,创建一个project,组是私有,默认项目也是私有,如图:



3、添加一个普通新用户,如图:

点击Users页面,然后输入用户名、邮箱、密码,点击创建即可,如图:

4、给普通用户授权,在项目界面,点击工具,如图:

可选择把组授权给用户或者把项目授权给用户,如图:

这里选择把groups授权给用户gongguan,点击manage access,点击invite members,如图:


拉取与推送代码
拉取和推送代码有两种方式,一种是SSH,一种是http,如图:

SSH是基于公钥/私钥来进行加密通信,更安全,而http是通过access token的方式,安全性略低,而且token使用起来也比较麻烦,本例子演示如何使用ssh来进行拉取与推送
1、首先在要拉取与提交代码的机器上生成秘钥,命令如下:
ssh-keygen #/root/.ssh目录下生成id_rsa.pub文件
2、用户gongguan登录gitlab,点击头像–>Edit profile,如图:

3、点击左侧的SSH Keys,如图:

4、将第一步生成的id_rsa.pub公钥文件内容复制到Key中,点击Add key,如图:

5、测试拉取与推送代码,先把项目拉取到本地,如图:

进入项目目录,创建新文件–>添加到暂存区–>提交修改,如图:

执行push命令推送,main分支是gitlab自带的默认分支,如图:

登录gitlab,可以看到hello.txt已经提交到gitlab中,如图:

注:如果推送报错提示分支是受到保护的,如图:

使用root登录gitlab,点击项目–>Repository–>Branches,可以看到分支显示protected,如图:

解除保护:点击下方的Settings–>Repository–>Protected Branches–>Expand,如图:

点击Unprotect按钮来解除保护,如图:

创建分支
1、创建并切换分支,执行命令如下:
git checkout -b dev #创建master并切换到master上
git branch #查看当前全部分支

注:新分支还是在temp-demo项目下的
如果远程还没有这个dev分支,可执行如下命令创建,如图:
git push --set-upstream origin dev

查看gitlab中的分支信息,可以看到dev已经创建,如图:

查看dev分支下的内容,如图:

从上图可以看出,新分支的内容与main分支内容相同,创建其他分支也按照此操作即可
合并分支
1、首先切换到main分支,查看分支中文件hello.txt和world.txt内容,如图:

2、创建并切换到dev分支,同时创建远程dev分支,如下:

此时dev分支的内容和main分支内容是一模一样的,那么我们就可以在dev分支上进行添加修改删除内容,最后在合并到main分支即可
3、修改dev分支内容,然后push到仓库,如图:

4、切换到main分支,将dev分支合并到main分支,如下:

查看文件内容,已经变为与dev分支一样的了,如图:

最后推送到仓库即可,如图:

分支冲突
分支冲突:当两个分支都对同一个文件进行修改,并都进行了提交,演示如下:
1、首先切换到main分支,然后修改world.txt内容,提交到本地仓库,如图:

2、接下来切换到dev分支,修改world.txt,并提交到本地仓库,如图:

3、将main分支合并到dev分支,可以看到提示分支冲突,如图:

查看world.txt内容,如图:

- HEAD:表示当前主分支修改内容,也就是dev分支
- main: 表示main分支修改的内容
4、编辑world.txt,删除冲突的提示部分,然后重新提交并合并即可,如图:


获取分支
本地已经拉取过仓库test-demo,但是现在远程手动创建了一个新分支,但是本地没有,需要将分支获取到本地来
1、手动在远程gitlab仓库上新建了分支,如图:

2、通过fetch将远程分支更新到本地,默认同名,如下:

3、然后执行切换分支命令即可看到本地已经有tempbranch了,如图:

注:git fetch origin后面不加分支默认更新全部分支数据到本地
更新本地分支内容
将本地的内容推送到gitlab后,在gitlab页面手动修改了文件的内容,那么此时本地和远程的文件内容已经不一致了,如果此时我们在本地新增了一个文件或者修改了文件然后push,就会报错,如下:
1、修改gitlab中testbranch下的2.txt,新增内容如下:

2、在本地testbranch中新增一个文件,如图:

3、执行推送后,可以看到报错如下:

报错的大致意思就是远程提交过修改,但是本地没有修改后的内容,因此拒绝提交,此时解决方法如下:
方法一:通过git fetch 和 git merge获取远程更新并合并到本地,如图:

合并后查看本地2.txt文件内容,已经与远程的gitlab中内容一致,如图:

再次推送,即可看到已推送成功,如图:


方法二:直接使用git pull命令,git pull相当于git fetch和git merge的结合

注:此时是不可以使用git pull origin testbranch:testbranch的,因为提交历史出现了分叉,远程修改2.txt后提交过一次,本地也提交过一次agent.yml,因此此时如果使用git pull origin testbranch:testbranch会提示non-fast-forward
删除文件
删除文件的主要步骤为:
- 执行命令git rm 删除文件
- 执行git commit 提交到本地仓库
- 执行git push 推送到远程仓库
1、下面删除agent.yml,并推送到远程仓库,如图:


恢复文件
如果删除文件后并且已经提交了,此时可以通过提交的哈希来恢复
1、首先执行命令查看提交的哈希值,如图:
git log --all -- file-path #file-path为文件路径

2、通过如下命令恢复,如图:
git checkout commit-hash^ -- file-path #注意commit-hash后面还有一个^

然后再执行add、commit、push即可
常用命令:
git push origin :dev #删除远程dev分支
git branch -d dev #删除本地dev分支 如果使用-D表示强制删除,删除前要切换到其他分支
git push --set-upstream origin dev #创建远程分支dev(本地存在远程不存在)
git branch #列出本地分支,当前分支用*标记
git branch -r #查看远程版本库的分支列表
git branch -a #查看所有分支列表(本地和远程,remotes表示远程)
git branch -v #查看一个分支的最后一次提交
git branch --merged #查看哪些分支已合并到当前分支
git branch 分支名 #创建新分支
git checkout 分支名 #切换分支
git checkout -b 分支名 #创建并切换分支
git checkout -- file.txt #恢复被删除的file.txt
git pull origin dev:dev #拉取远程分支到本地分支,如果不写本地名默认与远程分支同名
git stash #隐藏当前工作区
git status #查看状态
git log #查看历史记录
git add . #添加到暂存区,"."表示当前路径全部,也可以指定文件,如hello.txt
git commit -m "注释" #提交到本地git仓库
git push -u origin main #推送到远程main分支
git merge dev #假如当前在main分支,那么此命令就是将dev分支合并到main分支
git clone --single-branch -b dev git@...git #拉取指定分支
git clone http://username:token@github.com/abcd/repo.git #使用个人token(access token)克隆
git fetch origin dev #获取dev分支最新到本地dev但是不合并,如果不加dev默认获取所有
git fetch #获取全部的分支更新到本地,但是不合并
git merge origin/main #合并远程main分支到本地的main分支
git log main..origin/main #查看本地分支与远程分支之间的差异


