专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » gitgit:Git教程( 7) Git差异比对 »正文

gitgit:Git教程( 7) Git差异比对

来源: 发布时间:星期日, 2009年12月20日 浏览:0次 评论:0
  在‘git日志’课中我们通过'git log -p'命令来显示每次提交和其父节点提交内容的间快照差异这节课介绍'df'命令会实现类似功能---用种统格式来显示两个快照或文件的间差异这节课就向你展示如何使用df命令

  查看变更还未载入(changed but unstaged)文件比对

  最常见种情况是使用'git df'查看工作目录中某个还未载入(stage)文件差异

  实验方案:

  1.修改下simplegit.rb添加个思路方法

  2.然后在README文件中添加个作者

  3.然后我们用'git add'命令把README文件载入(stage)

  4.运行'git status'会显示README载入了而simplegit.rb只是修改了还未载入

$ vim lib/simplegit.rb
$ vim README
$ git add README
$ git status
# On branch master
# Changes to be committed:
#   (use "git re HEAD <file>..." to unstage)
#
# modied:   README
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
# modied:   lib/simplegit.rb
#


  那么我现在想查看下对simplegit.rb文件究竟做了什么改动?在我载入的前如何查看这些改动内容呢?答案是只需运行不带任何参数'git df'命令即可:

$ git df
df --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..8ac6604 100644
--- a/lib/simplegit.rb
+ b/lib/simplegit.rb
@@ -25,6 +25,10 @@  SimpleGit
     command("git log -n 25 #{treeish}")
   end 
+  def log_single(branch = 'master')
+    command("git log --pretty=oneline #{branch}")
+  end
+
   def blame(path)
     command("git blame #{path}")
   end


  这样就可以看到我添加到文件中内容现在我可以决定是不是要将其载入了注意README文件修改并没有显示出来

  查看载入(stage)而并未提交(commit)变更

  为了查看载入(staged)而并未提交(not committed)内容差异可以使用'git df --stage'命令(在git 1.6的前版本中使用'--cached')

$ git df --staged
df --git a/README b/README
index c526f88..879f0d4 100644
--- a/README
+ b/README
@@ -8,3 +8,4 @@ It is an example for the Git Peepcode book that I'm currently writin
 Author : Scott Chacon ([email protected])
          Orange Peel Chacon ([email protected])
          Magnus O. Chacon ([email protected])
+         Josephine Chacon ([email protected])


  适应情形:在运行git commit(不带'-a')的前查看所有载入而未提交变更内容

  查看在最后次提交的后所有变更

  现在如果你想查看最后次提交的后工作目录中文件变更你可以在git df的后加个HEAD来进行比对:

$ git df HEAD
df --git a/README b/README
index c526f88..879f0d4 100644
--- a/README
+ b/README
@@ -8,3 +8,4 @@ It is an example for the Git Peepcode book that I'm currently writin
 Author : Scott Chacon ([email protected])
          Orange Peel Chacon ([email protected])
          Magnus O. Chacon ([email protected])
+         Josephine Chacon ([email protected])
df --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..8ac6604 100644
--- a/lib/simplegit.rb
+ b/lib/simplegit.rb
@@ -25,6 +25,10 @@  SimpleGit
     command("git log -n 25 #{treeish}")
   end 
+  def log_single(branch = 'master')
+    command("git log --pretty=oneline #{branch}")
+  end
+
   def blame(path)
     command("git blame #{path}")
   end


  适用情形:在运行'git commit -a'的前显示所有载入和未载入变更

  在本教程'ermediate'课中会详细讲述HEAD在git中含义在这里要注意点是HEAD含义跟SVN中 HEAD含义大不相同在git中HEAD和你目前所处分枝最后次提交相关和每个用户本地仓库相关在区别分枝间切换时它也会发生改变

  上面是使用'df'时最常用 3条命令

  从个特定点开始文件修改情况

  这也是最常见个问题譬如如何查看创建v1.6这个标签的后README文件所发生修改呢可以这样:

$ git df v1.6.0 -- README 
df --git a/README b/README
index 548142c..5fa41b7 100644
--- a/README
+ b/README
@@ -24,7 +24,7 @@ It was originally written by Linus Torvalds with help of a group o
 hackers around the net. It is currently tained by Junio C Hamano. 

 Please read the file INSTALL for ation instructions.
-See Documentation/tutorial.txt to get started, then see
+See Documentation/gittutorial.txt to get started, then see
 Documentation/everyday.txt for a useful minimum  of commands,
 and "man git-commandname" for documentation of each command.


  上面就显示出了工作目录中README文件版本差异--如果你做了本地修改载入或未载入都会在这次比对中显示出来

  两次提交差异比对

  如果你想对两次快照做差异比对也即项目两个版本的间比对--直接在git df后跟上要比对两个版本号即可:

  $ git df v1.0 v1.1

  如果这两个版本分别在两个目录中直接运行unix'df'工具进行比对也可以

  上节课在介绍log命令时讲过格式化参数譬如-stat在这里也可以对git df命令加这样参数显示某些统计数下面是显示v1.6.1.1和v1.6.1.2两个版本的间差异统计数字:

$ git df v1.6.1.1 v1.6.1.2 --stat
 Documentation/RelNotes-1.6.1.2.txt |   39 +
 Documentation/config.txt           |    4 +-
 Documentation/git-ls-tree.txt      |    8 +-
 GIT-VERSION-GEN                    |    2 +-
 RelNotes                           |    2 +-
 builtin-commit.c                   |    6 
 builtin-gc.c                       |    8 -
 builtin-grep.c                     |   15 +-
 builtin-log.c                      |   28 +-
 builtin-ls-tree.c                  |    7 -
 builtin-send-pack.c                |   43 +--------
 dfcore-rename.c                  |    9 +-
 git-sh-up.sh                    |    2 +-
 sha1_file.c                        |    3 +-
 sha1_name.c                        |    2 +-
 t/t2300-cd-to-toplevel.sh          |    4 +-
 t/t4014-format-patch.sh            |   52 +-
 t/t5519-push-alternates.sh         |  106 
 t/t7002-grep.sh                    |    7 +
 test-path-utils.c                  |    2 +-
 20 files changed, 306 insertions(+), 43 deletions(-)


  还可以深入查看某个具体文件变更比对:

$ git df v1.6.1.1 v1.6.1.2 -- sha1_file.c
df --git a/sha1_file.c b/sha1_file.c
index 52d1ead..ce5ea12 100644
--- a/sha1_file.c
+ b/sha1_file.c
@@ -2337,7 +2337,8 @@   create_tmpfile(char *buffer, size_t bufsiz, const c
   write_loose_object(const unsigned char *sha1, char *hdr,  hdrlen,
                              void *buf, unsigned long len, time_t mtime)
 {
-        fd, size, ret;
+        fd, ret;
+       size_t size;
        unsigned char *compressed;
        z_stream stream;
        char *filename;


  执行的后会显示sha1_file.c文件在v1.6.1.1和v1.6.1.2两个版本的间比对结果

  在合并某分枝前查看变更内容

  这是个比较奇怪问题如果你开始是工作在个主分枝上而后生成了两个分支如果直接对比快照结果只会显示从个状态到另个状态差异比对结果

  举例来说如果你创建了个'dev'分枝进入这个分枝给lib/simplegit.rb添加了然后回到了'master'分枝删除了README文件然后运行:

$ git df master dev

  结果会显示你给某个文件中添加了思路方法还往README文件添加了行内容为什么会这样?对'dev'分枝来说README文件还是原样而在 'master'上你已经删掉了这样直接对两个快照进行对比就好似'dev'分枝添加了行进去你想查看实际上是在创建dev分枝的后在这条分枝上差异对比所以应该执行这样命令:



$ git df master...dev

  这就不会拿master分枝上最后个快照和dev分枝上最后个快照进行比对--而是用dev和master所交那个分歧点和现在dev分枝上最后个快照进行比对在我们这个例子中这样比对结果是显示对那个文件添加了如果你目前正处在master分枝上你可以运行:

$ git df ...dev

  跟上面结果是所以如果你想查看将要合并某个分枝会有什么样变化可以执行:

$ git df ...(branch)

  将branch替换为你想要合并分枝名即可



标签:gitgit
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: