我正在编写代码来以编程方式运行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)
答案 0 :(得分:5)
git diff COMMIT^..COMMIT file
或git 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
然后在我最喜欢的统一差异查看器中打开它。