这次重点讲解索引文件(index file)的作用。

我们在提交工作时,使用最多的命令就是 git commit -a 了,但是这个将提交你所做的所有工作。其实,如果你了解 commit 的工作机制,你会知道我们可以自定义提交哪些部分到哪些工作树中,其实自由度很大的。

一、diff 到底在和谁对比

还记得之前我们建立的 test-project 工作目录么。我们继续在这个目录下演示讲解。

[rocrocket@wupengchong test-project]$ echo “hello world,again”>>file.txt

这次,我们不急着执行 commit 命令,而是先用 git diff 看看差别情况:

[rocrocket@wupengchong test-project]$ git diff
diff –git a/file.txt b/file.txt
index 60be00d..a559610 100644
— a/file.txt
+++ b/file.txt
@@ -1 +1,2 @@
Hi,rocrocket!
+hello world,again

好了,我们可以看到 git  报告了我们刚才所做的修改。下面我们来 add 一下,然后再 git diff,看看 diff 有什么变化呢:

[rocrocket@wupengchong test-project]$ git add file.txt
[rocrocket@wupengchong test-project]$ git diff
[rocrocket@wupengchong test-project]$

大家可以看到在 add 之后的 git diff 的输出竟然为空了,但是此时我们尚未执行 commit 啊。如果这个时候你执行 git diff HEAD,你仍然会看到修改报告:

[rocrocket@wupengchong test-project]$ git diff HEAD
diff –git a/file.txt b/file.txt
index 60be00d..a559610 100644
— a/file.txt
+++ b/file.txt
@@ -1 +1,2 @@
Hi,rocrocket!
+hello world,again

这就说明了一个问题:git diff 不是在和 HEAD 比,而是另外一个“神秘”内容在比,而这个“神秘”内容就是“索引文件”!

二、索引文件

索引文件(index file)就是 .git/index 文件,它是二进制形式的文件。我们可以用 ls-files 来检查它的内容。

[rocrocket@wupengchong test-project]$ git ls-files –stage  //一定要记住,此命令是用于查看index file的!!
100644 a55961026a22bdd4e938dcc90a4a83823a81f776 0       file.txt
[rocrocket@wupengchong test-project]$ git cat-file -t a5596
blob
[rocrocket@wupengchong test-project]$ git cat-file blob a5596
Hi,rocrocket!
hello world,again

很明显,我们可以看到其内容已经是改进后的代码了,怪不得 git-diff 会输出空呢!

我们的结论就是 git add 的作用就是创建一个 blob 文件来记录最新的修改代码,并且在 index file 里添加一个到此 blob 的链接。

如果在 git-diff 后面加上参数 HEAD,则 git-diff 会显示当前工作目录和最近一次提交之间的代码区别。

[rocrocket@wupengchong test-project]$ echo ‘again?’>>file.txt
[rocrocket@wupengchong test-project]$ git diff HEAD
diff –git a/file.txt b/file.txt
index 60be00d..dfb67dc 100644
— a/file.txt
+++ b/file.txt
@@ -1 +1,3 @@
Hi,rocrocket!
+hello world,again
+again?

如果使用参数 –cached,则会比较 index file 和最近一次提交之间的代码区别。

[rocrocket@wupengchong test-project]$ git diff –cached
diff –git a/file.txt b/file.txt
index 60be00d..a559610 100644
— a/file.txt
+++ b/file.txt
@@ -1 +1,2 @@
Hi,rocrocket!
+hello world,again

三、小结

按我的认识,更清楚且通俗的解释就是:git 维护的代码分成三部分,“当前工作目录”<------>“index file”<------>“git仓库”。

  • git add 会将“当前工作目录”的改变写到“index file”。
  • git commit 会将 index file 中的改变写到 git 仓库。
  • “commit -a”则会直接将“当前工作目录”的改动同时写到“index file”和“git仓库”。
  • git diff 总会拿 git 仓库来作为比较对象之一。如果 git diff 的参数是 HEAD,则另一个比较对象就确定为“当前工作目录”;如果参数是 –cached,则另一个比较对象就被确定为“index file”。
  • 由此可见,commit(不加-a选项)的作用是使用 index 来建立 commit,而和当前目录无关。

  • git diff:是查看 working tree 与 index file 的差别的。
  • git diff --cached:是查看 index file 与 commit 的差别的。
  • git diff HEAD:是查看 working tree 和 commit 的差别的,在这里 HEAD 代表的是最近的一次commit的信息。

四、其他

status 命令会显示当前状态的一个简单总结:

[rocrocket@wupengchong test-project]$ git status
# On branch master
# Changes to be committed:
#   (use “git reset HEAD <file>…” to unstage)
#
#    modified:   file.txt
#
# Changed but not updated:
#   (use “git add <file>…” to update what will be committed)
#
#    modified:   file.txt
#

上面两行黑体字中的 Changes to be committed 表示在 index 和 commit 的区别状况。而 Changed but not updated 表示当前目录和 index 的区别状况。

转载于:https://blog.csdn.net/kuitar/article/details/52413039

(SAW:Game Over!)

Git 索引文件(index file)相关推荐

  1. 59.排序好的大数据创建索引文件,并实现大文件的二分查找,根据索引百万数据秒读数据...

    创建索引 1 //创建索引 2 struct index 3 { 4 //保存每行偏移的位置 5 int *pindex; 6 //文件的总长度 7 int length; 8 }allindex;/ ...

  2. kafka如何查看日志与索引文件

    查看segment文件的内容 kafka 产生数据有一个.log文件和一个索引文件.index,用普通的cat无法查看里面的内容,需要使用指定的命令 kafka-run-class.sh kafka. ...

  3. 倒排文件索引(Inverted File Index)的建立

    建立索引 目前主流的索引技术有三种:倒排文件.后缀数组和签名.后缀数组的方法虽然快,但是其维护困难,代价相当高,不适合做引擎的索引.签名是一种很好的索引方式,但倒排文件的速度和性能已经超过了签名.倒排 ...

  4. 倒排文件索引(Inverted File Index)

    倒排文件是一种在各大搜索引擎中被主要使用的索引的方式,并且它也是搜索引擎中一个核心的技术. 一个典型的倒排索引主要由词汇表(也叫索引项)和事件表(也叫文件链表)两部分组成.词汇表是用来存放分词词典的, ...

  5. 如何使用Git解决“错误:错误索引 - 致命:索引文件损坏”

    在git init ,我添加并提交了一些文件,进行了一些更改,添加并提交. 设置git守护程序(在WinXP上的Cygwin下运行)并克隆一次存储库. 现在,我在克隆的存储库中收到此错误: $ git ...

  6. git报错error: index uses extension, fatal: index file corrupt

    git报错 error: index uses extension, which we do not understand fatal: index file corrupt 用git 拉取代码时,遇 ...

  7. git命令出现fatal: Unable to create 'xxx/.git/index:File exists.问题

    用git commit命令时,出现 fatal: Unable to create 'xxx/.git/index:File exists. Another git process seems to ...

  8. git 出现 error: bad signature fatal: index file corrupt

    今天git add的时候出现错误bad signature fatal: index file corrupt 之后就是无论如何也commmit不了也push不了 在网上找了方法如下: 在项目有.gi ...

  9. git index file corrupt

    问题出现原因:在idea里面使用git合并分支时,电源开关被同事关了,电脑瞬间关机,导致索引文件损坏. 解决方案 1.找到项目路径 2.右键 Git Hash Here 删除index文件 rm -f ...

最新文章

  1. python3 raise 抛出异常
  2. 2017春季华为实习生编程题
  3. 谷歌开源机器学习可视化工具 Facets:从全新角度观察数据
  4. 前端项目难点及解决方法_预埋件施工重点难点的解决方法
  5. linux的驱动开发——简单驱动程序编写
  6. java用NIO实现文件传输_Java Nio 实现文件的传输
  7. springboot启动原理_SpringBoot启动原理及相关流程
  8. jQuery中的筛选(六):first()、last()、has()、is()、find()、siblings()等
  9. “敏捷”联袂“ALM” 上演市场模范夫妻秀
  10. 18.高性能MySQL --- 大文件传输
  11. android获取手机联系人信息(电话,邮箱,姓名,头像)
  12. 搜狐畅游一面(c++)
  13. 前端开发实习面经总结
  14. 《Using OpenRefine》翻译~2
  15. Second season nineteenth episode,Eddie does not move out
  16. css中的各种选择器
  17. 监控平台设计之GraphitePrometheus存储
  18. matplotlib.pyplot可视化(官方API)
  19. 电脑桌面两个计算机图标怎么删除,电脑声音图标怎么有两个,怎么除掉一个
  20. 重启c语言-查验身份证

热门文章

  1. 【新年快乐】缤纷多彩的Vue点赞组件
  2. 关于JQuery简单介绍
  3. Spring AOP根据JdbcTemplate方法名动态设置数据源
  4. Android应用性能优化之使用SparseArray替代HashMap(转)
  5. 【DONE】dbeaver不会用,请教!!!
  6. linux7.5进单用户模式,linux进入单用户模式
  7. 深入了解Mybatis架构设计
  8. django-vue-admin前端设置后台接口地址为127.0.0.1产生跨域问题解决办法
  9. minikube配置使用代理
  10. Apache Subversion command line tools下载地址 svn命令行客户端