为了一些软件的配置(包括这个博客),一直有在断断续续地使用Github。由于对一些概念始终有一些疑惑,所以来读一下著名的Pro Git v2,顺便记笔记。

Git仓库 (repository)

Git 是一种基于快照流的分布式版本控制系统 (Distributed Version Control System, DVCS),保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。

基本工作流程

Git 工作流程如下: 1. 在工作目录中修改文件。 2. 暂存文件,将文件的快照放入暂存区域。 3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

具有三种状态:已提交(committed)、已修改(modified)和已暂存(staged)。

lifecycle

相关命令

获取仓库

$ git init 初始化 $ git clone [url] 克隆

记录更新

$ git status 检查当前文件状态 $ git status -s 紧凑格式输出 $ git diff 暂存前后的变化 $ git diff --staged 已经暂存起来,将要添加到下次提交里的变化 $ git add <file> 跟踪新文件 $ git commit -m "message" 提交A类更新并说明 $ git commit -a -m "message" 提交AM类更新并说明 $ git rm <file> 从暂存区移除,不纳入版本管理 $ git rm -f <file> 从暂存区强制移除修改过的文件,防误删 $ git mv <file_from> <file_to> 移动文件或重命名

查看提交历史

$ git log 查看提交历史 $ git log -p -2 显示最近两次提交的内容差异 $ git log --pretty=format:"%h %s" --graph 使用ASCII字符串来形象地展示分支、合并历史

撤销操作

$ git commit --amend 重新提交 git reset HEAD <file> 取消暂存 git checkout -- <file> 撤销修改(慎用)

远程仓库

$ git remote -v 查看远程仓库 git remote add <shortname> [url] 添加远程仓库 $ git fetch <remote-name> 从远程仓库中抓取与拉取 $ git push <remote-name> <branch-name> 推送到远程仓库 $ git remote show <remote-name> 查看 $ git remote rename 重命名 $ git remote rm 删除

标签

$ git tag 列出已有标签 $ git show <tag> 查看标签信息与对应的提交信息 $ git tag <tag> 添加轻量标签 $ git tag -a <tag> -m "message" 添加附注标签

注解

初始化与克隆

初始化时,Git 会创建一个 .git 目录。 这个目录包含了几乎所有 Git 存储和操作的对象。 如若想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。 克隆时,Git 会在当前目录下创建目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。

文件状态

?? Untracked files 未跟踪(在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围) A Changes to be committed 已暂存(如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。) M Changes not staged for commit 修改未暂存

忽略文件

.gitignore * 所有空行或者以 # 开头的行都会被 Git 忽略。 * 可以使用标准的 glob 模式匹配。( shell 所使用的简化了的正则表达式。*匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符;?只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配;使用两个*a/**/z表示匹配任意中间目录。 * 匹配模式可以以(/)开头防止递归。 * 匹配模式可以以(/)结尾指定目录。 * 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

抓取数据

如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

如果你有一个分支设置为跟踪一个远程分支(阅读下一节与 Git 分支 了解更多信息),可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。 这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

标签

轻量标签(lightweight):本质上是将提交校验和存储到一个文件中 - 没有保存任何其他信息 附注标签(annotated):附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。通常建议创建附注标签,这样你可以拥有以上所有信息

默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。