git入门-----初步认识

来源:互联网 发布:java 国家精品课程 编辑:程序博客网 时间:2024/05/18 11:27
     由于工作的变换,开始接触git,所以把git进行了初步的学习和整理。此系列的内容基本都是来自网络上各个网友的经验
总结和分享,个人也仅仅用于学习习记录,方便日后查看,如有侵权望告知。
1、版本控制和git。
      上一个工作用的是svn,自己也没有系统的学习过,就直接熟悉常用命令开始上手工作,虽然也不耽误什么,但这种学
习工作方式显然是不可取的,一点系统的知识都没有,也不了解一点点的原理只会用。此处就先系统的记录自己学习git的
过程,先从入门了解和常用命令学起。
     版本控制系统VCS(version control system),是一种记录若干文件变化,以便将来查阅特定版本修改记录的系统。对
于编程开发人员来说,我们常使用版本控制系统来对程序源代码进行版本管理。但实际上,我们可以对任何类型的文件进
行版本控制。个人通俗的说,就是记录你所有的提交修改,在你需要的时候可以找到你的修改进行一系列的如回退、重写
修改等等的操作。
     版本控制系统根据实现方式又分为如下三种:
    本地版本控制系统 :采用某种简单的本地数据库来记录文件的历次更新差异。
 
    集中式版本控制系统:有一个统一的集中管理的版本控制管理服务器,保存所有文件的修改版本,而协同工作的人们都
                                         通过客户端连接到这台服务器,然后进行文件的获取或者修改完后的提交。
 
    分布式版本控制系统:每个客户端不仅仅可以把需要的代码下载下来,还会把代码仓库完整的提取下来。

     Git就是一种分布式的版本控制系统。 
     此处一开始就不理解什么叫把代码仓库下载下来?和下载下来代码什么区别?说说我学了这些入门知识的感觉,对于svn
这种集中式的版本控制,它们就是把代码下载到了本地,而对代码仓库没有下载下来,仓库顾名思义就是对代码进行管理
和控制的地方,通过仓库你可以把本地代码的修改提交到仓库里用来记录,也可以从仓库里面进行恢复某些提交,查看提
交历史等等的操作。而svn由于本地没有代码仓库所以只能联网向服务器中的代码仓库进行提交。而对于Git这种分布式的
会拷贝下来代码仓库,那么就可以实现本地的提交、修改、查询历史记录等等的操作,那么如何在本地怎么实现同步那?别
担心等你需要的时候你把你的修改push到服务器端,这样就完成了同步。
      还有一点其实分布式版本控制系统没有服务器和客户端之分的,因为拷贝的时候是拷贝的完整的代码仓库,谁都可以进
版本管理。从上图也可以看出,客户端A、B也可以需向推送更新,甚至服务器也可以从A、B上推送更新。那么这个
图中的服务器又是怎么回事那?其实这是我们人为规定的,比如大家一块协同改某个项目的代码,总的有一个人或者说一
个客户端来充当服务器,大家都用它的的代码来更新,当做完自己的工作的时候统一的都提交到它的版本库中。这样就把
它看做了我们的服务器,来完成规范。

2、git的基本概念。
     git由三部分组成:工作区、暂存区和版本库。
     工作区:就是你在电脑里能看到的本地目录。
     暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作
                   索引(index)。
     版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。版本库中的文件都会由 Git 进行管理,当我
                    们对文件进行修改、删除、Git 都可以对其进行跟踪。通过git commit命令来加入到版本库。
    简单的说下几个重要的文件或目录.   

    config:存放的是git的配置的一些参数设置。比如你的邮箱、用户名等,调用git config ... 会操纵这里。
    objects: 目录存放的是实际的文件,当git add命令执行的时候,文件已经被存到了objects目录下。再执行commit的时
                     候还往这个目录下生成文件.这些对象主要是commit对象和tree对象(目录树)(感觉就是存放所有的对象)
     index :  是一个索引文件。存放的是暂存区的整个目录树的信息,并且为目录树中的每个文件都保存了时间戳和长度.当
                  git add 将某个文件添加到暂存区的时候(注意添加进去的时间节点,你只是改工作区的目录是不会有任何变化
                  的),index文件中添加了这个文件的基本信息。
     HEAD:保存了当前的分支(branch)的信息,然后间接指向当前所在分支的最新提交。如:ref: refs/heads/master 代表当
                  前处于master的分之下.
      refs: 称为引用目录.  引用就是一个文件,里面包含了一个commit id。
                .git/refs/heads目录下保存的是本地分支引用,比如./git/refs/heads/master文件就是master分支的引用。
                 .git/refs/tags目录保存了tag引用。
                 应该还可以有各个远程分支的引用目录,因为看到了一个remotes?
     网络上的非常好图:

       基本的Git工作流程:  
             1)、在本地的工作区修改某些文件。
             2)、然后对修改后的文件进行快照,保存到暂存区域,也就是add。
             3)、提交更新,将保存在暂存区域中的文件快照commit到Git的版本库的对应分支中,上图是master分支。
             4)、最后把本地的版本库中的内容更新推送到远程的大家共用的版本库当中。

       关于git管理下的文件状态:
            从大的方面来看分为:未跟踪(Untracked)和已跟踪(Tracked)。新建的文件未调用add就处于未跟踪状态。而在
       Tracked状态下又可分为好几种:大体上来说有如下三种阶段时的状态:
                 已修改(modified) 表示修改了某个文件,但还没有提交保存;
                已暂存(staged) 表示把已修改的文件放在下次提交时要保存的清单中了;
                已提交(committed) 表示该文件已经被安全的保存在本地数据库中了;
        其实不止这几种比如有new、delete等等的状态。 最终就是对应到三个工作区域:工作区、缓存区、版本库之间来回
        的跳转。

3、git和svn的区别。
      主要的区别:
             1)、GIT是分布式版本控制,SVN集中式版本控制。
             就如我们上面所描述的分布式和集中式。分布式有两个很重要的特点:a、任何时候都可以提交自己的修改来生成
      一次提交记录,在需要的时候如有网络的时候再进行统一的push。此时可能有的人就说svn也可以啊,虽然没网络的时
      候不能提交但是也可以继续修改,等有网再提交这不一样吗?其实很不一样的,比如你改的大的Bug或者需求,需要如
     一两周的时间,这期间这个Bug你会有好几个阶段性的工作,用git的时候你就可以每个阶段都提交,到时候统一push而
     svn你只能等联网的时候统一提交。这时候假如你发现前面某个想法是不对的,你需要再手动的小心翼翼的revert掉相
     关的修改,而git直接回退到那个版本即可。在较复杂的情况下,这个是很好用的。b、没有所谓的中央服务器,这样不
     会出现中央服务器挂掉的时候大家都无法工作,甚至丢失资料。git当中央服务器出现问题的时候,你可以从别的地方拷
     贝数据仓库,还可继续进行提交等操作。
           2)、分支实现的不同。对于此处的内容理解git多的分支很重要,所以后面要单独整理。
           3)、其它的一些不同参考:http://www.jianshu.com/p/bfec042349ca 。
   另外:svn 还是 git 的工作流,都是在本地解决冲突再提交。所有的版本管理系统一样,他们让你手动的修改冲突,因为
              毕竟无法知道产生冲突时候你到底想要那一块的代码去掉那一块的代码。
    svn工作流程:在本地已有远程代码的情况下。
           1、写代码,修改Bug。
           2、从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突。
           3、将本地代码提交到服务器。
     git工作流程:在本地已有远程代码仓库的情况下。
           1、写代码,修改Bug。
           2、提交到本地版本库。
           3、从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突。
           4、将远程库与本地代码合并结果提交到本地版本库。
           5、将本地版本库推到服务器。
0 0