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

Cor*_*ger 4 git

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

以下将告诉我两个提交之间MYFILE如何变化:

git diff COMMIT1..COMMIT2 - MYFILE

好.

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

git diff COMMITX -- MYFILE
Run Code Online (Sandbox Code Playgroud)

或这个:

git diff COMMITX^..COMMITX -- MYFILE
Run Code Online (Sandbox Code Playgroud)

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

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

git show COMMITX -- MYFILE
Run Code Online (Sandbox Code Playgroud)

编辑1:我在这里显示我的"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)

hob*_*bbs 5

git diff COMMIT^..COMMIT file或者git diff COMMIT^..COMMIT -- file两者都适用于git 1.6.3.3.更新由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
[...]
Run Code Online (Sandbox Code Playgroud)


bdo*_*lan 5

尝试:

git show --pretty=format: <commitid> -- <file>
Run Code Online (Sandbox Code Playgroud)

以下是它的外观:

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;
        }
        ;
Run Code Online (Sandbox Code Playgroud)

在开始时仍然只有一个空白行(由于降价限制,此处未显示),但很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;
        }
        ;
Run Code Online (Sandbox Code Playgroud)

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