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    #查看本地分支与远程分支之间的差异

标签