现在的位置: 首页 > 综合 > 正文

显示两个版本间的差异

2013年11月27日 ⁄ 综合 ⁄ 共 1837字 ⁄ 字号 评论关闭
显示两个版本间的差异:
git diff rev1 rev2

git中的版本号

其中git的版本并不是一个类似于svn的数字编号,git中的版本号一般为特定的commit的id,如:
# git log
commit f22369978d8e054b8f032f36783a00a8476196a6              
<----这里的f22369978d8e054b8f032f36783a00a8476196a6就是一个版本

Author:XXX <XXXX@gmail.com>
Date:   Sun Jun 9 10:17:14 2013 +0800

git中的特殊符合HEAD

我们知道,在git中HEAD是指向当前分支的,或者当前分支的最后一个版本。如man手册中git对于HEAD符号的定义是:"indicates the head of the current branch."。
那么如果我们需要比较当前版本和上一个版本的差异,上面命令中的rev1就可以使用HEAD替代:
git diff HEAD rev2

简写版本

通过查看git diff的help说明,我们发现git diff有如下几种模式:
       git diff [options] [<commit>] [--] [<path>...]
       git diff [options] --cached [<commit>] [--] [<path>...]
       git diff [options] <commit> <commit> [--] [<path>...]
       git diff [options] [--no-index] [--] <path> <path>
其中,注意形式1和形式3,不同的是形式3有两个<commit>部分,而形式1只有一个<commit>部分,其说明如下:
This form is to view the changes you have in your working tree relative to the named <commit>.
因此,上面命令中的HEAD可以省去。
git diff rev2
【注】此处请注意是working tree,因此,如果要比较版本库中的最后一次版本和上一版本的差异,使用此命令的限制必须是working tree和版本库中保持一致,即使用git st查看没有任何改动。

超级简写版本

此处引入两个后缀符号:^和~,结合刚才的HEAD,即HEAD^和HEAD~。他们的说明如下:
<rev>^<n>
     A suffix ^ to a revision parameter means the first parent of that commit object.
^<n> means the <n>th parent, (i.e. <rev>^ is equivalent to
<rev>^1
). As a special rule, <rev>^0 means the commit itself. 
<rev>~<n>
      A suffix ~<n> to a revision parameter means the commit object that is the <n>th generation ancestor of the named commit object, following only the first parents. 
简单理解就是,当n等于1时或者省略时,HEAD^和HEAD~都表示是HEAD版本的父版本或上一版本;但是当n等于2时,表示的意义就有差异了。HEAD^2表示是当前版本的第二个父版本(用于分支合并时),而HEAD~2表示当前版本的上两个版本,即父版本的父版本。
因此,上面命令中的rev2可以替换为HEAD^或HEAD~,即完整命令为:
git diff HEAD^ 或 git diff HEAD~
【注】此处同样是working tree,因此,此命令的使用限制和上一个命令一致。
【注】关于<rev>^和<rev>~更详细的解释请参看git manual: https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html

最省事放心版本

结合HEAD和HEAD^的说明,如果我们需要比较两个版本的差异,即可使用如下命令:
     git diff HEAD HEAD~           比较当前版本和上一个版本的差异
或  git diff HEAD~1 HEAD~2     比较上一版本和上上个版本的差异
注:
由于我们使用git管理代码的规模较小,一般不会出现多继承的现象。即对于<rev>^<n>的使用场景较小

抱歉!评论已关闭.