版本控制(Git)

Git 的命令行接口

Pro Git 中文版： https://git-scm.com/book/zh/v2

基础

git help <command>: 获取 git 命令的帮助信息

git init: 创建一个新的 git 仓库，其数据会存放在一个名为 .git 的目录下

git status: 显示当前的仓库状态

git add <filename>: 添加文件到暂存区

git commit: 创建一个新的提交

如何编写 良好的提交信息!

为何要 编写良好的提交信息

git log: 显示历史日志

git log --all --graph --decorate: 可视化历史记录（有向无环图）

git diff <filename>: 显示与暂存区文件的差异

git diff <revision> <filename>: 显示某个文件两个版本之间的差异

git checkout <revision>: 更新 HEAD 和目前的分支

分支和合并

git branch: 显示分支

git branch <name>: 创建分支

git checkout -b <name>: 创建分支并切换到该分支

相当于 git branch <name>; git checkout <name>

git merge <revision>: 合并到当前分支

git mergetool: 使用工具来处理合并冲突

git rebase: 将一系列补丁变基（rebase）为新的基线

远端操作

git remote: 列出远端

git remote add <name> <url>: 添加一个远端

git push <remote> <local branch>:<remote branch>: 将对象传送至远端并更新远端引用

git branch --set-upstream-to=<remote>/<remote branch>: 创建本地和远端分支的关联关系

git fetch: 从远端获取对象 / 索引

git pull: 相当于 git fetch; git merge

git clone: 从远端下载仓库

撤销

git commit --amend: 编辑提交的内容或信息

git reset HEAD <file>: 恢复暂存的文件

git checkout -- <file>: 丢弃修改

git restore: git2.32 版本后取代 git reset 进行许多撤销操作

Git 高级操作

git config: Git 是一个 高度可定制的 工具

git clone --depth=1: 浅克隆（shallow clone），不包括完整的版本历史信息

git add -p: 交互式暂存

git rebase -i: 交互式变基

git blame: 查看最后修改某行的人

git stash: 暂时移除工作目录下的修改内容

git bisect: 通过二分查找搜索历史记录

.gitignore: 指定 故意不追踪的文件

杂项

图形用户界面: Git 的 图形用户界面客户端 有很多，但是我们自己并不使用这些图形用户界面的客户端，我们选择使用命令行接口

Shell 集成: 将 Git 状态集成到您的 shell 中会非常方便。(zsh, bash)。Oh My Zsh这样的框架中一般以及集成了这一功能

编辑器集成: 和上面一条类似，将 Git 集成到编辑器中好处多多。fugitive.vim 是 Vim 中集成 GIt 的常用插件

工作流: 我们已经讲解了数据模型与一些基础命令，但还没讨论到进行大型项目时的一些惯例 ( 有很多 不同的 处理方法)

GitHub: Git 并不等同于 GitHub。 在 GitHub 中您需要使用一个被称作拉取请求（pull request）的方法来向其他项目贡献代码

其他 Git 提供商: GitHub 并不是唯一的。还有像 GitLab 和 BitBucket 这样的平台。

资源

Pro Git ，强烈推荐！学习前五章的内容可以教会您流畅使用 Git 的绝大多数技巧，因为您已经理解了 Git 的数据模型。后面的章节提供了很多有趣的高级主题。（Pro Git 中文版）；

Oh Shit, Git!?! ，简短的介绍了如何从 Git 错误中恢复；

Git for Computer Scientists ，简短的介绍了 Git 的数据模型，与本文相比包含较少量的伪代码以及大量的精美图片；

Git from the Bottom Up详细的介绍了 Git 的实现细节，而不仅仅局限于数据模型。好奇的同学可以看看；

How to explain git in simple words；

Learn Git Branching 通过基于浏览器的游戏来学习 Git ；

课后练习

如果您之前从来没有用过 Git，推荐您阅读 Pro Git 的前几章，或者完成像 Learn Git Branching 这样的教程。重点关注 Git 命令和数据模型相关内容；

Fork 本课程网站的仓库

将版本历史可视化并进行探索
Copy
Git log --all --graph --decorate

是谁最后修改了 README.md 文件？（提示：使用 git log 命令并添加合适的参数）
Copy
git log -1 README.md

-x 选项：查看最新的 x 次提交或特定文件的版本信息

最后一次修改 _config.yml 文件中 collections: 行时的提交信息是什么？（提示：使用 git blame 和 git show）
Copy
git blame _config.yml | grep collections
git show --pretty=format:"%s" a88b4eac | head -1
git log --pretty=format:"%s" a88b4eac -1

使用 Git 时的一个常见错误是提交本不应该由 Git 管理的大文件，或是将含有敏感信息的文件提交给 Git 。尝试向仓库中添加一个文件并添加提交信息，然后将其从历史中删除 ( 这篇文章也许会有帮助)；

首先提交一些敏感信息
Copy
echo "password123">my_password
git add .
git commit -m "add password123 to file"
git log HEAD

使用 git filter-branch 清除提交记录
Copy
git filter-branch --force --index-filter\
'git rm --cached --ignore-unmatch ./my_password' \
--prune-empty --tag-name-filter cat -- --all

从 GitHub 上克隆某个仓库，修改一些文件。当您使用 git stash 会发生什么？当您执行 git log --all --oneline 时会显示什么？通过 git stash pop 命令来撤销 git stash 操作，什么时候会用到这一技巧？

与其他的命令行工具一样，Git 也提供了一个名为 ~/.gitconfig 配置文件 (或 dotfile)。请在 ~/.gitconfig 中创建一个别名，使您在运行 git graph 时，您可以得到 git log --all --graph --decorate --oneline 的输出结果；

您可以通过执行 git config --global core.excludesfile ~/.gitignore_global 在 ~/.gitignore_global 中创建全局忽略规则。配置您的全局 gitignore 文件来自动忽略系统或编辑器的临时文件，例如 .DS_Store；

克隆 本课程网站的仓库，找找有没有错别字或其他可以改进的地方，在 GitHub 上发起拉取请求（Pull Request）；