zoukankan      html  css  js  c++  java
  • 分布式版本控制系统

    一、Git、Github、Gitlab 的区别
    Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。
    是Linus Tovalds 为了帮助管理Linux内核开发的一个开放源码的版本控制软件。
    Github是在线的基于Git的代码托管服务,Github是2008年由Ruby on Rails编写而成。Github同时提供付费账户和免费账户。这两种账户都可以常见公开的代码仓库,只有付费账户可以创建私有代码仓库。Github解决了这个问题,可以在上面创建免费的私人repo。
    二、Git 与 SVN 区别
    Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
    如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。
    GIT 与 SVN 区别
    1. GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
    2. GIT把内容按元数据方式存储,而SVN是按文件:所有的资源版本控制系统都是把文件的元信息隐藏在一个类似svn.cvs等的文件夹里。
    3. GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外一个目录。
    4. GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
    5. GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低版本库的破坏。
    三、部署 Git 服务
    准备两台虚拟机 centos7.x
    192.168.1.120 git-server
    192.168.1.121 git-client
     
    git-server 的操作
    yum install git git-core gitweb -y
    useradd git
    passwd git
    mkdir /git-root/
    cd /git-root/
    
    git init --bare shell.git           #初始化操作,其实就是创建了一个库
    git init 与 git init --bare 的区别 …… ……
    #授权
    cd shell.git
    chown -R git:git /git-root/shell.git
    #切换用户
    su - git
    ssh-keygen -t rsa
    cd .ssh/
    cp id_rsa.pub authorized_keys
    vim authorized_keys
    logout
    usermod -s /usr/bin/git-shell git
     
    git仓库测试
    git-client 的操作
    [git@localhost ~]# yum install git -y
    [git@localhost ~]# ssh-keygen
    [git@localhost ~]# ssh-copy-id git@192.168.1.120
    [git@localhost ~]# git clone git@192.168.1.120:/git-root/shell.git    #克隆
    [git@localhost ~]# ls
    rh shell
    [git@localhost ~]# cd shell
    [git@localhost shell~]# vim test.sh
    [git@localhost shell~]# git add test.sh
    [git@localhost shell~]# git config --global user.name "administrator"
    [git@localhost shell~]# git config --global user.email admin@example.com
    [git@localhost shell~]# git push -u origin master
    [git@localhost ~]# git clone git@192.168.1.120:/git-root/shell.git  
    四、 Git 工作流程
    一般工作流程如下:
    • 克隆 Git 资源作为工作目录。
    • 在克隆的资源上添加或修改文件。
    • 如果其他人修改了,你可以更新资源。
    • 在提交前查看修改。
    • 提交修改。
    • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
    Git的工作流程示意图:
    五、 Git 基本概念
    • 工作区:就是你在电脑里能看到的目录。
    • 暂存区:英文名叫stage或index.一般存放在git目录下index文件(.git/index)中,所以我们把暂存区有时也叫做索引(idenx)。
    • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
    工作区、版本库中的暂存区和版本库之间的关系的示意图:
     
    • 图中左侧为工作区、右侧为版本库。在版本库中标记为"index"的区域是暂存区(stage,index),标记为"master"分支所代表的目录树。
    • 图中可以看出此时对"HEAD"实际是指向 master 分支的一个"游标",所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
    • 图中的 objects 标识的区域为Git的对象库,实际位于".git/objects"目录下,里面包含了创建的各种对象及内容。
    • 当对工作区修改(或新增)的文件执行"git add" 命令时,暂存区的目录树被更新,同时工作区修改(或更新)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
    • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master分支会做对应的更新,即 master 指向的目录树就是提交暂存区的目录树。
    • 当执行"git reset HEAD"命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
    • 当执行"git rm --cached <file>"命令时,会直接从暂存区删除文件,工作区则不做出改变。
    • 当执行"git checkout"或者"git checkout --<file>"命令时,会用暂存区全部或指定文件替换工作区的文件,这个操作很危险,会清除工作区中未添加到暂存区的改动
    六、Git 客户端安装使用
    1、Git 安装配置
    yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
    yum install -y git git-all git-core
    git --version
    2、Git 配置
    Git 提供了一个叫做git config 的工具,专门用来配置或读取相应的工作环境变量。
    这些环境变量,决定了Git在各个环节的具体工作方式和行为,这些变量可以存放在以下三个不同的地方:
    • /etc/gitconfig 文件:系统中对所有用户都普通适用的配置。若使用 git config 时用--system 选项,读写的就是这个文件。
    • -/.gitconfig 文件: 用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
    • 当前项目的 Git 目录中的配置文件(也就是工作目录中 .git/config 文件):这里的配置仅仅针对当前项目有效,每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
    2.1、git 用户信息
      配置个人的用户名称和电子邮件地址:(可自定义名称)
    git config --global user.name "administrator"
    git config --global user.email admin@example.com
      如果使用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所以的项目都会默认使用这个配置的用户信息。
      如果要在某个特定的项目中使用其他名称或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config文件里。
    2.2、文本编辑器
      设置Git默认使用的文本编辑器,一般可能会是vi或者vim,如果你有其他偏好,比如Emacs的花,可以重新设置
    git config --global core.editor emacs
    2.3、差异分析工具
      还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具,比如要改为vimdiff的话:
    git config --global merge.tool vimdiff
    可以理解kdiff3,tkdiff,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和opendiff等合并工作的输出的信息。
    当然,你也可以指定使用自己开发的工具。
    2.4、检查配置信息
      要检查已有的配置信息,可以使用git config --list命令:
    git config --list
    有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如/etc/gitconfig和~/.gitconfig),不过最终 Git 实际采用的是最后一个。

    [root@localhost .git]# git config user.name  
    administrator 
    [root@localhost .git]# git config user.name fdd  更改用户名
    fdd
    3、Git 使用
    3.1、ssh 链接
      客户机上上传公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都没问题,这种方式很安全
    3.2、http 链接(两种方式实现)
    1.修改代码里 .git/config文件添加登录用户名密码
     
    2.执行命令设置登录用户和密码
     
    3.设置身份验证
    注意:设定本机用户名,绑定邮箱,让远超服务器知道机器的身份
    git config --global user.name "user_name"
    git config --global user.email "xxxxx.com"
    4.本地项目与远程服务器项目之间的交互
    • 如果你没有最新的代码,希望从头开始
    git clone git@xxx.git         #这里是项目的地址(可从项目主页复制),将远程服务器的内容完全复制过来
    cd BCBInspector_vo1           # colne 之后进入该项目的文件夹
    touch README.md               #新建readme文件
    git add README.md             #将新建的文件添加到git的暂存区
    git commit -m "Its note: add a readmo file"    #将暂存区的文件提交到某一个版本保存下来,并加上注释
    git push -u origin  master    #将本地的更改提交到远程服务器
    • 如果你已经有一个新版代码,希望直接本地的代码替换到远程服务器
    cd existing_folder             #进入代码存在的文件夹,或者直接在该文件夹打开
    git bash git init              #初始化
    git remote add origin git@xxx.git        #添加远程项目地址(可从项目主页复制)
    git add .                      #添加该文件夹中所有的文件到git的暂存区
    git commit -m "note"           #提交所有代码到本机的版本库
    git push -u origin master      #将本地的更改提交到远程服务器
    • git 中 clone过来的时候,git不会对本地和服务器的文件,也就不会有冲突。
    • 建议确定完全覆盖本地的时候用clone,不确定会不会有冲突的时候用git pull,将远程服务器的代码download下来
    5、常用的 Git 命令
    git init               #初始化
    git add main.cpp       #将某一个文件添加到暂存区
    git add .              #将文件夹下的所有的文件添加到暂存区
    git commit -m 'note'   #将暂存区中的文件保存成为某一个版本
    git log                #查看所有的版本日志
    git status             #查看现在暂存区的状况
    git diff               #查看现在文件与上一个提交-commit版本的区别
    git reset --hard HEAD      #回到上一个版本
    git reset --hard xxxxx    #xxx为版本编号,回到某一个版本
    git pull origin master    #从主分支pull到本地
    git push -u origin master     #从本地push到主分支
    git pull                  #pull默认主分支
    git push                  #push默认主分支 ……
    6、版本穿梭
    6.1、版本回退
    #用 git log 命令查看:
    #每一个提交的版本都唯一对应一个 commit 版本号
    #使用 git reset 命令退到上一个版本
    git reset --hard HEAD^
    
    git reflig           #查看命令历史,一遍确定回到那个版本
    git reset --hrad commit_id     #比如 git reset --hard 3628164 (怒用全部输入,输入前几位即可)
    6.2、分支管理
    创建分支
    git checkout -b dev                #创建dev分支,然后切换到dev分支
    git checkout                       #命令加上-b 参数表示创建并切换。
    相当于以下两条命令:
    git branch dev git checkout dev
    git branch                         #命令查看当前分支
    git branch                         #命令会列出所有分支,当前分支前面会标一个*号
    git branch * dev  master
    git add readme.txt git commit -m 'branch test'     #在dev分支上正常提交

    分支切换

    git checkout master        #切换回 master分支
    git merge dev #把dev分支的工作成果合并到master分支上 git merge #命令用于合并指定分支到当权分支。 #合并后,再查看readme.txt的内容,就可以看到,和dev分支的罪行提交是完全一样的。 git branch -d dev #删除dev分支

  • 相关阅读:
    第一章——第二节 启动模式
    Android 展示键盘时候布局被修改的问题
    JAVA混型和潜在类型机制
    第一章——Activity的生命周期
    android 程序中禁止屏幕旋转和重启Activity
    项目知识—九
    项目知识——八
    项目知识——七
    Drawable复习—第六章
    项目知识(六)
  • 原文地址:https://www.cnblogs.com/fengyuanfei/p/14473010.html
Copyright © 2011-2022 走看看