Git 学习

参考书目:Pro Git, by Scott Chacon, Ben Straub

Git 是什么?

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

  • 基于差异的版本控制
  • Git 基于快照流的方式存储数据:
    • 每当提交更新或保存项目状态时,基本就会对当时全部文件创建一个快照并保存这个快照索引;
    • 为了效率,没有修改的文件,Git 不再重新存储该文件,而是保留一个链接指向之前存储的文件。

本地执行

Git 保证完整性

采用校验和机制,数据存储前先做检验和。计算校验和的机制叫做 SHA-1 散列。基于文件的内容或目录结构计算出来,是一个由 40 个十六进制字符组成的字符串。

Git 一般只添加数据

三种状态

  • 已提交 committed:表示数据已经安全地保存在本地数据库中。
  • 已修改 modified: 表示修改了文件,但还没保存到数据库中。
  • 已暂存 staged:表示对一个修改文件的当前版本做了标记,使之包含在下次提交的快照中。

初次运行 Git 前的配置

每台计算机上只需要配置一次,程序升级时会保留配置信息。可以再任何时候再次通过命令来修改它们。

Git自带一个git config的工具来帮助设置控制 Git 外观和行为的配置变量。这些变量存储在三个不同的位置:

  • /etc/gitconfig文件:包含系统上每一个用户及他们仓库的配置的通用配置。如果执行git config时带上 --system选项,那么它就会读写该文件的配置变量。
  • ~/.gitconfig~/.config/git/config 文件:只针对当前用户。 你可以传递 --global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。
  • 当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 你可以传递 –local 选 项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选 项生效。)

每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。

以下命令可以查看所有的配置以及它们所在的文件:

git config --list --show-origin

用户信息

安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使 用这些信息,它们会写入到你的每一次提交中,不可更改:

$ git config --global user.name "John Doe" 
$ git config --global user.email johndoe@example.com 

再次强调,如果使用了 –global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事 情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运 行没有 –global 选项的命令来配置。

Git 基础

git status -s:

??: 表示未跟踪,即没有git add进来

MM: 第一栏表示暂存区被文件被修改,右边指明了工作区的状态被修改。

git diff志现实尚未暂存的改动。

撤销操作

有时候提交完了发现漏掉几个文件没有添加,或者提交信息写错了。此时,可以运行带有 --amend选项的提交命令来重新提交:

git commit --amend

这个命令会将暂存区的文件提交。如果自上次提交依赖你未做任何修改,那么快照会保持不变,而你所修改的只是提交信息。

例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

$ git commit -m 'initial commit' 
$ git add forgotten_file 
$ git commit --amend 

最终你只会有一个提交——第二次提交将代替第一次提交的结果。

取消暂存的文件

使用 git reset HEAD <file> 来取消暂存。

撤销对文件的修改

如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办? 你该如何方便地撤消修改——将它还原成上次提 交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)? 幸运的是,git status 也告诉了 你应该如何做。 在最后一个例子中,未暂存区域是这样:

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 项目上协作,你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中 的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及 管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓 库、管理不同的远程分支并定义它们是否被跟踪等等。 在本节中,我们将介绍一部分远程管理的技能。

查看远程仓库

git remote命令,查看已经配置的远程仓库服务器。

git remote -v 会显示远程仓库的URL。

添加远程仓库

git remote add >shortname> <url>

拉取某个仓库

git fetch <remote>

推送到远程仓库

git push origin master

Git 分支

有人把 Git 的分支模型称为它的“必杀技特性”,也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出。 为何 Git 的分支模型如此出众呢? Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能 在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。 理解和精通这一特性,你便会意识到 Git 是如此的强大 而又独特,并且从此真正改变你的开发方式。