Git

git是目前世界上最先进的分布式版本控制系统。
本文记录git相关知识点,及使用git过程中遇到的问题。

参考书目

内功(基础)

关于版本控制

  • 本地版本控制系统(例如:rcs)
  • 集中化的版本控制系统(例如:svn)
  • 分布式版本控制系统(例如:git)

git的最初目标

  • 速度
  • 简单的设计
  • 对非线性开发模式的强力支持(允许上千个并行开发的分支)
  • 完全分布式
  • 有能力高效管理类似Linux内核一样的超大规模项目(速度和数据量)

自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。

Git基础

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

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

时刻保持数据完整性

多数操作仅添加数据

文件的状态

工作目录下的文件的状态分为: 已跟踪未跟踪

已跟踪状态下,又分为3种状态:

  • 已提交
  • 已修改
  • 已暂存

Git管理项目时,文件流转的三个工作区域:Git的工作目录,暂存区域,以及本地仓库。

工作区和暂存区的概念

工作区

工作区就是git仓库所在的目录(文件系统里的一个目录)

版本库(Repository)

工作区里有个隐藏目录(即.git)就是版本库。 Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD.

配置

配置用户名和邮箱

git config --global user.name "your name"
git config --global user.email "your email"

配置文本编辑器

Git需要你输入一些额外消息的时候,会自动调用一个外部文本编辑器给你用。

git config --global core.editor vi

差异分析工具

还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

git config --global merge.tool vimdiff

Git可以理解kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和opendiff等合并工具的输出信息。

查看配置信息

要检查已有的配置信息:

git config --list

直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样:

git config user.name

获取帮助

方法有三:

git help <verb>
git <verb> --help
man git-<verb>

外功(具体操作方法)

获取项目的git仓库

创建新的版本库

通过git init命令把当前目录变成Git可以管理的仓库。

从现有仓库克隆

git clone <url> [local_dir]

例如: git clone git://github.com/schacon/grit.git git clone git://github.com/schacon/grit.git my/grit

查看仓库状态

git status命令会显示仓库当前的状态。

忽略某些文件

使用.gitignore文件可以指定让git忽略的文件。
.gitignore的文件格式:

  • 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指shell所使用的简化了的正则表达式。

  • 星号(*)匹配零个或多个任意字符;
  • [abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个a,要么匹配一个b,要么匹配一个c);
  • 问号(?)只匹配一个任意字符;
  • 如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有0到 9的数字)。

提交代码

将指定文件修改添加到暂存区

git add

删除指定文件,并将删除记录到暂存区

git rm

  • --cached选项指定只需要从暂存区删除该文件,而文件仍然保存在当前工作目录中。

移动文件,并将移动记录到缓存区中

git mv

git mv file_from file_to相当于以下语句组合:

mv file_from file_to
git rm file_from
git add file_to

将暂存区的所有内容提交到当前分支

git commit

  • -m选项可以指定提交原因。
  • -a选项可以跳过(即自动执行)git add

查看文件变化

git diff命令会显示指定文件的变化。

git diff可以查看尚未暂存的文件更新了哪些部分。 git diff --cached可以查看已暂存起来的文件与上次提交时的快照之间的差异。

查看仓库历史纪录

查看仓库历史纪录

git log

  • --pretty=oneline查看仓库纪录(每条记录显示为一行)。
  • -p展开显示每次提交的内容差异。
  • -<number>仅显示最近次更新。
  • --stat仅显示简要的增改行数统计。
  • --pretty=format:"the format string"可以定制要显示的记录格式。
  • --graph可以看到开头多出一些ASCII字符串表示的简单图形,形象地展示每个提交所在地分支及其分化衍合情况。
  • --since,--after仅显示指定时间之后的提交。
  • --until,--before仅显示指定时间之前的提交。
  • --author仅显示指定作者相关的提交。
  • --committer仅显示指定提交者相关的提交。

图像化工具

gitk是一个可以查看展示历史提交记录的图像化工具。

撤销操作

修改最后一次提交

git commit --amend

取消已经暂存的文件

git reset HEAD <file>

取消对文件的修改

git checkout -- <file>

远程仓库的使用

查看当前的远程仓库

git remote [-v]

添加一个新的远程仓库

git remote add <shortname> <url>
添加一个新的远程仓库,并指定了一个简短的名称。

删除指定的远程仓库

git remote rm <shortname>

对远程仓库重命名

git remote rename <old-shortname> <new-shortname>

从远程仓库抓取数据到本地

git fetch <shortname>

如果设置了某个分支用于跟踪某个远端仓库分支,那么可以使用git pull命令自动抓取该远程仓库分支的数据下来,并自动合并到本地分支。

将本地数据推送到远程仓库

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

查看某个远程仓库的详细信息

git remote show [shortname]

打标签

列出现有标签

git tag [-l "pattern"]

显示标签信息

git show <tag-name>

新建标签

  • 新建轻量级标签 git tag <tag-name> [commit-hash]

  • 创建含附注类型的标签 git tag -a <tag-name> [-m "message"] [commit-hash]

  • 创建使用GPG签署的标签 git tag -s <tag-name> [-m "message"] [commit-hash]

验证标签

git tag -v <tag-name>
用于验证使用GPG签署的标签。

推送标签

  • 推送指定的标签 git push <remote> <tagname>

  • 推送本地的所有标签 git push <remote> --tags