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

[经验分享] Git 远程仓库详解 ,Git分支管理详解

[复制链接]

尚未签到

发表于 2018-9-18 07:49:01 | 显示全部楼层 |阅读模式
  一、前言
  二、Git 服务器搭建
  三、增加远程仓库
  四、从远克隆仓库
  一、前言
  大家都知道Git是分布式版本控制器,同一个版本库可以在不同的客户端上使用。所以呢,必须的一台主服务器,这样的所有的客户端可能“克隆”这个原始版本库,并且每台客户端的版本库都会一样,嘿嘿。所以说呢,想要多人一起开发必须要有一台Git服务器。这样其他人就可以从这服Git服务器上克隆一份到自己的电脑上,也可以把各自的代码提交到远程服务器的版本库里,并且可以拉取别人提交的代码。是不是很方便呢,嘿嘿!那有博友会说了,我们没有多于的电脑搭建Git服务器怎么办?那我只想说,也是可以的。因为有个网站叫GitHub。这个网站提供Git版本库的管理。你只要到GitHub网站上注册一个账号,就可以免费获得一个Git远程仓库,是不是很神奇呢?再这里我们要感谢开源,感谢开源精神。
  上面已经说的比较清楚了,我们要获得Git远程仓库实现多人开发的目的,我们有两个办法:

  •   自己搭建Git服务器
  •   选择开源的GitHub
  这里主要讲解自己搭建服务器,下面我们就来搭建自己的Git服务器。
  二、Git 服务器搭建
[root@git ~]# cd src/  
[root@git src]# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  
[root@git src]# rpm -ivh epel-release-6-8.noarch.rpm
  
Preparing...                ########################################### [100%]
  
    package epel-release-6-8.noarch is already installed
  
[root@git ~]# yum list
  
[root@git ~]# yum install -y git
  好了,到这里我们的Git服务器就安装完成了。
  三、增加远程仓库
  1.增加git用户来运行git服务
[root@test ~]# mkdir -pv /data/git   mkdir: created directory `/data/git'  
[root@test ~]# useradd -r -d /data/git git
  2.创建一个git仓库并初始化一个空库
[root@test git]# cd /data/git/  
[root@test git]# ls
  
[root@test git]# git init --bare project1.git
  
Initialized empty Git repository in /data/git/project1.git/
  
[root@test git]# cd project1.git/
  
[root@test project1.git]# ls
  branches  config  description  HEAD  hooks  info  objects  refs
  通过上面的命令,Git 就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库是为了共享用,所以不让用户直接登录到服务器上去修改工作区,一般服务器上的Git仓库都是以.git结尾。然后我们再修改目录的所有者。
[root@test project1.git]# chown -R git.git /data/git/*  
[root@test project1.git]# ll
  
total 32
  
drwxr-xr-x 2 git git 4096 May 20 17:30 branches
  
-rw-r--r-- 1 git git   66 May 20 17:30 config
  
-rw-r--r-- 1 git git   73 May 20 17:30 description
  
-rw-r--r-- 1 git git   23 May 20 17:30 HEAD
  
drwxr-xr-x 2 git git 4096 May 20 17:30 hooks
  
drwxr-xr-x 2 git git 4096 May 20 17:30 info
  
drwxr-xr-x 4 git git 4096 May 20 17:30 objects
  
drwxr-xr-x 4 git git 4096 May 20 17:30 refs
  3.禁用git用户登录
[root@test project1.git]# vim /etc/passwd  
[root@test project1.git]# cat /etc/passwd | grep git
  
git:x:101:105::/data/git:/usr/bin/git-shell
  我们出于安全的考虑,修改git用户的shell。我这里修改为/usr/bin/git-shell。这样git用户就无法登录系统,因为我们指定的是git-shell每次登录就会自动退出的,嘿嘿。好了,到这里我们Git仓库就初始化完成了。
  四、在客户端克隆远程仓库
  1.客户端生成ssh登录公钥
DSC0000.png

  2.查看生成的ssh公钥
DSC0001.png

  3.将生成的公钥发送git服务器上(因为我这里就能管理git服务器所以我直接scp了,不能管理git服务器的开发人员请将公钥发给管理员并进行相关操作)
[root@test ~]# cd /data/git/  
[root@test git]# ls    project1.git
  
[root@test git]# ls -a    .  ..  project1.git
  
[root@test git]# mkdir .ssh
  
[root@test git]# ls    project1.git
  
[root@test git]# ls -a    .  ..  project1.git  .ssh
  
[root@test git]# cd .ssh/
  
[root@test .ssh]# vim authorized_keys
  
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwMU4FKB6NRc3XSoIunWsdvVVuSoncbVb5Al6lB3ciswBVd++YmJFhqwkITNGccrO5sycROs9+Fbjgd6oBSzNuaBtCIbwNNsEyM/henTl2euI3XsnJQ/ITr6c/q0P3WoGl4E2QFQ2kZqs+1eDC0CgHcBrqvFv1Jr414sVYK9lfZwIF+jDdtaBOrSJuq1Agx9pGUFUEB4tQfkXxsWm/MvOmKAVvduKDE1eenUEL9zzyeELPcSXLe3NOoTjZhkX6EEXxQR1ZiZRFywLpfM4qopZ10to2KIUyVtzw6hx6V3cg7kn40lYVW0EAMATw9dVldwcRUI+kJzJSKUTKDVSwY3/+Q== root@CHENMINGQIAN
  
[root@test .ssh]# cat authorized_keys
  
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwMU4FKB6NRc3XSoIunWsdvVVuSoncbVb5Al6lB3ciswBVd++YmJFhqwkITNGccrO5sycROs9
  4.客户端克隆远程仓库到本地
DSC0002.png

  好了,到这里我们的远程仓库管理就到这里结束了。
  Git 分支管理详解
  1.前言
  2.创建分支
  3.切换分支
  4.合并分支(快速合并)
  5.删除分支
  6.分支合并冲突
  7.合并分支(普通合并)
  8.分支管理策略
  9.团队多人开发协作
  10.总结
  1.前言
  我们先来说一个简单案例吧,你们团队中有多个人再开发一下项目,一同事再开发一个新功能,需要一周时间完成,他写了其中的30%还没有写完,如果他提交了这个版本,那么团队中的其它人就不能继续开发了。但是等到他全部写完再全部提交,大家又看不到他开发进度,也不能继续干活,这如何是好呢?
  对于上面的这个问题,我们就可以用分支管理的办法来解决,一同事开发新功能他可以创建一个属于他自己的分支,其它同事暂时看不到,继续在开发分支(一般都有多个分支)上干活,他在自己的分支上干活,等他全部开发完成,再一次性的合并到开发分支上,这样我们既可知道他的开发进度,又不影响大家干活,是不是很方便呢?
  大家可能会说了,你Git的分支功能人家SVN也有啊,也没什么特殊的嘛。但我想说你那个创建和切换速度怎么样呢?嘿嘿,我想说谁用谁知道啊!但Git呢,无论你创建还是切换或者删除都很快哦!
  分支本质上其实就是一个指向某次提交的可变指针。Git 的默认分支名字为 master 。而我们是怎么知道当前处于哪个分支当中呢?答案就是在于 HEAD 这个十分特殊的指针,它专门用于指向于本地分支中的当前分支。我们可以简单理解为:commit   预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。
  5).bug 分支 fixbug
  bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。
DSC0003.png

  6).其它分支 other
  还有就是其它分支了,大家可以根据需要创建即可……
  9.团队多人开发协作
  一般开发团队中有这样几个分支,master、develop、feature、release、bug、other分支,或者你还有其它分支,那这么多分支,都在本地放着我们怎么查看和推送分支到远程服务器上呢?
  下面来重点讲解,在团队多人协作中的分支推送与抓取。
  1).查看远程仓库分支
  查看远程仓库的信息,如下图:
DSC0004.png

  git remote命令可以查看远程仓库,加-v选项可以查看详细信息。上面显示了你抓取和推送的origin(源)信息。 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程仓库的默认名称是origin。
  2).分支推送
  下面我们来演示一下将本地分支推送到远程的仓库中,如下图:
DSC0005.png

  大家可以看到,我们的本地master分支与远程的master分支已同步。
  下面我们来演示一下同步dev分支,如下图:
DSC0006.png

  有时候,我们本地有很多分支,有哪些分支需要推送到远程仓库中呢?一般是这样的,

  •   master 分支是主分支,要时刻与远程同步,一般我们发布最新版本就用master分支
  •   develop 分支是开发分支,团队中所有人都在这个分支上开发,所以也需要与远程同步
  •   bug 分支一般只在本地使用来修复bug,一般不需推送远程仓库中
  •   feature 分支是否需要推送到远程,要看是不是有几个人合作开发新功能,如果你是一个开发,那就留在本地吧
  •   release 分支一般是系统管理,推送或抓取的分支一般与开发人员无关
  •   other 分支大家按需求分配
  3).分支抓取
  现在你一同事在电脑上克隆一份仓库,我们来演示一下。
  生成公钥:
[root@localhost ~]# ssh-keygen -t rsa  
Generating public/private rsa key pair.
  
Enter file in which to save the key (/root/.ssh/id_rsa):
  
Enter passphrase (empty for no passphrase):
  
Enter same passphrase again:
  
Your identification has been saved in /root/.ssh/id_rsa.
  
Your public key has been saved in /root/.ssh/id_rsa.pub.
  
The key fingerprint is:
  
60:a6:f3:71:d1:1e:0f:5f:3f:0c:6f:a3:61:4c:28:c0 root@localhost.localdomain
  
The key's randomart image is:
  
+--[ RSA 2048]----+
  
+-----------------+
  
[root@localhost ~]# cd .ssh/
  
[root@localhost .ssh]# cat id_rsa.pub
  
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAx/ms/8BGBrG2FwHNySjFsVdpldArSzS6CkrdFeqJd0YAZfo/e2RwyZ9HkBqp3xcBZxCRdifnPbfSHdACLbVALfw2Dj6s0jJmdg3AHth13hF1qeljlQarXTTkheHNuFhi3OF/MVKZXJh0jRT2xU9UL4GRrtodOmclU6DelBFbqlw7yCj0TFXZSZk3UmHPHG3I2E3il/7jWdqw0qsys85rUL/Ugs50RUcFn53avqUiAYSU+neXiLmHmshCLVpdbDiOxRjfFPVjTgLh88hDLwkcYL4Lrzc5My3glgiEjrSn43WxDdbOiGUyZz1TdJKNngq7OJK+SuA/FkMEA+pXoTIAwQ==
  
root@localhost.localdomain
  将生成的公司增加到git服务器上:
[root@test ~]# cat /data/git/.ssh/authorized_keys  
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwMU4FKB6NRc3XSoIunWsdvVVuSoncbVb5Al6lB3ciswBVd++YmJFhqwkITNGccrO5sycROs9+Fbjgd6oBSzNuaBtCIbwNNsEyM/henTl2euI3XsnJQ/ITr6c/q0P3WoGl4E2QFQ2kZqs+1eDC0CgHcBrqvFv1Jr414sVYK9lfZwIF+jDdtaBOrSJuq1Agx9pGUFUEB4tQfkXxsWm/MvOmKAVvduKDE1eenUEL9zzyeELPcSXLe3NOoTjZhkX6EEXxQR1ZiZRFywLpfM4qopZ10to2KIUyVtzw6hx6V3cg7kn40lYVW0EAMATw9dVldwcRUI+kJzJSKUTKDVSwY3/+Q== root@CHENMINGQIAN
  
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAx/ms/8BGBrG2FwHNySjFsVdpldArSzS6CkrdFeqJd0YAZfo/e2RwyZ9HkBqp3xcBZxCRdifnPbfSHdACLbVALfw2Dj6s0jJmdg3AHth13hF1qeljlQarXTTkheHNuFhi3OF/MVKZXJh0jRT2xU9UL4GRrtodOmclU6DelBFbqlw7yCj0TFXZSZk3UmHPHG3I2E3il/7jWdqw0qsys85rUL/Ugs50RUcFn53avqUiAYSU+neXiLmHmshCLVpdbDiOxRjfFPVjTgLh88hDLwkcYL4Lrzc5My3glgiEjrSn43WxDdbOiGUyZz1TdJKNngq7OJK+SuA/FkMEA+pXoTIAwQ== root@localhost.localdomain
  克隆远程版本库:
[root@localhost .ssh]# cd /data/  
[root@localhost data]# ls
  
lost+found
  
[root@localhost data]# git --version
  
git version 1.7.1
  
[root@localhost data]# git clone git@192.168.18.201:/data/git/project1.git
  
Initialized empty Git repository in /data/project1/.git/
  
Resolving deltas: 100% (4/4), done.
  
[root@localhost data]# ls
  
lost+found  project1
  
[root@localhost data]# cd project1/
  
[root@localhost project1]# ls
  
readme.txt
  我们现在查看一下分支:
[root@localhost project1]# git branch  

  
* master
  你同事要在dev分支上开发,就得创建与远程origin一样的dev分支到本地的仓库上,下面我们来创建一下:
[root@localhost project1]# git checkout -b dev origin/dev  
Branch dev set up to track remote branch dev from origin.
  
Switched to a new branch 'dev'
  
[root@localhost project1]# git branch  * dev  master
  
[root@localhost project1]#
  现在你同事就可以在dev分支上开发了,下面我们新建一些文件并提交到远程dev分支:
[root@localhost project1]# touch index.html  
[root@localhost project1]# vim index.html
  
This git test index.html!
  
[root@localhost project1]# git add index.html
  
[root@localhost project1]# git commit -m "add index.html"
  
[dev 6e47de0] add index.html
  
Committer: root
  
Your name and email address were configured automatically based  on your username and hostname.Please check that they are accurate.
  
[root@localhost project1]# git status
  
# On branch dev  # Your branch is ahead of 'origin/dev' by 1 commit.
  
#  nothing to commit (working directory clean)
  
[root@localhost project1]# git push origin dev
  
Counting objects: 4, done.  Delta compression using up to 4 threads.
  
Compressing objects: 100% (2/2), done.  Writing objects: 100% (3/3), 305 bytes, done.
  
Total 3 (delta 0), reused 0 (delta 0)  To git@192.168.18.201:/data/git/project1.git
  
58f4fae..6e47de0; dev –> dev
  你的同事向origin/dev分支提交了一个index.html页面,现在你也在修改这个文件,并提交:
DSC0007.png

  推送失败,因为你同事的最新提交和你推送的提交有冲突,
  Git提示我们,先用git pull把最新的提交从origin/dev抓下来,然后在本地合并解决冲突,再推送:
DSC0008.png

  git pull 失败了,原因是没有将dev分支与远程origin/dev分支进行链接,
  Git提示我们设置dev和origin/dev的链接:
DSC0009.png

  下面我们再来git pull一下试试:
DSC00010.png

  git pull 成功,
  但是合并有冲突需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后提再push:
DSC00011.png

DSC00012.png

DSC00013.png

  好了,这样的我们的远程推送与抓取就讲解完成了。
  10.总结
  一般在团队中多人开发模式是这样的:

  •   首先,可以试图用git push origin branch-name推送自己的修改
  •   如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
  •   如果合并有冲突,则解决冲突,并在本地提交
  •   没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功
  如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
  参考:http://freeloda.blog.51cto.com/2033581/1417525



运维网声明 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-589173-1-1.html 上篇帖子: 搭建远程Git仓库 下篇帖子: git标签管理详解,github使用详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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