什么是“git”语法,只获得单个提交X如何更改单个文件Y的统一差异?

时间:2009-10-17 01:35:14

标签: git

我正在编写代码来以编程方式运行git命令并同时学习git。我错误地阅读了手册页,还是我想做的不可行?

以下将告诉我MYFILE如何在两次提交之间发生变化:

  

git diff COMMIT1..COMMIT2 - MYFILE

好。

但是,假设我只想询问COMMITX如何更改文件,而不指定先前的提交。在我的想象中,语法将是这样的:

git diff COMMITX -- MYFILE

或者这个:

git diff COMMITX^..COMMITX -- MYFILE

但上述命令不起作用(对我而言)。

下面的工作在某种意义上它给了我统一的差异,显示了COMMITX如何改变MYFILE,但它还包括我必须删除的其他东西 - 比如作者,日期,签到消息。剥离额外的东西很容易,但感觉这是我不应该做的事情。该命令是否存在?我误解了一些简单的事情吗?

git show COMMITX -- MYFILE

EDIT1:我在这里显示了我的“git bash”窗口的实际输出。我将“show”改为“diff”,没有输出。

$ git show 789e9 -- dir1/file3.txt
commit 789e948bce733dab9605bf8eb51584e3b9a2eba3
Author: corey 
Date:   Sun Oct 11 21:54:14 2009 -0500

    my msg

diff --git a/dir1/file3.txt b/dir1/file3.txt
index a351259..cf2bd35 100644
--- a/dir1/file3.txt
+++ b/dir1/file3.txt
@@ -4,5 +4,7 @@ c
 ddd
 e
 f
+a new line
+another new line
 g
 h

Administrator@BIOSTAR /c/temp/mygit (master)
$ git diff 789e9 -- dir1/file3.txt

Administrator@BIOSTAR /c/temp/mygit (master)

4 个答案:

答案 0 :(得分:5)

使用git 1.6.3.3,

git diff COMMIT^..COMMIT filegit diff COMMIT^..COMMIT -- file对我来说都非常有效。 更新由JakubNarębski提供:你也可以写git diff COMMIT^! -- file

$ git log --oneline b8ad655^!
b8ad655 Bring in the "SimpleMenu" loader plugin


$ git diff b8ad655^! lib/WWW/MenuGrinder/Plugin/SimpleLoader.pm
diff --git a/WWW-MenuGrinder/lib/WWW/MenuGrinder/Plugin/SimpleLoader.pm b/WWW-MenuGrinder/lib/WWW/MenuGrinder/Plugin/SimpleLoader.pm                                                                                                                        
new file mode 100644                                                                                                          
index 0000000..14f6cd8                                                                                                        
--- /dev/null                                                                                                                 
+++ b/WWW-MenuGrinder/lib/WWW/MenuGrinder/Plugin/SimpleLoader.pm
[...]

答案 1 :(得分:5)

尝试:

git show --pretty=format: <commitid> -- <file>

以下是它的外观:

diff --git a/config.y b/config.y
index 7750514..f051b99 100644
--- a/config.y
+++ b/config.y
@@ -454,8 +454,8 @@ definegame : TYPE_DEFINE_GAME '{'
        }
        game_definitions '}'
        {
-           num_games = ncnf;
            ncnf++;
+           num_games = ncnf;
        }
        ;

开头还有一个空白行(由于降价限制,此处未显示),但patch会很乐意忽略它(实际上,它也会忽略默认git show输出中的标题内容)。您也可以通过tail -n +2来删除该行。

--pretty=oneline也很有用:

3ed347de4c6e0e3230f651f82aabf964c6d16100 Fix a bug where more than one defined game didn't show up or showed gibberish
diff --git a/config.y b/config.y
index 7750514..f051b99 100644
--- a/config.y
+++ b/config.y
@@ -454,8 +454,8 @@ definegame : TYPE_DEFINE_GAME '{'
        }
        game_definitions '}'
        {
-           num_games = ncnf;
            ncnf++;
+           num_games = ncnf;
        }
        ;

那就是说,如果你要在某个地方格式化提交补丁,剥离那些东西。事实上,使用git format-patch并陶醉其中。第三方修补工具将很乐意忽略这些额外的元数据,对于使用git的项目,git apply将使用您提供的提交消息和作者行,使他们可以轻松应用它。

答案 2 :(得分:1)

您不必使用git-show之类的解决方法 - 您的语法略有偏差。 git-diff显示两个命名提交之间的差异。另一方面,..表示“......之间的提交范围”。正确的语法是:

git diff COMMITX^ COMMIT -- MYFILE

也就是说,..确实对我有效。 (我在git.git中测试了git diff master^..master -- git-add--interactive.perl)它可能并不总是这样,但它至少起作用,因为git转移到索引版本2(在v1.5.1和v1.5.2之间) - 它是在此之前我要耐心等待。

答案 3 :(得分:0)

我通常只是这样做:

git diff > unified.diff

然后在我最喜欢的统一差异查看器中打开它。