Git基本概念
Git目录结构
版本库
仓库,repository。被Git管理的文件的修改、删除都能被Git跟踪,从而记录版本,在必要的时候可以进行“还原”。.git 隐藏目录就是版本库,里面保存着Git管理的文件信息。
.git
├─hooks
├─info
├─logs
├─objects
└─refs
COMMIT_EDITMSG
config
description
HEAD
index暂存区(stage或index):需要提交的文件修改都放到暂存区,然后一次性提交暂存区的所有修改。
Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

工作目录
工作区,Working Directory。其下的文件都可以被Git管理。包含.git目录的目录。只有在工作目录当中的文件可以被Git管理,才能保存到版本库中。
xxx
├─.git
...Git配置信息
查询配置
# 列出所有 Git 当时能找到的配置
git config --list
# 检查某一项配置
git config <key>
# 如:git config user.name
# 查看配置原始值(配置项的文件来源)
git config --show-origin <key>
# 如:git config --show-origin rerere.autoUpdate获取帮助
# 获取全面参考手册的等价命令
git help <verb>
git <verb> --help
man git-<verb>
# 更简洁的help输出
git add -h文本编辑器
当 Git 需要你输入信息时会调用它,如果未配置,将使用操作系统默认的文本编辑器。
- 在 Windows 系统上,如果你想要使用别的文本编辑器,那么必须指定可执行文件的完整路径。
git config --global core.editor ".exe绝对路径"用户信息
Git的每次提交都会携带用户信息,写入到提交信息的用户信息不可更改。
git config --global user.name "YourName"
git config --global user.email YourEmail- 如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 (全局配置)
- 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。(局部配置)
获取Git仓库

Git命令需要在一个工作目录下执行。
# 初始化工作目录,新建.git目录
git init
# 添加文件至缓存区(追踪文件以进行版本控制)
git add 文件名
# git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
# git add 更合适的描述为:精确地将内容添加到下一次提交中
# 提交缓存区的文件到当前分支
git commit # 提交完需使用vim输入提交信息
git commit -m 提交信息
git commit -message 提交信息
# 在当前目录下克隆Git仓库(拷贝所有数据)
# 会新建一个目录,其中包含所有的仓库数据(包括.git)
git clone <url> [自定义本地仓库名]
# git clone https://github.com/libgit2/libgit2- 创建时,Git会自动创建一个master分支。
- Git支持多种数据传输协议。包括https、git。
工作区文件的修改由Git自动记录,修改完后需要重新提交(未加入Git时要先加入)。
记录更新到仓库
工作目录下的每个文件可分为两种:已跟踪、未跟踪(Untracked)。
已跟踪的文件是指那些被纳入了 版本控制的文件,它们的状态可能是未修改(clean的,Unmodified),已修改(Modified)或已放入暂存区(Staged)。
工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件。
- 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 在工作时,你可以选择性地将这些修改过的文件放入暂存区,然后提交所有已暂存的修改,如此反复。

# 检查哪些文件处于哪种状态
git status
# 状态简览
git status -s- Untracked files: 未追踪的文件
- Changes to be committed: 已暂存的文件。
- Changes not staged for commit: 已修改未暂存的文件。
git add:是个多功能命令。可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 (精确地将内容添加到下一次提交中)
- Git暂存的是执行add命令时的版本。如果执行add后仍有修改,需要重新执行add把最新的版本暂存起来,然后进行提交。
状态标记
??:新添加的未追踪文件
A:新添加到暂存区中的文件
M:修改过的文件
状态标记有两栏:左栏指明了暂存区的状态,右栏指明了工作区的状态。
git status -s
# 输出:
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
# 解读:
# README 在工作区已修改但尚未暂存(右M)
# lib/simplegit.rb 已修改且已暂存(左M)
# Rakefile 已修改,暂存后又作了修改(双M)忽略文件
一些如日志、临时文件等不需要纳入Git管理的文件,可以在 .gitignore 文件中列出。
cat .gitignore
*.[oa]
*~.gitignore 文件规范:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
glob模式:指 shell 所使用的简化了的正则表达式。
- 星号(*)匹配零个或多个任意字符;
- [abc] 匹配 任何一个列在方括号中的字符;
- 问号(?)只 匹配一个任意字符;
- 如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配 (比如 [0-9] 表示匹配所有 0 到 9 的数字)。
- 使用两个星号(
**)表示匹配任意中间目录;如a/**/z可以 匹配 a/z 、 a/b/z 或 a/b/c/z 等。
在最简单的情况下,一个仓库可能只根目录下有一个 .gitignore 文件,它递归地应用到整 个仓库中。 然而,子目录下也可以有额外的 .gitignore 文件。子目录中的 .gitignore 文件中的规则只作用于它所在的目录中。(详见man gitignore)
差异比较
# 比较的是工作目录中当前文件和暂存区域快照之间的差异
git diff
# 比对已暂存文件与最后一次提交的文件差异(等价)
git diff --staged
git diff --cached
# 使用外部的diff分析软件进行分析
git difftool ...
# 查看系统支持的diff插件
git difftool --tool-help提交更新
# 使用配置的文本编辑器输入提交说明
git commit
# 默认的提交消息包含最后一次运行 git status 的输出,放在注释行里,另外开头还有一个空行,用以输入提交说明。
# 直接在命令行附带提交信息
git commit -m 提交信息
git commit -message 提交信息- 提交时记录的是放在暂存区域的快照。
- 每一次运行提交操作,都是对项目作一次快照,在以后可以回退至某个快照。
# 自动暂存已跟踪的文件并提交
git commit -a移除文件
# 将文件从Git中移除,并连带从工作目录中(磁盘中)删除
git rm 文件名
# 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f (force)
git rm 文件名 -f
# 仅从Git中移除,保留磁盘文件
git rm --cached 文件名- git rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。(注意转义如:
log/\*.log匹配log目录下的所有 .log 文件)
移动文件与改名
# 文件更名
git mv file_from file_to运行 git mv 就相当于运行了下面三条命令:
git mv README.md README git rm README.md git add README
查看提交历史
# 查看仓库的提交历史
# 按时间先后顺序列出所有的提交,最近的更新排在最上面
git log选项:

--pretty=子选项:使用不同于默认格式的方式展示提交历史。 子选项:oneline、short、full、fuller、format:"格式选项"
格式选项:
git log --pretty=format:"%h - %an, %ar : %s"。

输出限制选项:

--since=时间点:列出时间点后的更新
时间点:2.weeks、"2008-01-15"、"2 years 1 day 3 minutes ago"
--author:显示指定作者的提交。可以指定多个
--grep:搜索提交说明中的关键字。可以指定多个
你可以指定多个 --author 和 --grep 搜索条件,这样会只输出匹配 任意 --author 模式和 任意 --grep 模式的提交。然而,如果你添加了 --all-match 选项, 则只会输出匹配 所有 --grep 模式的提交。
-S str:只显示添加或删除了字串str的提交
--no-merges:隐藏合并提交。避免显示的合并提交而弄乱历史记录。
撤销
# 改写Amend。修补提交,覆盖上一次的提交。
# (被覆盖的提交甚至不会出现在历史记录中)
git commit --amend
# 取消对文件的暂存(add)
# reset 是个危险的命令,小心点
git reset HEAD 文件名
# 撤销对文件的修改(还原至上一次提交的状态,Unmodified)
# Git会用最近的提交覆盖它,本地的修改都会消失。
git checkout -- 文件名
# 未提交的丢了就是丢了,提交过的Git总能找回来。