这一篇我觉得是这门课最精彩的一节了,看着视频过程中有股拍案叫绝的冲动。
快照
快照是Git的灵魂所在,就是每一个“版本”
快照可以被多个分支使用,并单独开发。最后可以做合并、历史回溯等操作。
对象和引用
Git 中的对象可以是 文件(blob)、目录(tree)或提交(commit):
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>
: 丢弃修改