设为首页 收藏本站
查看: 1358|回复: 0

[经验分享] Docker模拟多人协作进行Git操作

[复制链接]
发表于 2018-5-27 12:28:07 | 显示全部楼层 |阅读模式
  今天我们利用Docker模拟出两个终端,来进行git提交操作
开始前的准备
  1.安装docker应用,命令行输入docker -v
DSC0000.jpg

  如果出现上面的提示就说明docker下载成功了!然后让我们启动docker服务
service docker start  接下来我们要拉取Git镜像包,我这里使用的是阿里云镜像
git clone docker pull registry.cn-hangzhou.aliyuncs.com/kancloud/git
DSC0001.jpg

  下载成功我们来启动三个容器
docker run -it --name yi -d registry.cn-hangzhou.aliyuncs.com/kancloud/git:latest /bin/bash
docker run -it --name er -d registry.cn-hangzhou.aliyuncs.com/kancloud/git:latest /bin/bash
docker run -it --name san -d registry.cn-hangzhou.aliyuncs.com/kancloud/git:latest /bin/bash  然后用 docker ps 来查看我们正在运行中的容器
DSC0002.jpg

  开启三个终端分别进入三个容器内
docker exec -it [容器的ID] /bin/bash
DSC0003.jpg

  现在我们就有三个终端了!
一、GItHub
  在github上注册账号,创建一个库(接下来为了区分我们把github上面的这个库叫做远程仓库),创建之后呢,因为github号召大家代码开源,所以你的代码所有人都可以看到,但是并不代表谁都可以向你的远程库里面提交代码,在这里安全配置是通过id_rsa.pub来进行控制的,如何获取id_rsa.pub在这里我们就不过多介绍了,大家可以看看我的这篇博客
  http://blog.csdn.net/li_haijiang/article/details/75668343
  在分别获取id_rsa.pub后我们要把他们填入github中,如图所示
1.点击用户头像,在下拉列表中选择settings
2.在左边选择SSH and GPG keys
3.然后再右边就可以看到New SSH key
4.把我们获得id_rsa.pub填入第二个输入框,在第一个框里填入标识名
DSC0004.jpg

  我们把远程仓库起名为itxdl,让我们在客户终端看看是否能连通远程仓库吧
  首先在yi里面进行操作
#后面的这个地址是github给出来的地址git clone git@github.com:lihaijiang123/itxdl.git
DSC0005.jpg

  下载成功后我们来查看一个,可以发现itxdl这个仓库已经被我们拉下来了,进入库里查看里面的文件,就是github上创建的库
DSC0006.jpg

  成功!
二、本地仓库的提交与撤回
  通过git init命令把这个目录变成Git可以管理的仓库,我们刚刚拉下来的itxdl库已经是一个可被git管理的仓库了,所以不需要再git init
  下面我们拉入一个laravel框架到宿主机上,然后推送到github上
#宿主git add *
git commit -m "all clean laravel"git push origin master  注意 : git上传.env文件是不会上传的
  在终端yi的文件夹中下载下来
git clone git@github.com:lihaijiang123/itxdl.git  可以看到itxdl库已经克隆到我们本地文件夹
DSC0007.jpg
进入文件夹,可以发现我们的文件夹中就有了laravel这个框架的全部内容

DSC0008.jpg

  我们先进行本地操作
  首先我们新建一个User控制器,在里面新建index方法,查看一下
DSC0009.jpg

  第一步:使用命令 git add UserController.php添加到暂存区里面去。如下:
DSC00010.jpg

  现在我们已经提交了一个UserController.php文件到本地仓库了,我们下面可以通过命令git status来查看是否还有文件未提交,如下:
DSC00011.jpg

  说明没有任何文件未提交,但是我现在继续来改下UserController.php内容,比如我在下面添加show方法,使用git status来查看下结果,如下:
DSC00012.jpg

  上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。
  接下来我想看下readme.txt文件到底改了什么内容,如何查看呢?可以使用如下命令:
git diff UserController.php
DSC00013.jpg

  如上可以看到,UserController控制器里面新增了一个show方法;
  知道了对文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件是一样的2步
git add UserController.phpgit commit -m "UserController新增show方法"  版本退回
  现在我继续对UserController.php进行修改,新建add方法
DSC00014.jpg

  执行提交
git add UserController.phpgit commit -m "UserController.php增加add方法"  那么我现在想查看下历史记录,如何查呢?我们现在可以使用命令 git log 演示如下所示:
git log
DSC00015.jpg

  git log命令显示从最近到最远的显示日志,如果嫌上面显示的信息太多的话,我们可以使用命令 git log –pretty=oneline 演示如下:
DSC00016.jpg

  如果使用版本回退操作,我想把当前的版本回退到上一个版本
有两种方法:
git reset --hard HEAD^  那么如果要回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推。那如果要回退到前100个版本的话,使用上面的方法肯定不方便,我们可以使用下面的简便命令操作:git reset –hard HEAD~100 即可。
  未回退之前的UserController.php内容如下:
DSC00017.jpg

git reset hard -- HEAD^
DSC00018.jpg

  可以看到,内容已经回退到上一个版本了。可以继续使用git log 来查看下历史记录信息
DSC00019.jpg

  我们看到 新建add方法内容没有了,但是现在我又想回退到最新的版本,如:有add方法的内容要如何恢复呢?我们可以通过版本号回退,使用命令方法如下:
git reset --hard 版本号  但是现在的问题假如我已经关掉过一次命令行或者增加add方法的版本号我并不知道呢?要如何知道增加add方法内容的版本号呢?可以通过如下命令即可获取到版本号:
git reflog
DSC00020.jpg

  通过上面的显示我们可以知道,增加add方法的版本号是fcb6553.我们现在可以命令
git reset --hard fcb6553
DSC00021.jpg

  修改一下add方法里的内容 , 在我未提交之前,我发现添加i am a boy内容有误,所以我得马上恢复以前的版本,现在我可以有如下几种方法可以做修改:
  第一:如果我知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。
  第二:我可以按以前的方法直接恢复到上一个版本。使用 git reset --hard HEAD^
  但是现在我不想使用上面的2种方法,我想直接想使用撤销命令该如何操作呢?首先在做撤销之前,我们可以先用 git status 查看下当前的状态。如下所示:
DSC00022.jpg

  这时Git会告诉你,git checkout -- file 可以丢弃工作区的修改,如下命令:
git checkout -- file  命令 git checkout -- UserController.php 意思就是,把UserController.php文件在工作区做的修改全部撤销,这里有2种情况,如下:
  UserController.php修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。  
另外一种是UserController.php已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。
  对于第二种情况,我想我们继续做demo来看下,假如现在我对add方法添加一行 内容为111111111,我git add 增加到暂存区后,接着添加内容22222222,我想通过撤销命令让其回到暂存区后的状态。操作如下
#恢复到没有22222的状态git checkout -- UserController.php  注意:命令git checkout -- file 中的 -- 很重要,如果没有 -- 的话,那么命令变成创建分支了。
  删除文件
  假如我现在目录添加一个文件TestController.php,然后提交,然后删掉
git add TestController.phpgit commit -m "新增TestController控制器"rm TestController.php  只要没有commit之前,如果我想在版本库中恢复此文件如何操作呢?
  可以使用如下命令 git checkout – b.txt,如下所示:
#放弃工作区里的操作,恢复到上次提交后的样子git checkout -- TestController.php三、提交远程仓库
  1.首先设置我们的身份
DSC00023.jpg

  获取远程库的信息
  当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。
  要查看远程库的信息 使用 git remote  
要查看远程库的详细信息 使用 git remote –v
  可以用git push推送到远程仓库,那么我们就使用这个命令
DSC00024.jpg

  推送成功!这是我们到github上查看一下
DSC00025.jpg

  可以看到有三个控制器 succeed !
  这时我们加入第二个终端 “er”
  克隆github上的仓库 ,保持终端er和终端yi的内容一致
git clone git@github.com:lihaijiang123/itxdl.git  然后回来终端yi继续干活,修改一下UserController.php后提交到远程,这时终端er和github上的内容不一致了,我们在终端er修改UserController.php的内容后推送看看会怎么样呢
  这里git提示我们提交失败,原因是远程包含我所坐的操作,并且提示我可以先使用git pull ...然后在git push
DSC00026.jpg

  执行git pull后提示下载成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的 解决冲突完全一样。解决后,提交,再push,我们查看一下UserController.php
DSC00027.jpg

  <<< HEAD是当前本地分支的指针
====下面的是远程的分 , 手动解决冲突就好了
  然后提交,推送
DSC00028.jpg

  成功!我们来github看一下
DSC00029.jpg

  ok,终端yi和终端er的冲突已经解决了
四、创建与合并分支
  在版本后退里,我们已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
  首先,我们来创建dev分支,然后切换到dev分支上。
//本地创建和远程对应的分支git checkout -b 本地分支名 origin/远程分支名//创建分支并切换单该分支上git checkout -b dev//查看分支git branch
DSC00030.jpg

  git branch查看分支,会列出所有的分支,当前分支前面会添加一个星号。然后我们在dev分支上继续做demo,比如我们现在在TestController.php里新建一个index方法,然后提交到本地仓库
git branch
vim TsetController.phpgit add TestController.phpgit commit -m "Test控制器新建index方法"  PS :  (如果想提交当前dev分支可以使用git push origin dev)
  这时我们再切换回master分支,查看TestController.php文件,里面并没有index了控制器
git checkout master
cat TestController.php  因为当前不是分支dev,现在我们可以把dev分支上的内容合并到分支master上了,可以在master分支上,使用如下命令
git merge dev
DSC00031.jpg

  注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
  合并完成后,我们可以接着删除dev分支了
DSC00032.jpg

  分支冲突
  当两条分支对同一个文件同一个文本块进行了不同的修改,并试图合并时,Git不能自动合并的,称为冲突(conflict),解决冲突需人手动修改,和上面说的两个人解决冲突的方法是一样的
  分支管理策略
  通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 --no-ff来禁用”Fast forward”模式。当不使用fast forward模式后,删除的分支在git log中同样可以查的到的
git merge --no-ff -m "注释" dev
git log --graph --pretty=oneline --abbrev-commit  首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
  BUG分支
  在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。
  比如我在开发中接到一个404 bug时候,我们可以创建一个404分支来修复它,但是,当前的dev分支上的工作还没有提交.并不是我不想提交,而是工作进行到一半时候,我们还无法提交,比如我这个分支bug要2天完成,但是我issue-404 bug需要5个小时内完成。怎么办呢?还好,Git还提供了一个stash功能,可以把当前工作现场 ”隐藏起来”,等以后恢复现场后继续工作。如下:
git statsh  现在我可以通过创建issue-404分支来修复bug了。
  首先我们要确定在那个分支上修复bug,比如我现在是在主分支master上来修复的,现在我要在master分支上创建一个临时分支,演示如下:
git checkout -b issue-404  修复完成后,切换到master分支上,并完成合并,最后删除issue-404分支。
git checkout master
git merge --no-ff -m "合并404分支" issue-404git branch -d issue-404  然后在切换回dev分支,我们工作现场被保存到去哪里呢?我们可以使用命令 git stash list来查看下
git stash list  那么我们怎么恢复工作区呢
//恢复不删除git stash apply//删除保存的内容git stash drop//另一种方法是 恢复的同时并删除git stash pop
  Git是帮助我们提高工作效率的,而不是让我们因为他感觉到难的,git到这里我们就介绍这么多了,祝您工作愉快,下面给大家总结一下git的命令
DSC00033.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-481782-1-1.html 上篇帖子: 四个修改Docker默认存储位置的方法 下篇帖子: docker registry 镜像删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表