git学习(五):git diff魔法

不同参数下git diff输出并不相同,理解了工作区,暂存区和版本库的关系之后就很容易理解diff了。

工作区、暂存区和版本库的目录树浏览

清除工作区中未被git管理的文件

1 git clean -fd

查看暂存区和HEAD中的目录树

1 git ls-tree -l HEAD

其中:

  • 参数-l可以显示文件大小
  • 第一个字段时文件的属性(rw-r--r--,644)
  • 第二个字段说明时Git对象库中的一个blob对象(文件)
  • 第三个字段时该文件在对象库中对应的ID——40位的SHA1哈希值
  • 第四个字段时文件大小
  • 第五个字段是文件名

要显示暂存区的目录树,可以使用git ls-files命令

1 git ls-files -s

与git ls-tree不同的是第三个字段不是文件大小而是暂存区编号

 如果想针对暂存区的目录树使用git ls-tree命令,

1 git wirte-tree                // 首先将暂存区的目录树写入git对象库
2 git ls-tree -l 9431f4a        // 对该目录树执行
  • 40位的SHA1哈希值的ID可以用指代文件内容(blob)、目录树(tree)和提交。
  • 命令git write-tree的输出就是写入Git对象库的TreeID,这个ID作为下一条命令的输入。
  • git中的ID只要不冲突可以只使用前几位。
  • git ls-tree可以用-r递归显示树结构,而不是最终的文件。

思考:

git ls-tree -l 后面还要接一个参数一会儿是提交,一会儿是HEAD。所以其实提交和HEAD其实本质上是一回事?

还有,之前做一个需求的时候需要进行对象的对比,发现那些内容改变了,然后讨论的时候提到的git是增量保存的,是这样的么?

这里是不是说每个提交其实都有对应目录树,不是单独为每个提交保存一个目录树,而是增量保存的。

git diff的魔法

1 git diff                               // 工作区和暂存区比较
2 git diff HEAD/master                   // 工作区和版本库的比较
3 git diff --cached/--staged  /HEAD      // 暂存区和版本的比较

猜你喜欢

转载自www.cnblogs.com/tuhooo/p/9185832.html