#1 神马是Git

Git是一种分布式版本控制系统(Distributed Version Control System,DMCS).在这类系统中,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这样,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

distributed

我们可以指定远端代码仓库进行交互。比如Github、Gitlab。

#2 Basic

几个特点:

  • 直接记录快照,而非差异比较

    Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流

    snapshots

  • 近乎所有操作都在本地执行

  • 保证完整性

        Git 中所有数据在存储前都计算校验和,然后以校验和来引用。
    
        Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。
    
        Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
    

!!! 三种状态

Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。

areas

基本的Git工作流程如下:

  1. 在工作目录中修改文件
  2. 暂存文件,将文件的快照放入暂存区域
  3. 提交更新,找到暂存区域的文件,将快照永久性的存储到Git仓库

Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。

如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

#3 通过命令行使用Git

配置

//配置用户信息
$ git config --global user.name "Gui"
$ git config --global user.email gengguitong@xiaomi.com
//检查配置
$ git config --list

获取Git仓库(repository)

  • 现有目录初始化

    $ git init
    
  • 克隆已有的仓库

    $ git clone http://git.n.xiaomi.com/liyunfan/webapp.git
    //支持多种数据传输协议
    

检查当前文件状态

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

文件的状态变化:

lifecycle

跟踪新文件

$ git add README
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

暂存已修改文件

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

要暂存这次更新,需要运行 git add 命令。 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。

$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   CONTRIBUTING.md

此时更新已等待提交到仓库。

如果此时我们又修改了该文件,需要再次使git add命令将更新暂存。否则,提交的将是上一个修改后的版本。

查看已暂存和未暂存的修改

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

如果修改了README和CONTRIBUTING.md文件,并且只暂存了README文件。

查看尚未暂存的文件做了哪些修改:

$ git diff
//已修改的文件同暂存区中的文件比较

查看已暂存的文件做了哪些修改:

$ git diff --staged
//暂存区的文件同仓库中的文件比较

提交更新

$ git commit -m 'update'

跳过使用暂存区域

$ git commit -a

Git会把所已经跟踪的文件暂存起来并提交。跳过了git add步骤。

移除文件

$ git rm //取消跟踪,并删除工作目录中的文件
$ git rm --cached //取消跟踪,保留工作目录中的文件

移动文件

$ git mv file_from file_to

#4 回到过去

查看提交历史

$ git log
选项:

-p :显示每次提交的内容差异,也可以加上-2显示近两次的提交。

--stat:显示每次提交的简略的统计信息。

--pretty: 自定义显示内容及格式。—> 参考链接

撤销操作

  • 重新提交

    $ git commit --amend
    
  • 取消暂存的文件

      $ git reset HEAD <file>
    
  • 撤销对文件的修改

      $ git checkout -- <file>
    
  • 版本回滚

    $ git reset –hard head^ $ git redet –hard

#5 远程仓库

远程仓库就是托管在因特网或其它网络中你的项目的版本库。

查看远程仓库

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

查看更多信息:

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

添加/移除/重命名远程仓库

$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)
$ git fetch pb
//...
$ git remote rename pb paul
$ git remote rm paul

从远程仓库中抓取与拉取

$ git fetch [remote-name]
//访问远程仓库,拉取所有你没有的数据,并不会自动合并
$ git pull 
//自动抓取然后合并

推送到远程仓库

$ git push [remote-name] [branch-name]

当有其它人先于你提交时,必须先将他们的版本拉取下来合并后才能推送。

#6 Github Flow

  1. Create a branch
  2. Add commits
  3. Open a Pull Request
  4. Discuss and review your code
  5. Deploy
  6. Merge

Github Flow

#7 Git分支

敬请期待…

2016.09.04