• 分布式版本控制


     

     

     

     

     

     

     

     

    简介:

        版本控制主要分为两种,集中式版本控制和分布式版本控制。CVS和SVN即使典型的集中式版本控制系统,而Git是目前世界上最先进的分布式版本控制系统。 

    集中式版本控制:

        集中式版本控制的仓库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。集中式版本控制系统最大的弊端就是必须联网才能工作。在局域网的情况下效率不错,但是通过外放访问的话,由于网络带宽和稳定性的因素将导致效率极低。

    分布式版本控制:

       分布式版本控制系统没有“中央服务器”的概念,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

       和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。

    Git基础

    简介:

        Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git最为出色的是它的合并跟踪(merge tracing)能力。

     安装

    简介:

        Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git最为出色的是它的合并跟踪(merge tracing)能力。

    Git bash

     Git BashGitwindows下的一个模拟终端接下来的Git的学习都将在此终端进行。双击桌面的Git Bash图       标,即可打开Git终端。

     

    添加用户信息

    因为Git是分布式版本控制系统,所以,每个机器都必须自报家门。你的名字和Email地址。在Git Bash中输入以下命令:

    1) $ git config --global user.name "名字"

          在Git的全局配置中添加一个用户名

    2)$ git config --global user.email "邮箱地址"

          在Git的全局配置中添加一个邮箱

     

    3可以使用git config --list查看全局的配置信息当中可以看到你所添加的用户名和邮箱信息

     

     

    创建本地版本库

    创建完用户信息之后,接下来我们就可以开始创建一个本地的版本库了。

    1)在任意一个磁盘中新建一个目录,例如:在D盘中创建一个文件夹叫mygit。

    2)在Git Bash中进入此文件夹。

    3)使用git init命令将mygit目录初始化一个空的本地版本库

    OK,这样我们就创建了一个本地版本库,只不过这个库的工作区中没有任何的内容,

    但是有一个隐藏文件夹“.git”。这个文件夹就是Git的版本库。

    (备注:在Git中是有版本库、工作区、暂存区这几个概念,这部分内容将在后面进行详细介绍)

    添加文件到版本库

    版本库有了,那么我们就可以向版本库中添加文件了。

    1) 在mygit目录中创建一个文本文件(例如hello.txt)并填写一些内容

    2)在Git Bash中使用命令git add hello.txt

    3)再使用命令git commit -m "提交说明" 提交到版本库中

    修改文件

    接下来对hello.txt文件进行修改,再添加一些内容。然后使用git status命令进行查看。git status命令可以让我们时刻关注仓库当前的状态。

    红色的部分告诉我们hello.txt的文件已经修改,但是还没有提交到仓库。

     

    还可以使用git diff命令查看修改前和修改后的内容。

     

    修改完后还是使用git addgit commit命令提交到本地版本库中。

     我们再次使用git status命令查看版本库当前的状态,这时你会发现刚才修改的内容已经提交到版本库中,没有任何可提交的内容了。

     

    工作区与版本库

    工作区Working Directory

    在之前创建的mygit目录,这个就是工作区。我们创建的任何文件都是存放在工作区中。

    版本库(Repository

    工作区有一个隐藏目录“.git”,这个就是Git的本地版本库。

    说明:

    Git的版本库里存了很多内容,其中最重要的就一个是暂存区(stage),还有Git为我们自动创建的第一个主分支master,以及指向master的一个指针叫HEAD(HEAD还可以指向其他的分支,就是切换分支)。

    我们把文件往Git版本库里添加的时候,是分两步执行的:

    第一步是用git add把文件添加进去,实际上就是把新建或修改的文件添加到暂存区。

    第二步是用git commit执行提交,实际上就是把暂存区的所有内容提交到当前master分支。

     

    版本回退

    1) 可以使用git log命令查看最近的提交日志列表,当初会有相应的版本号、用户信息、提交时间和提交说明等内容。

    说明:

    commit:提交的版本号

    Author:提交人信息

    Date:提交时间

    再后面的信息就是提交说明

     

    2)使用git reset 命令执行版本回退

    reset命令有三个参数,这三个参数将导致回退的内容将在不同的作用域中。

    --soft,这个参数表示在版本库中回退到旧的版本。而最新的版本内容会移到暂存区保存。($ git reset --soft HEAD^soft 绿色,(工作区有,版本库没有)暂存区还有,只需要commit)

    --mixed, 这个参数表示在版本库中进行版本回退,同时重置暂存区。(默认选项)

    ($ git reset --mixed HEAD^mixed 红色,(存在于工作区,版本库也没有)暂存区没有,并且要先add在commit)

     

    --hard,这个参数表示表示在版本库中进行版本回退,同时重置暂存区和工作区。

    例如:git reset --soft HEAD^  表示在版本库中回退到上一个版本

    ($ git reset --hard HEAD^hard (工作区、暂存区、和版本库都没有)清空所有)

    HEAD说明:

    1) HEAD表示回退到当前最新版本

    例如:git reset --mixed HEAD  (回退到当前最新的版本,并重置暂存区)

    2) HEAD^表示回退到上一个版本

    例如:git reset --mixed HEAD^  (回退到上一个版本,并重置暂存区)

    3) HEAD~2表示回退到上两个版本(其中2可以替换成其他数字,表示回退到第几个版本)

    例如:git reset --mixed HEAD~2  (回退到上两个版本,并重置暂存区)

    版本号说明:

    可以将HEAD替换成版本号,表示回退到指定的版本。版本号不一定需要全部输入,只需要输入前面几个字符即可。

    例如:git reset --mixed 版本号 (回退到指定版本,并将版本内容重置到暂存区)

     

    3)使用git reset <filename>命令撤销暂存区的操作

    例如:git reset hello.txt

     

    删除文件和文件夹

    1) 使用git rm filename命令删除工作区中的文件

    例如:git rm hello.txt

     

    注意:删除之后,记得要将此操作commit到版本库中,因为此时删除的动作还只是在暂存区中,并未同步到版本库。

     

    2) 使用git rm 目录名 -r -f 删除文件夹及其下所有的文件

    例如:git rm demo -r -f

     

     

    注意执行完同样需要commit到版本库中

    本地分支

    1)分支的作用

    分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的主分支上,这样,既安全,又不影响别人工作。

     

    2) 分支的概念

    每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

    每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

    当我们创建新的分支例如devGit新建了一个指针叫dev指向master相同的提交再把HEAD指向dev就表示当前分支在dev

     

    从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

     

     假如我们在dev上的工作完成了就可以把dev合并到master上。Git怎么合并呢最简单的方法就是直接把master指向dev的当前提交就完成了合并

    合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

    3) 分支的使用

        1. 创建分支: git branch 分支名

    例如:git branch dev

    2.  切换分支: git checkout 分支名

    例如:  git checkout dev

    说明:也可以使用 git branch dev -b 一次1和2的两步操作(创建并切换分支)

        3. 查看分支: git branch

    说明:*号表标识前正在操作的分支   

        4. 合并分支:git merge 分支名

    例如:git meger dev

    我们先切换到master分之下,然后合并dev分支的内容

    这样,我们就把dev分支的内容合并到了master分支上

         5. 删除分支:git branch -d 分支名

    例如:git branch -d dev

     

    版本冲突

    在合并分支时,并不一定都成功。这是因为当两个分支都做了修改并且都提交到了版本库中,这样在合并的时候可能就会产生版本冲突。

    场景案例:

    1) 在master主分支中对A文件进行修改并提交

    2切换到dev分支也对A文件进行内容修改并提交

    3切换回master分支合并dev分支的内容,这是就产生版本冲突,合并失败

    原因分析:

    因为master分支和dev分支各自都分别有新的提交。这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就导致了冲突的原因。

    解决办法:

    我们查看文件内容,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。

    因此我们手动将内容修改合并后再进行提交以解决此问题。

     内容比较

    git diff 用于比较内容的差别。

    比较规则:

    先比较暂存区内容,如果暂存区为空时则比较当前版本库中HEAD所指向的分支内容。

     

    1)比较当前的工作区和当前分支的内容差别

    例如:git diff

     

    说明:git diff 默认是比较所有文件的内容。也可以指定文件名,用于比较当前文件的内容。例如git diff hello.txt

    2) 比较当前的工作区和指定分支的内容差别

    例如: git diff 分支名

    说明:同样可以指定具体某个文件进行内容比。例如git diff dev hello.txt

     

    3) 比较两个分支之间的内容差别

    例如:git diff 分支名..分支名

    说明:同样可以指定具体某个文件进行内容比。例如git diff master..dev hello.txt

    4) 比较当前工作区与当前分支上一个版本的内容

    例如:git diff HEAD^

    说明:还可以比较上n个版的内容。例如:git diff HEAD~2 (比较上两个版本的内容)。

     并且可以指定文件名,比较个某个文件内容。例如:git diff HEAD~2 hello.txt

     

    5) 比较当前工作区与指定分支上一个版本的内容

    说明:也可以比较上n个版的内容和比较个指定文件的内容。同上

    保存工作状态

    有这样一种情况,例如你在主分支master下进行一些代码的内容修改,突然由于紧急突发原因不得不让你立马切换至dev分之下进行一些bug修复。但是当你要切换到dev分支时,不得不先提交master下的内容,否则无法进行切换。如下图:

    这时,可以利用git来帮我们先保存master分之下的工作状态,然后就可以安心切换到dev分之下进行工作,等完成之后再切换回master分支,然后再恢复回之前的工作状态继续工作。

    这个命令就是 git stash

    1)保存当前工作状态: git stash

    保存后,就可以切换到其他分支

    在其他分支工作完后再切换回master分支。

    2查看保存的工作状态列表git stash list

    说明{0}是保存的状态号

    3)恢复状态:git stash pop stash@{状态号}

    例如:git stash pop stash@{0}

    这样,就成功恢复到之前保存的状态中。

     

    标签管理

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

    Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针,所以,创建和删除标签都是瞬间完成的。

    标签的好处:

    当我们要对某个版本进行打包发布时,要找到对应的版本号(也就是commit ID),但是

    版本号是一串并不好记的字符串。如:63c4b0c15f897ab4b1c50519f2946af7c5545e8e

    这样的字符串,这时标签就非常有用了。因为标签是一个很容易记的名字,一个标签跟一个版本号是绑定在一起的,所以只要根据标签查找版本号就可以了。

     

    1)创建标签:git tag 标签名

    例如:git tag v1.0

    说明:默认标签是打在最新提交的版本号上的,也可以打在指定的版本号上。例如:

    git tag v1.0 63c4b0c (只要写上版本号的前几位即可)

     

    2)查看所有标签:git tag

    3)根据标签查看版本内容:git show 标签名

    例如:git show v1.0

    4)删除标签:git tag -d 标签名

    例如:git tag -d v1.0

     

  • 相关阅读:
    java 反射
    java 面试题
    Java构造和解析Json数据的两种方法详解一
    JAVA UUID 生成
    tomcat 插件
    webstorm 激活码
    maven环境搭建
    svn 安装网站
    2015.6.30 反弹的教训(想做T)
    2015.6.15 惨跌开始的反思
  • 原文地址:https://www.cnblogs.com/BruningHUA/p/6224989.html
Copyright © 2020-2023  润新知