gitlab操作手册 文章目录git操作篇1. 项目克隆2. 项目的提交3. 项目的推送4. 分支和gitflow流5. 项目还原到历史版本6.合并之rebase和merge7. 冲突解决gitlab操作篇1.gitlab项目新建2.sshkey设置3.代码上传git操作篇1. 项目克隆可以指定目录不指定就是用默认的仓库名git clone gitgitlab.test.cn:pro/project1.git [指定目录]2. 项目的提交注如果要查看文件的状态可以用git status命令如上图所示文件已经修改了。3. 项目的推送git push origin feature/test01注如果要查看远程的项目源地址可以如下命令git remote -v4. 分支和gitflow流master分支master分支是最终版本的分支是正式发布使用的是受保护的分支在master分支上不能随意修改develop分支develop分支从master分支拉取出来作为功能分支的集成分支这样也方便master分支上的所有提交分配一个版本号如图所示1.如果在远程服务器上没有develop这个分支那么在本地新建一个并上传 git branch develop git push -u origin develop 2.如果远程已经存在那么在本地直接远程check下来即可 git checkout -b develop origin/develop 3.如果功能分支需要合并进来 git pull origin //在合并进来之前最好先拉取一下以免有冲突 git merge feature/feature-lisifeature分支feature分支也叫功能分支就是对一个项目组按人员划分来建立分支比如张三就是feature/feature-zhangsan,李四就是feature/feature-lisi。功能分支不是从master中去fork分支(切记)而是将develop分支作为父分支。当功能开发完成后合并回develop分支。这样子做的目的是每个人开发都相对独立相互不受影响。其结构图所示如果是新的feature分支在远程不存在的那么从develop中创建出功能分支 git checkout -b feature/feature-lisi develop 将本地的feature分支提交到远程服务器上 git push origin feature/feature-lisi 如果远程featrue分支已经存在 git checkout -b feature/lisi origin feature/lisirelease分支到了发布的时候专门为发布准备了一个分支就是release分支它从develop中fork出来这么做的目的是一个团队可以在完善当前的发布版本的同时另一个团队可以继续开发下一个版本。并且这个版本只做上线前的bug修复用(即测试测出来的bug修改)不能新增功能一旦合并到master分支后也同时要将所做的修改合并到develop分支中去。其结构图所示1. 从develop中fork一个分支 git checkout -b release-0.1 develop 2. 发布时的操作 git checkout master git merge release-0.1 git push 3. 一定要合并回develop git checkout develop git merge release-0.1 git push 4. 删除发布分支 git branch -d release-0.1hotfix分支hotfix分支也叫维护分支或者热修复分支用于快速给生产线上的产品打补丁用(比如客户在生产线上发现了紧急bug需要马上修复)这是唯一从master分支中去fork出来的分支修复完成后将修改的要合并到develop分支master分支应该用新的版本号打好tag。这样做的目的是让团队快速解决掉问题而不用打断其他工作或等待下一个发布。可以理解成在master分支上处理的临时发布。结构图如图所示1. 从master中fork出一个分支 git checkout -b hotfix-001 master 2. 修改完bug进行合并提交 git checkout master git merge hotfix-001 git push 3. 切换到develop分支进行合并提交 git checkout develop git merge hotfix-001 git push 4. 删除热修复分支 git branch -d hotfix-001注在切换到某个分支的时候必须需要对这个分支做一个拉取以免出现冲突git pull origin [分支名]5. 项目还原到历史版本如果我们开发时候发现错了想还原到具体某一个版本git也很方便。先通过查找日志查找版本号git log [文件名]每次修改提交都有一个记录编号还原到某个版本可以从日志中找到某个日志编号进行还原,比我我要还原成2月份的一个版本git查看版本树git log --oneline --graph --decorate --allgit reset --hard e957e52aa922b7b95b4d6bc85159fa41d466acd3注如果还原到上一个版本或者上上个版本git reset --hard HEAD^ //还原到上一个版本 git reset --hard HEAD^^ //还原到上上个版本6.合并之rebase和mergerebasegitcheckout developgitrebase -i[分支A]rebase操作时是从两个分支共同的commit节点开始将当前的分支develop的commit都提取出来追加到分支A上有冲突就解决冲突合并完成后会将develop原来提交的commit记录号删除掉在最后重新生成新的commit记录号所以rebase不会产生多个commit可以节省资源但同时比较坑的是如果多次commit有冲突需要解决多次冲突mergegitcheckout developgitmerge[分支A]merge操作时两个分支共同的节点号以及他们最新提交的节点一起合并生成一个最新的节点。冲突只要解决一次就行但同时也会产生多个commit。从公司多人协作项目考虑建议用merge.总结我们在使用合并代码时默认是使用fast-forword模式这种模式不会保存commit记录在合并和删除分支时会将分支信息删除掉。gitrebase--ontodevelop 提示: First,rewindingheadto replay your work ontopof it... Fast-forwarded master to develop.gitmerge develop 提示: Updating 5a8b732..85a33e2Fast-forward2.txt|1-1filechanged,1deletion(-)在使用git pull时其实是拉取远程文件 和 合并的一个组合gitpullgitfetch gitmergegitpull-rgitfetch gitrebase7. 冲突解决比如有文件2.txt初始内容如下:develop分支添加2.txt文件 develop分支合并了内容3333333111111现在有两个分支masertdevelop都不小心修改了同样的内容:developdevelop分支添加2.txt文件 develop分支合并了内容 develop分支修改了内容masterdevelop分支添加2.txt文件: develop分支合并了内容 master分支修改了内容这个时候在master分支下将develop合并进去gitcheckout mastergitmerge develop 提示: Auto-merging2.txt CONFLICT(content):Merge conflictin2.txtAutomatic merge failed;fix conflicts andthencommit the result.提示在合并2.txt文件时发生冲突如图所示: HEAD 和 之间的表示当前分支下所修改的内容和 develop之间的表示develop分支的内容。接下来就来解决冲突,选择其中一行的内容也可以两行都保留很简单只需要HEAD,, develop去掉在这个例子以develop分支修改的为主然后再提交。develop分支添加2.txt文件 develop分支合并了内容 develop分支修改了内容gitadd2.txtgitcommit -m2.txt冲突解决 提示:[master 5a8b732]2.txt冲突解决gitlab操作篇gitlab master分支第一次push代码的时候只有主程序员才能推送其他角色推送不了会报错1.gitlab项目新建1.1 进项目首页1.2 创建空白项目(比较常用)1.3 通过模板来进行创建选择了模板之后会自动生成框架直接使用就行1.4 还可以通过从其他git源导入进来2.sshkey设置2.1 在本机生成sshkey下面以mac下面为例进行演示windows平台下的网上自己搜索。1. 进入.ssh目录 cd ~/.ssh 2. 生成SSH密钥 默认名称 ssh-keygen -t rsa -C 你的个人邮箱 自定义名称 ssh-keygen -t rsa -f 密钥名称 -C 你的个人邮箱 例子 ssh-keygen -t rsa -f id_rsa_xinhui -C hjc_042043sina.cn 接下来直接回车下去不用输入passphrase内容不然每次操作都要输入passphrase 3. 获取SSH公钥信息 这时在.ssh目录下会生成两个文件私钥id_rsa和公钥id_rsa.pub两个密钥文件。2.2 在gitlab平台添加sshkey可以将id_rsa.pub文件内容复制出来然后黏贴到gitlab平台添加成功之后看如图所示2.3 如果有多个git源仓库怎么办?如果有多个git源库比如既有gitlab又有github版本库的时候那么SSHkey需要做区分,需要在~/.ssh目录中添加一个config文件以及known_hosts文件config文件主要是来管理git源known_host是来管理私钥内容内容如下# gitlab Host 192.168..0.103 HostName 192.168..0.103 User allen.huang IdentityFile ~/.ssh/id_rsa # github Host github.com HostName github.com User hjc1985 IdentityFile ~/.ssh/id_rsa_github # golivecc Host 192.168.0.102 HostName 192.168.0.102 User hjc IdentityFile ~/.ssh/id_rsa_golivecc # 对Host进行测试 $ ssh -T git192.168.0.102 Welcome to GitLab, 黄锦潮! #如果输出如下结果表示成功参考https://segmentfault.com/a/1190000002994742http://blog.csdn.net/baidu_35738377/article/details/545801563.代码上传Git用户名和邮箱的配置注如果有多个git源,不能用 git config --globalgit config user.name 你注册的用户名 git config user.email 你注册的邮箱创建新版本库git clone git192.168.0.102:git-test/demo.git cd phptest touch README.md git add README.md git commit -m add README git push -u origin master设置gitignore在.gitignore文件中例如可以把缓存日志类的文件忽略掉把.DS_Store (mac下有windows下没有)thumbs.db, data/logs, data/caches等忽略文件权限的变更git config --global core.fileMode false如果已存在的文件夹cd existing_folder # 初始化git仓库 git init # 将远程git库和当前的库进行绑定 git remote add origin git192.168.0.102:git-test/demo.git git add . git commit -m Initial commit git push -u origin master如果已存在的 Git 版本库cd existing_repo git remote rename origin old-origin git remote add origin git192.168.0.102:git-test/demo.git git push -u origin --all git push -u origin --tags将源仓库地址替换成新地址git remote set-url origin 新的.git git fetch --all git pullgit利用nginx进行域名的反向代理#PROXY-START/ location ~* \.(php|jsp|cgi|asp|aspx)$ { proxy_pass http://localhost:8099; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } location / { proxy_pass http://localhost:8099; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; add_header X-Cache $upstream_cache_status; #Set Nginx Cache add_header Cache-Control no-cache; expires 12h; }server { listen 80; server_name git.programlife.tech; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/git.programlife.tech; #SSL-START SSL相关配置请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; #SSL-END #ERROR-PAGE-START 错误页配置可以注释、删除或修改 #error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END #PHP-INFO-START PHP引用配置可以注释或修改 #清理缓存规则 location ~ /purge(/.*) { proxy_cache_purge cache_one $host$1$is_args$args; #access_log /www/wwwlogs/git.programlife.tech_purge_cache.log; } #引用反向代理规则注释后配置的反向代理将无效 include /www/server/panel/vhost/nginx/proxy/git.programlife.tech/*.conf; include enable-php-00.conf; #PHP-INFO-END #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效 include /www/server/panel/vhost/rewrite/git.programlife.tech.conf; #REWRITE-END #禁止访问的文件或目录 location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) { return 404; } #一键申请SSL证书验证目录相关设置 location ~ \.well-known{ allow all; } access_log /www/wwwlogs/git.programlife.tech.log; error_log /www/wwwlogs/git.programlife.tech.error.log; }