Git 内幕

基础

对待数据的方式

几乎所有版本控制工具都是记录与初始文件的差异,而 Git 是记录快照,每次提交更新时,就是当前工作目录下的所有文件的完整数据,而不是差异,当然如果提交时,文件没有被修改,不再重新存储该文件,而是指向上次存储的文件。

假设提交了5次,对于工作目录的文件A,在第三和第五次提交时有修改

1
2
3
4
# 其他版本控制
A (v1) -------------->1 (v3) --------------->2 (v5)
# Git
A (v1) ---> A (v2) ---> A1 (v3) ---> A1 (v4) ---> A2 (v5)

Read More

搭建git服务器

目前 GitHub 作为代码托管库,拥有上百万的用户,已经成为了管理软件开发以及发现已有代码的首选方法。如今也有很多开源的软件可供我们搭建自己的git服务器用来托管自己或者团队的代码,如GitLab,Gitblit、GitStack、Gitolite。

简单起见,我选择Gitblit的Go分支来搭建自己的git服务器。由于gitblit需要java环境运行,所以应该先搭建好java运行环境。

Read More

Git学习笔记

配置

Git 配置文件 .gitconfig,系统配置位于/etc/gitconfig(Windows 该文件在Git安装目录下),全局配置位于用户目录下,项目配置位于仓库目录下。

1
2
3
git config --list # 显示当前的Git配置
git config user.name # 显示当前配置项的值
git config -e [--global|--system] # 编辑Git配置文件

配置别名

1
2
3
4
5
6
7
git config --global alias.ci "commit"
git config --global alias.co "chechout"
git config --global alias.st "status"
git config --global alias.br "branch"
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'

如果想要执行外部命令,而不是一个 Git 子命令,可以在命令前面加入 ! 符号。

忽略文件

如果是版本库级别的忽略用.gitignore;如果仅仅是个人的忽略用.git/info/exclude,不会将此设置传播出去

文件 .gitignore 的格式规范如下:

  1. 所有空行或者以 # 开头的行都会被 Git 忽略。
  2. 可以使用标准的 glob 模式匹配。
  3. 匹配模式可以以(/)开头防止递归。
  4. 匹配模式可以以(/)结尾指定目录。
  5. 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(*) 表示匹配任意中间目录,比如a/**/z 可以匹配 a/z, a/b/za/b/c/z等。

1
2
3
4
5
6
7
# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件,包括 subdir/build/
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/**/*.pdf # 忽略所有doc 目录下的 pdf文件