简介
看书ing
《Git版本控制管理(第二版)》,记录下笔记
包括快捷键,章节等
笔记
第三章
指令:config配置
git config -l //查看配置
git config -l --global //查看全局配置
git config 名字 值 //设置字段
git config 名字 值 --blobal //设置全局字段
git config --unset 名字 //删除字段
git config --unset 名字 --global //删除全局字段
git config alias.别名 指令 --global //全局设置别名
第四章 对象库图示
4.1.2 git数据类型
git对象库里只有四类数据:
- 块(bolb):二进制大对象,只储存元数据,不带有任何其他信息
- 目录树(tree):代表一层目录信息,记录bolb标识符,路径名,目录下文件的所有元数据,也可以递归引用其他tree
- 提交(commit):保存每次提交变化的元数据,包括作者等相信信息,每次commit指向一个tree
- 标签(tag):给提交打tag
4.3.2 对象、散列、bolb
git创建对象的时候,git不关心文件名,只对元数据进行sha1计算出散列值,把散列值的十六进制表示作为文件名放进对象库中,在.git/objects目录下,并用第一个字节做目录名分割开
可以用
find .
查看仓库目录
然后对objects目录下的某个bolb,使用git cat- file -p 散列值
来查看该块的原始内容(如果是引用树的话,会打印引用的树的信息)
散列值太长不好记,可以用git rev-parse 散列值前几位/tag名
打印完整的散列值
可以用git ls-files -s
打印暂存的文件
第五章 文件管理和索引
5.9 git中对象模型和文件的详细视图
示意图:
修改本地文件并提交时git变化示意图
-
原git状态:
本地两个文件,已提交,索引(暂存区)树与提交树指向相同 -
本地编辑了file1:
此时索引与提交树是干净的,但是本地脏了,git status显示unstagedfile -
执行git add file1:
把file1提交到了暂存区,本地变干净了,但是暂存区脏了(跟对象库中最新的提交不一致了),git status显示add file,git会根据修改后的file1创建新的bold,然后将索引树从file1 bolb指向新的bolb,file2因为没变,所以仍旧指向file2 bolb。 -
执行git commit:
把索引内容提交到分支,索引跟对象库中内容一致,仓库重新干净。
执行commit时,git会先根据暂存区的树创建新的提交对象树(双线三角),然后创建提交对象(双线圆)指向该树,同时新的提交对象指向旧的提交对象,master指向新提交对象,此时最新的提交对象的树,与索引的树指向的内容一致
第六章 提交
6.2.3 相对提交名
示意图:
HEAD指代当前分支最新的提交
- ^指代不同分支的父提交(不同分支),~指代父提交的父提交(同一个分支)
- ^1 == ~1 因为都是指代当前提交的第一个父提交
- ^2 != ~2 因为^2指代的是第二个分支上的父提交,~2指代的是父提交的父提交
- ^^ == ~~ == ~2 因为^^指代的的是当前的第一个分支上的父提交(~)的第一个分支上的父提交(~~)
- 注意^2 != ^^详情请上面示意图
6.3 查看提交记录
- git log == git log HEAD 原因:如果git log后面跟了某个提交名,就会从该提交开始回溯显示历史
- git log HEAD .. HEAD~2 会打印从当前提交到前两个分支的提交,区间打印法可以使用since .. until这样来打印某一段提交记录
- 常用--pretty=short 显示简略信息
- 常用--abbrev-commit 显示简写的散列ID
- 常用-p 显示提交的变更内容
- 常用-n (n为数值)显示打印的行数
- 常用--graph显示提交记录的线图
6.3.2 提交图
gitk 指令显示提交图 强烈建议查看提交图使用sublime merge,直观方便,敲命令行太痛苦了
6.4 查找提交
git bisect 定位错误用,具体没用过,待研究
git blame 也是定位错误用,也没用过。。。
第八章 diff
8.1 git diff 格式
- git diff:显示工作目录和索引之间的差异,本地目录是脏的时候使用
- gif diff commit:显示工作目录与制定提交之间的差异,常用HEAD或者某个分支作为commit
- git diff --cached commit:显示索引中的变更和给定提交之间的差异,省略commit的话会默认比对HEAD
- git diff commit1 commit2:显示任意两个提交之间的差异,会忽略索引和工作目录,比较对象库中的两个树
- git diff commit1 commit [目录名/文件名]可以显示某目录下或者文件的差异
- git diff commit1 .. commit2:等同于上面,比较两个提交之间的差异 参数: --stat:显示统计差异,不显示具体内容差异 --color:试用多颜色输出 -w或者--ignore-all-space:比较时忽略空白字符 -S"搜索字符串":可以展示包含字符串的提交的不同
第九章 merge
9.1.3 有冲突的合并
git merge碰到有冲突时,会终止合并,并提示冲突文件在哪儿
处理完冲突文件后,直接执行git commit(不带参数),会继续merge,提示输入merge commit的文案,保存后merge完成
第十章 更改提交
10.2 使用git reset
可以把HEAD指针指向任意一个提交,有三个参数:
- --soft 索引工作目录不变,git status会发现索引有内容(索引跟HEAD内容不同),工作目录无内容(工作目录与索引内容相同)
- --mixed 索引跟着HEAD一起改变指向新的提交,git status会发现索引无内容(索引跟HEAD相同),工作目录显示有内容(工作目录与索引内容不同)
- --hard HEAD,索引,工作目录一起改变,git status看不到任何内容
10.6 修改最新提交
git commit --amend 会打开编辑器,修改上次提交信息后,把这次的索引里的内容提交到上次提交的内容中
后面可以加参数--author [作者名 <邮箱>], 直接修改本次提交的作者,邮箱
10.7 变基提交
前向移植:
git rebase [目标分支]:把当前分支的依赖,改到目标分支的HEAD
git rebase [目标分支] [迁移分支分支]:等同于上面
例子: git rebase master topic
迁移提交: git rebase --onto [目标分支] [迁移起点] [迁移分支]
例子:git rebase --onto master maint~ feature
注意,变基操作一次会迁移一个提交,每次迁移都可能会有冲突,出现了就要处理冲突:
- 处理冲突后,使用git rebase --continue继续变基操作,
- 使用git rebase --skip跳过当前提交,继续迁移下一个,但可能会导致滚雪球般的错误
- 使用git rebase --abort来终止变基,版本库会恢复成变基前的状态
交互式变基操作: git rebase -i [交互终止提交]:会打开一个文本编辑器来让你变更如何处理到[交互终止提交]之间的变基处理
10.7.2 变基与合并
- git pull = git fetch + git merge
- git pull --rebase = git fetch + git rebase 区别:merge会把两个分支合并成一个提交,提交图会是两根线,而rebase会吧当前分支变基到目标分支的最新节点上,提交图会是一直线,更好看
第十一章 储藏和引用日志
11.1 储藏
- git stash save [文字消息]:暂存工作区,会顺序入栈
- git stash:等同于git stash save,会直接储存当前工作区,并且不会增加文字消息
- git stash pop [stash名字/index]:取出指定的暂存,没指定名字的话会取出最新的,名字/index可以为:
- stash名字:stash@{0}
- stash的索引:直接0,1,2,用git stash list可以获取
- git stash list:查看所有暂存
- git stash show [stash名字/index]:查看某个暂存所变化的内容,参数- p 可以查看具体的文件内容
- git stash drop [stash名字/index]:丢弃某个暂存
更新ing