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