change却未stage
常见的一种做法就是使用git diff
来查看工作目录还未stage的文件差异。
实验方法:
修改一下simplegit.rb,添加一个方法
然后在README文件中添加一个作者
然后我们用
git add
命令把README文件载入(stage)运行
git status
会显示README载入了,而simplegit.rb只是修改了还未载入
1 | $ vim lib/simplegit.rb |
那么,我现在想查看一下对simplegit.rb文件究竟做了什么改动?在我载入之前怎么查看这些改动的内容呢?答案是只需运行不带任何参数的git diff
命令即可:
1 | $ git diff |
这样就可以看到我添加到文件中的内容,现在我可以决定是不是要将其载入了。注意,README文件的修改并没有显示出来。
stage但未commit
为了查看载入(staged)而并未提交(not committed)的内容差异,可以使用git diff --stage
命令(在git 1.6之前的版本中,使用--cached
)
1 | $ git diff --staged |
适应情形:在运行git commit(不带'-a')
之前,查看所有载入而未提交的变更内容。
最后一次提交之后的所有变更
现在,如果你想查看最后一次提交之后工作目录中文件的变更,你可以在git diff
之后加一个HEAD来进行比对:
1 | $ git diff HEAD |
适用情形:在运行git commit -a
之前。显示所有载入的和未载入的变更。
从一个特定点开始文件的修改情况
这也是最常见的一个问题。譬如,如何查看创建v1.6这个标签之后README文件所发生的修改呢,可以这样:
1 | $ git diff v1.6.0 -- README |
上面就显示出了工作目录中README文件的版本差异–如果你做了本地修改,载入或未载入,都会在这次比对中显示出来。
两次提交的差异比对
如果你想对两次快照做差异比对,也即项目的两个版本之间比对–直接在git diff
后跟上要比对的两个版本号即可:
1 | $ git diff v1.0 v1.1 |
diff命令加这样的参数,显示某些统计数,下面是显示v1.6.1.1和v1.6.1.2两个版本之间差异的统计数字:
1 | $ git diff v1.6.1.1 v1.6.1.2 --stat |
还可以深入查看某个具体文件的变更比对:
1 | $ git diff v1.6.1.1 v1.6.1.2 -- sha1_file.c |
执行之后会显示sha1_file.c文件在v1.6.1.1和v1.6.1.2两个版本之间的比对结果。
在合并某分支前查看变更内容
这是个比较奇怪的问题,因为如果你开始是工作在一个主分支上,而后生成了两个分支,如果直接对比快照的话,结果只会显示从一个状态到另一个状态的差异比对结果。
举例来说,如果你创建了一个dev
的分支,进入这个分支给lib/simplegit.rb
添加了一个函数,然后回到了master
分支,删除了README文件的一行,然后运行:
1 | $ git diff master dev |
结果会显示你给某个文件中添加了方法,还往README文件添加了一行内容。为什么会这样?因为对dev
分支来说,README文件还是原样,而在’master’上,你已经删掉了一行,这样直接对两个快照进行对比就好似’dev’分支添加了一行进去一样。你想查看的实际上是在创建dev分支之后在这条分支上的差异对比,所以应该执行这样的命令:
1 | $ git diff master...dev |
这就不会拿master分支上最后一个快照和dev分支上最后一个快照进行比对–而是用dev与master所交的那个分歧点和现在的dev分支上最后一个快照进行比对。在我们这个例子中,这样比对的结果是显示对那个文件添加了一个函数。如果你目前正处在master分支上,你可以运行:
1 | $ git diff ...dev |
跟上面的结果是一样的。所以,如果你想查看将要合并的某个分支会有什么样的变化,可以执行:
1 | $ git diff ...(branch) |
将branch替换为你想要合并的分支名即可。