1. 写在前面
- 本文章是对《Pro Git(Second Edition)》的简单总结。因此,只是记录我认为重要的内容,用来当作目录,方便自己忘记时,快速找到。如果你对我所记录的内容不是很明白,请阅读书籍中的具体内容。
2. Git 简介
- 实际上,Git 是一种分布式版本控制技术(Version Control);
- 版本控制分为本地版本控制,集中式版本控制以及分布式版本控制;
- Git 中保存的是在某一时刻,全部文件的"快照(snapshot)"

2.1 Git 的安装及配置
- Git 的安装
- Git 配置文件说明:
/etc/gitconfig: 系统级配置文件;对应的参数--system~/.gitconfig(或~/.config/git/config): 用户级配置文件;对应的参数--globalconfig: 也就是 Git 仓库中的配置文件(.git/config);对应的参数--local
git config --list:查看当前git配置;git config --global user.name "noodlescnliu": 设置用户名- 常见配置:
user.name=noodlescnliu
user.email=noodlescnliu@gmail.com
alias.lg=log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit # 用于日志格式化输出的别名
3. Git 操作文件
3.1 Git 操作文件的三个区域
Git 仓库(.git 位置): 用来存储文件"快照";工作区(Working Directory): 对文件执行增删改操作;待提交区(Staging Area): 文件修改完成,首先提交到该区,然后提交到Git仓库;

3.2 Git 文件中的状态

3.3 常用命令解释(以my_project/a.txt为例)
git init:初始化本地Git仓库,创建.git隐藏文件夹;- 新建文件
a.txt,并没有纳入到Git仓库的管理,属于Untracked状态; git add a.txt:将a.txt的状态变为Staged,进入到"待提交区域(Staging Area)";git commit -m 'my first commit': 将a.txt的状态变为Unmodified,进入Git仓库"快照";git status: 检查当前目录下,各个文件正在处于哪种状态;- 当你发现
a.txt中存在错误,或者需要添加新内容,修改之后的a.txt,与存储在Git仓库中的"快照"内容发生了变化,因此,状态变为Modified,需要重新git add a.txt,git commit -m 'add new message to a.txt'; git commit -am a.txt 'skipping the staging area': 是git add a.txt和git commit -m 'skipping the staging area'两个命令的简写。但是,文件被Git仓库管理之后,才能执行成功;
3.4 .gitignore文件
- 有一些文件是没有必要被Git仓库管理的,例如,日志输出文件(.log),Java编译后生成的
.class文件等;
# 示例:
# Log file
*.log
# Package Files #
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar
3.5 日志输出格式
git log -p -2: 输出最近提交的两条日志;git log --pretty=format:"%h - %an, %ar : %s"%h: Abbreviated commit hash;%an: 作者姓名;%ar: 提交相对日期;%s: commit 时,输入的提交信息;
git log --pretty=format:"%h %s" --graphgit log --abbrev-commit --pretty=oneline: 只显示哈希值的前几位,以及提交的说明;
3.6 远程协作
git clone https://github.com/Noodlescn/guava: 从 GitHub 中下载项目;git remote: 查看已配置远程服务器的名称,默认下载的项目的远程服务器名称为origin;git remote -v: 当提交或获取项目时,origin所代表的URL地址;git remote add <shortname> <url>: 新增自定义远程服务器地址;git remote rename <oldname> <newname>: 重命名远程服务器;git remote remove <shortname>: 移除远程服务器;- 当从远程Clone项目后,张三又向远程中提交了一些内容。这时,需要使用
git fetch <remote>来更新自己本地项目内容;而由于在自己Clone项目时,Git默认将远程服务器设置为"origin",因此,可以简写为git fetch origin;然后,需要手动进行合并操作git merge; git pull: 将git fetch操作和git merge操作合为一步进行;git push <remote> <branch>: 将项目分享出去,git push origin master;git remote show "https://github.com/google/guava": 用于查看远程项目的信息;
3.6.1 打标签(Tagging)
- 标签主要用来标记产品版本号;
git tag: 列出所有的标签;git tag -l "v1.8.*": 列出以"v1.8"开头的标签;git tag -a v1.4 -m "my version 1.4": 创建 Annotated Tags;
4. Git 分支(Branching)
- 示例:向Git仓库中提交三个文件:
git add README test.rb LICENSEgit commit -m 'The initial commit for my project'
- 提交之后,Git仓库中多了五个实体:
三个Blob: 分别代表三个提交的文件内容;一个树: 指向三个Blob;一个指针: 指向树;


git branch testing: 新建testing分支;git branch -d hotfix: 删除hotfix分支;git branch: 查看当前所有分支;git branch -v: 查看每个分支最后提交的信息;git branch --merged: 查看已合并的分支;git branch --no-merged: 查看未合并的分支;

- `git checkout testing`: 切换分支;


- `git merge iss53`: 合并分支;


4.1 Git 分支远程协作



**参考资料:** - [Git Pro](https://git-scm.com/book/en/v2)