Git学习笔记

简介

看书ing 《Git版本控制管理(第二版)》,记录下笔记
包括快捷键,章节等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对象库里只有四类数据:markdown

  1. 块(bolb):二进制大对象,只储存元数据,不带有任何其余信息
  2. 目录树(tree):表明一层目录信息,记录bolb标识符,路径名,目录下文件的全部元数据,也能够递归引用其余tree
  3. 提交(commit):保存每次提交变化的元数据,包括做者等相信信息,每次commit指向一个tree
  4. 标签(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打印暂存的文件fetch

第五章 文件管理和索引

5.9 git中对象模型和文件的详细视图

示意图:

image.png

修改本地文件并提交时git变化示意图

  1. 原git状态:
    本地两个文件,已提交,索引(暂存区)树与提交树指向相同 image.pngspa

  2. 本地编辑了file1:
    此时索引与提交树是干净的,可是本地脏了,git status显示unstagedfile image.png命令行

  3. 执行git add file1:
    把file1提交到了暂存区,本地变干净了,可是暂存区脏了(跟对象库中最新的提交不一致了),git status显示add file,git会根据修改后的file1建立新的bold,而后将索引树从file1 bolb指向新的bolb,file2由于没变,因此仍旧指向file2 bolb。 image.png版本控制

  4. 执行git commit:
    把索引内容提交到分支,索引跟对象库中内容一致,仓库从新干净。
    执行commit时,git会先根据暂存区的树建立新的提交对象树(双线三角),而后建立提交对象(双线圆)指向该树,同时新的提交对象指向旧的提交对象,master指向新提交对象,此时最新的提交对象的树,与索引的树指向的内容一致 image.png指针

第六章 提交

6.2.3 相对提交名

示意图:
image.png
HEAD指代当前分支最新的提交日志

  1. ^指代不一样分支的父提交(不一样分支),~指代父提交的父提交(同一个分支)
  2. ^1 == ~1 由于都是指代当前提交的第一个父提交
  3. ^2 != ~2 由于^2指代的是第二个分支上的父提交,~2指代的是父提交的父提交
  4. ^^ == ~~ == ~2 由于^^指代的的是当前的第一个分支上的父提交(~)的第一个分支上的父提交(~~)
  5. 注意^2 != ^^详情请上面示意图

6.3 查看提交记录

  1. git log == git log HEAD 缘由:若是git log后面跟了某个提交名,就会从该提交开始回溯显示历史
  2. git log HEAD .. HEAD~2 会打印从当前提交到前两个分支的提交,区间打印法能够使用since .. until这样来打印某一段提交记录
  3. 经常使用--pretty=short 显示简略信息
  4. 经常使用--abbrev-commit 显示简写的散列ID
  5. 经常使用-p 显示提交的变动内容
  6. 经常使用-n (n为数值)显示打印的行数
  7. 经常使用--graph显示提交记录的线图

6.3.2 提交图

gitk 指令显示提交图 强烈建议查看提交图使用sublime merge,直观方便,敲命令行太痛苦了code

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 image.png

迁移提交: git rebase --onto [目标分支] [迁移起点] [迁移分支]

例子:git rebase --onto master maint~ feature

image.png

注意,变基操做一次会迁移一个提交,每次迁移均可能会有冲突,出现了就要处理冲突:

  1. 处理冲突后,使用git rebase --continue继续变基操做,
  2. 使用git rebase --skip跳过当前提交,继续迁移下一个,但可能会致使滚雪球般的错误
  3. 使用git rebase --abort来终止变基,版本库会恢复成变基前的状态

交互式变基操做: git rebase -i [交互终止提交]:会打开一个文本编辑器来让你变动如何处理到[交互终止提交]之间的变基处理

image.png

10.7.2 变基与合并

image.png

  • git pull = git fetch + git merge
  • git pull --rebase = git fetch + git rebase

区别:merge会把两个分支合并成一个提交,提交图会是两根线,而rebase会吧当前分支变基到目标分支的最新节点上,提交图会是一直线,更好看

image.png

第十一章 储藏和引用日志

11.1 储藏

  • git stash save [文字消息]:暂存工做区,会顺序入栈
  • git stash:等同于git stash save,会直接储存当前工做区,而且不会增长文字消息
  • git stash pop [stash名字/index]:取出指定的暂存,没指定名字的话会取出最新的,名字/index能够为:
    1. stash名字:stash@{0}
    2. stash的索引:直接0,1,2,用git stash list能够获取
  • git stash list:查看全部暂存
  • git stash show [stash名字/index]:查看某个暂存所变化的内容,参数- p 能够查看具体的文件内容
  • git stash drop [stash名字/index]:丢弃某个暂存

更新ing