Git “什么是”呢;吉特;获取单个提交X如何更改单个文件Y的统一差异的语法?

Git “什么是”呢;吉特;获取单个提交X如何更改单个文件Y的统一差异的语法?,git,Git,我正在编写代码以编程方式运行git命令,同时学习git。我是否误读了手册页,或者我想做的事情不可行 下面将告诉我MYFILE在两次提交之间是如何更改的: git diff COMMIT1..COMMIT2--MYFILE 好 但是,假设我只想询问COMMITX是如何更改文件的,而不指定之前的提交。在我的想象中,语法是这样的: git diff COMMITX -- MYFILE 或者这个: git diff COMMITX^..COMMITX -- MYFILE 但是上面的命令(对我)不起作

我正在编写代码以编程方式运行git命令,同时学习git。我是否误读了手册页,或者我想做的事情不可行

下面将告诉我MYFILE在两次提交之间是如何更改的:

git diff COMMIT1..COMMIT2--MYFILE

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

git diff COMMITX -- MYFILE
或者这个:

git diff COMMITX^..COMMITX -- MYFILE
但是上面的命令(对我)不起作用

从某种意义上说,下面的内容可以让我看到COMMITX如何改变了我的文件,但它也包括了我必须去掉的其他内容,比如作者、日期、签入消息。去掉多余的东西很容易,但感觉这是我不应该做的事情。该命令是否存在?我是不是误解了一些简单的事情

EDIT1:我在这里显示了“gitbash”窗口的实际输出。我将“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) $git show 789e9--dir1/file3.txt 提交789e948bce733dab9605bf8eb51584e3b9a2eba3 作者:科里 日期:2009年10月11日星期日21:54:14-0500 我的味精 diff——git a/dir1/file3.txt b/dir1/file3.txt 索引a351259..cf2bd35 100644 ---a/dir1/file3.txt +++b/dir1/file3.txt @@-4,5+4,7@@c ddd E F +新线 +另一条新路线 G H Administrator@BIOSTAR/c/temp/mygit(主) $git diff 789e9--dir1/file3.txt Administrator@BIOSTAR/c/temp/mygit(主)
git-diff-COMMIT^..COMMIT file
git-diff-COMMIT^..COMMIT--file
这两种方法在我使用git 1.6.3.3时都非常有效。Jakub Narębski提供的更新:您还可以编写
git diff COMMIT^--文件

尝试:

开始时仍然有一个空行(由于降价限制,此处未显示),但是
补丁
会很高兴地忽略这一点(实际上,它也会忽略默认
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格式补丁并享受它。第三方修补工具将很乐意忽略这些额外的元数据,对于使用git的项目,
git apply
将使用您提供的提交消息和作者行,使他们可以轻松地应用它。

您不必使用类似于
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之间)后起了作用——在此之前进行测试对我来说是一件痛苦的事。

我通常只是这样做:

git diff > unified.diff

然后在我最喜欢的unified diff viewer中打开它。

git diff显示从当前工作树到提交的差异,不是从提交到其父级的更改如果有一个扩展来允许
git diff^..commit
作为对
svn diff-c rev
的模拟,那将是非常可爱的:)虽然我的问题不是其他stackoverflow问题的完全重复,但它是类似的。基于svn类比,我认为git是可预测的,这是不公平的,但如果一个git命令的行为基于其他git命令的行为更加可预测,那就更好了。@bdonlan:这只是默认的操作模式。查看手册页的顶部部分。它可以显示两个任意树(例如提交)之间的差异,一个树和工作树,一个树和索引,或者索引和工作树。@hobbs:有,它被称为
git diff COMMIT^(参见git rev parse手册,章节“Specyfying ranges”)。看起来它正在工作。我接受了你的答案,回到“git show”手册页,在我刚刚开悟的状态下,我试着看看我是否能在页面上“看到”你的答案,你的答案完全知道我在寻找什么。仍然很棘手->格式:根本没有格式规范。对于额外的积分,“作者”和“提交人”之间的区别是什么?这里找到了作者/提交人区别的解释:这真是太过分了,除非你真的试图创建一个提交补丁,如果你只是分散一个文件,这是不可能的
git diff
设计用于做很多事情,包括这项任务。我知道您已经接受了答案,但我想确保您知道-这完全可以通过
git diff
实现。看下面!“git diff COMMIT--FILE”将COMMIT中的文件版本与工作区中的文件版本进行比较。。。这不是你想要的。@Jerromi-请看我对你答案的评论。对我来说不起作用。事实上,“git diff A..B”相当长一段时间以来一直作为“git diff A B”工作,主要是为了将“n”粘贴修订[range]剪切到dif,例如从git fetch输出。“git diff”文档中说,“COMMIT..COMMIT”是“以前的表单”“COMMIT COMMIT”的同义词。当我写“提交^”时,这两种方法都不适用于我。当我实际直接指定之前的提交时,这两种方法都是一样的。我在windows上使用msysgit,git版本1.6.4。回顾您所有的测试用例,看起来
diff
工作正常,但可能修订解析不正常-提交^COMMIT在其他上下文中工作吗?@Corey Trager:您使用git的shell是什么?可能是您的shell对
^
和/或
执行了一些奇怪的操作字符
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;
        }
        ;
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 diff COMMITX^ COMMIT -- MYFILE
git diff > unified.diff