一、分布式版本管理系统

git是分布式版本管理系统,如图1中所示,我们可以把git分为服务器端和客户端两个部分。客户端把文件从服务器端全部镜像到本地,进行操作后,把修改文件提交到服务器端。

因为客户端本地有自己的版本数据库,不再受server端限制,多数操作在本地进行。因此,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜 像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。

分布式版本控制系统

图1: 分布式版本控制系统

二、非差异比较,直接文件快照

相较于集中版本管理系统关心文件内容的差异,git更关心文件整体是否发生变化。git像一个微型文件系统,git 不保存文件前后变化的差异数据。Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。

Git 保存每次更新时的文件快照

图2: Git 保存每次更新时的文件快照

三、近乎所有操作都是本地执行

在 git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用 CVCS 的话,差不多所有操作都需要连接网络。因为 git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。 举个例子,如果要浏览项目的历史更新摘要,git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月 前的版本之间有何差异,git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。 用 git 就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库。

1.git本地分区

git有三个工作区

  • 工作区:A Working Directory: where you’ll be doing all the work: creating, editing, deleting and organizing files

      工作区可以理解为“创作区“,在工作区可以编辑(新建、删除、修改)文件
    
  • 缓存区(索引区):A Staging Area: where you’ll list changes you make to the working directory

      缓存区可以理解为”变更记录区“,在工作区做了修改的文件,想要提交到仓库去,可能还有其他想法(想要攒一些文件一起提交/可能还要回退),提交到缓存区,记录下已经变更的文件
          
      所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。
    
  • 本地仓库:A Repository: where Git permanently stores those changes as different versions of the project

      文件被提交到本地仓库就会被记录到版本数据库中     
    

Git 工作区

图3:工作目录,暂存区域,以及本地仓库

2.git基本命令

  • git init 在当前目录创建一个新的git本地仓库
  • git status 查看git project状态

      一个Git项目中文件的状态大概分成下面的两大类,而第二大类又分为三小类:
    
      1.未被跟踪的文件(untracked file)
    
      2.已被跟踪的文件(tracked file)
    
      - 2.1.被修改但未被暂存的文件(changed but not updated或modified)
      - 2.2.已暂存可以被提交的文件(changes to be committed 或staged)
      - 2.3.自上次提交以来,未修改的文件(clean 或 unmodified)
    
  • git add “filename” 添加文件

      把file添加到git的staging area
          
      git add 后面可以跟多个filename 即:可以同时提交多个文件到staging area
    
  • git diff “filename”

      把working directory文件和staging area文件进行diff操作
    
  • git commit

提交缓冲区的文件到仓库,-m参数后跟该次commit描述

  • git log

查看commit的日志 SHA 作者 日期 commit描述

  • git show HEAD

        输出结果为所有commit信息
        这个展示的结果比git log详细一些
    

3.git的回滚

  • git checkout HEAD filename

        当修改了工作区的某文件后,想回退至上次commit的状态
    
  • git reset HEAD filename

        将file同步为repository 最后一次提交的版本 staging area区域的文件
        也就是说当我不小心修改了工作区的文件,并且 add到staging area后,想要回滚
    
  • git reset SHA

        This command works by using the first 7 characters of the SHA of a previous commit.
        恢复的还是缓存区的数据
        回滚到前一个版本
    

4.branch

  • git branch 查询当前在哪个分支

  • git branch NewBranchName 创建一个新的branch

  • git checkout branch_name 切换git的分支

  • git merge branch_name

          进行合并工作是将分支的changes合并至master
          切换到master才能进行merge
    
  • git branch -d branch_name

     	我们创建branch有了结果后,最终会合并到master中,那么branch就可以删除了,我们使用-d option进行删除
    

5.多人协同使用git

  • git clone remote_location clone_name

  • git remote -V 查询远程仓库的版本

  • git fetch 将更新放在remote branch

    	git pull = git fetch + merge to local
    
  • git merge origin/master 将更新merge到本地

  • git push origin your_branch_name