Git Notes
# Git
## 基本概念
### 直接记录快照
+ 提交更新时,对当时全部文件制作一个快照并保存这个快照的索引。没有修改的文件仅保留一个链接指向之前存储的文件。
+ 分布式
- 每一个本地仓库都可以进行离线操作
- 完整性
- 基于文件内容和目录结构使用SHA-1进行计算校验,Git数据库中保存的信息都是以文件内容的哈希值来索引。
### 三种状态:
+ Modified 已修改
+ Staged 已暂存
+ Committed 已提交
<img src=“https://git-scm.com/book/en/v2/images/areas.png” />
+ 基本Git工作流程:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
### Git 基本操作&配置
+ `git config`
- –system 当前系统的配置
- –global 当前用户的配置
- Repo 目录中的 .git/config 当前repo的
- Example
- 用户信息
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
+ 文本编辑器
$ git config --global core.editor emacs
+ 检查某项配置:
- 通过输入 git config <key>:来检查 Git 的某一项配置
- 获取帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
例如,要想获得 config 命令的手册,执行
$ git help config
+ 获取repo
- 在现有目录中初始化仓库
如果你打算使用 Git 来对现有的项目进行管理,你只需要进入该项目目录并输入:
`$ git init`
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。
- 如果是在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制的话,应该开始跟踪这些文件并提交。 通过 `git add` 命令来实现对指定文件的跟踪,然后执行 `git commit `提交:
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
+ 记录更新
- 工作目录下文件的2中状态:
- Tracked
- Untracked
- 基本命令
$ git status / git status -s
$ git add
$ cat .gitignore 创建一个名为 .gitignore 的文件,列出要忽略的文件模式
- .gitignore 的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
PS:
- 所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。
- 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(*) 表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z , a/b/z 或 a/b/c/z 等
+ `git diff –cached & git diff –staged`
查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些
+ `$git commit -a -m 'added new benchmarks'`
跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
+ `git rm PROJECTS.md`
移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 –f
+ `$ git rm --cached README`
把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。
+ `git mv file_from file_to`
移动文件
+ `$ git log `
查看提交历史, 个常用的选项是 -p,用来显示每次提交的内容差异。 可以加上 -2 来仅显示最近两次提交,想看到每次提交的简略的统计信息,可以使用 --stat 选项,另外一个常用的选项是 --pretty。 这个选项可以指定使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如用 oneline 将每个提交放在一行显示, git log –pretty=online,
+ `$ git log --pretty=format`
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
+ `$ git log --pretty=format:"%h %s" –graph `
这个选项添加了一些 ASCII 字符串来形象地展示你的分支、合并历史
+ 撤销操作
`$ git commit –amend `
这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
- `git reset HEAD <file> `
取消暂存的某个文件
- `git remote add <shortname> <url> `
添加一个新的远程 Git 仓库
- `git fetch remote-name `
某种意义上, fetch = pull + merge, 如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。
- `git push origin master `
推送项目到远程
-`$ git remote show origin-name `
查看远程仓库
- `$ git remote rename pb paul `
远程仓库的重命名
- `$ git remote rm paul`
移除
- `$ git tag`
列出标签
- `git tag -a v1.4 -m "my version 1.4" `
创建一个附注标签

浙公网安备 33010602011771号