这一篇我觉得是这门课最精彩的一节了,看着视频过程中有股拍案叫绝的冲动。

快照

快照是Git的灵魂所在,就是每一个“版本”
快照可以被多个分支使用,并单独开发。最后可以做合并、历史回溯等操作。

对象和引用

Git 中的对象可以是 文件(blob)、目录(tree)或提交(commit):

  1. type object = blob | tree | commit

Git 在储存数据时,所有的对象都会基于它们的哈希值进行寻址。
当Git引用对象时,它们并没有真正的在硬盘上保存这些对象,而是仅仅保存了它们的哈希值作为引用。

简单来说,哈希值是一种关系映照表,跟其绑定的对象有着一一对应的关系。
我们可以用过哈希值来查看历史提交、所在分支、快照等等等等

但是问题来了,哈希值是 40 位长的十六进制字符,很难记忆。
Git 的解决方法是给这些哈希值赋予人类可读的名字,也就是引用(references)
引用是指向提交的指针。引用指向不同的快照,例如,master 引用通常会指向主分支的最新一次提交。

在Git中,有个特殊的索引“HEAD”,他指向了当前仓库所在位置以及对应的分支。

暂存区

暂存区是git在本地创建的一个“内存”,当使用git add命令之后就会到暂存区中,这时候还没影响到仓库中的内容。
只有当commit之后,才会从缓存区“推”到仓库。

文档中给出了对暂存区的使用场景:

您开发了两个独立的特性,然后您希望创建两个独立的提交,其中第一个提交仅包含第一个特性,而第二个提交仅包含第二个特性。或者,假设您在调试代码时添加了很多打印语句,然后您仅仅希望提交和修复 bug 相关的代码而丢弃所有的打印语句。 Git 处理这些场景的方法是使用一种叫做 “暂存区(staging area)”的机制,它允许您指定下次快照中要包括那些改动。


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 help <command>: 获取 git 命令的帮助信息

分支和合并

  • 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 commit --amend: 编辑提交的内容或信息
  • git reset HEAD <file>: 恢复暂存的文件
  • git checkout -- <file>: 丢弃修改

Git 高级操作

  • git config: Git 是一个 高度可定制的 工具
  • git clone --depth=1: 浅克隆(shallow clone),不包括完整的版本历史信息
  • git add -p: 交互式暂存
  • git rebase -i: 交互式变基
  • git blame: 查看最后修改某行的人
  • git stash: 暂时移除工作目录下的修改内容
  • git bisect: 通过二分查找搜索历史记录
  • .gitignore: 指定 故意不追踪的文件
  • git pull: 相当于 git fetch; git merge
  • git clone: 从远端下载仓库