查看更改前更改的未提交git文件的外观

查看更改前更改的未提交git文件的外观,git,Git,假设我有一个文件target.json,我在很多地方对它进行了更改。它是repo中已经存在的许多文件之一,自上次提交以来,我已经更改了这些文件。这些文件可以被暂存,也可以不暂存 要查看对文件所做的更改,我可以执行以下操作: git diff target.json 这主要显示文件上的增量。如果我想在进行当前本地更改之前查看文件的版本,该怎么办?也就是说,从最新的commit开始浏览文件diff添加了大量噪声,使得在更改之前很难看到文件。我也无法在责怪上找到一个标志来满足我的要求。我可以想出以下

假设我有一个文件
target.json
,我在很多地方对它进行了更改。它是repo中已经存在的许多文件之一,自上次提交以来,我已经更改了这些文件。这些文件可以被暂存,也可以不暂存

要查看对文件所做的更改,我可以执行以下操作:

git diff target.json
这主要显示文件上的增量。如果我想在进行当前本地更改之前查看文件的版本,该怎么办?也就是说,从最新的
commit
开始浏览文件
diff
添加了大量噪声,使得在更改之前很难看到文件。我也无法在
责怪
上找到一个标志来满足我的要求。我可以想出以下方法:

  • stash
    保存更改,查看
    target.json
    ,然后
    pop
    保存
    stash
    。我以前也这样做过
  • 提交
    更改,
    签出
    以前的
    提交
    ,查看
    目标.json
    ,删除最新的
    提交
    。这看起来很难看
  • 复制
    target.json
    ,删除对文件所做的更改,查看文件,
    mv
    复制到
    target.json
    。这听起来也像我过去做过的事情

有没有更优雅的方法?感觉我缺少了一些明显的内容

git show HEAD:target.json
将打印出包含在由
HEAD
标识的提交中的文件
target.json
的内容。类似地,
git show hash:target.json
将显示指定的
hash
中包含的文件
target.json
的内容。有关拼写特定提交的完整方法列表,请参阅;其中大部分在这里工作

git show:target.json
将打印出索引(也称为暂存区)中包含的文件
target.json
的内容;如果它与
HEAD:target.json
和名为
target.json
的工作树文件都不同,那么这非常有用

在冲突合并期间,索引/暂存区将容纳(最多)三份
target.json
,您可以通过
1:target.json
(合并基本版本)、
2:target.json
HEAD
--ours
版本)和
3:target.json
--theres
版本)访问它们。这或多或少也是
git mergetool
的工作原理:它将所有三个文件提取到临时文件中。(它使用
git checkout index--all--temp
而不是
git show
,因为这更适合它的脚本代码,但原理是一样的。)


注意:如果您在
.gittributes
或类似文件中定义了CRLF修改和/或污迹过滤器,
git show
用于不应用这些内容。现代Git可以被告知使用它们(
--textconv
)或不使用它们(
--no textconv
),但通常默认情况下应该做明智的事情。

Git show HEAD:target.json
将打印
HEAD
标识的提交中包含的文件
target.json
的内容。类似地,
git show hash:target.json
将显示指定的
hash
中包含的文件
target.json
的内容。有关拼写特定提交的完整方法列表,请参阅;其中大部分在这里工作

git show:target.json
将打印出索引(也称为暂存区)中包含的文件
target.json
的内容;如果它与
HEAD:target.json
和名为
target.json
的工作树文件都不同,那么这非常有用

在冲突合并期间,索引/暂存区将容纳(最多)三份
target.json
,您可以通过
1:target.json
(合并基本版本)、
2:target.json
HEAD
--ours
版本)和
3:target.json
--theres
版本)访问它们。这或多或少也是
git mergetool
的工作原理:它将所有三个文件提取到临时文件中。(它使用
git checkout index--all--temp
而不是
git show
,因为这更适合它的脚本代码,但原理是一样的。)


注意:如果您在
.gittributes
或类似文件中定义了CRLF修改和/或污迹过滤器,
git show
用于不应用这些内容。现代Git可以被告知使用它们(
--textconv
)或不使用它们(
--no textconv
),但一般来说,默认情况下应该做明智的事情。

大多数好的IDE(例如IntelliJ)都有Git插件,这些插件可以显示修改文件的前后。没错,我应该在我的IDE上做这件事。但是在终端上应该有一种简单的方法。这里可能有一种方法可以通过终端来实现这一点,但这不是我想在这里使用的工具。随便看看,你可能会找到你问题的答案。会的,谢谢你的帮助。漂亮的秘密帽子顺便说一句!大多数优秀的IDE(例如IntelliJ)都有Git插件,其中包括可以显示修改文件的前后。但是在终端上应该有一种简单的方法。这里可能有一种方法可以通过终端来实现这一点,但这不是我想在这里使用的工具。随便看看,你可能会找到你问题的答案。会的,谢谢你的帮助。漂亮的秘密帽子顺便说一句!美丽的!这正是我想要的。在发布之前,如果git show没有列出要显示的内容(
git show
将尝试依次查找和显示这些内容),那么尝试使用的
git show HEAD target.json
绝对不会想到使用
这种特定语法会非常合理。不过,您可以从这里文档页面的概要部分看出。Beaut