我进行了一些更改以提交。如何查看为下一次提交准备的所有文件的差异?有一个方便的内衬吗?
gitstatus只显示暂存文件的名称,但我想查看实际的差异。
gitdiff(1)手册页显示:
git diff[--选项][--][…]此表单用于查看相对于索引所做的更改(下一次提交的暂存区域)。换句话说,这些差异是您可以告诉git进一步添加到索引中的,但您仍然没有。您可以使用gitadd(1)暂存这些更改。
我进行了一些更改以提交。如何查看为下一次提交准备的所有文件的差异?有一个方便的内衬吗?
gitstatus只显示暂存文件的名称,但我想查看实际的差异。
gitdiff(1)手册页显示:
git diff[--选项][--][…]此表单用于查看相对于索引所做的更改(下一次提交的暂存区域)。换句话说,这些差异是您可以告诉git进一步添加到索引中的,但您仍然没有。您可以使用gitadd(1)暂存这些更改。
应该是:
git diff --cached
--缓存的方法显示缓存/索引中相对于当前HEAD的变化(即阶段性变化)--staged是--cached的同义词。
--staged和--cached并不指向HEAD,只是和HEAD不同。如果您使用git-add--patch(或git-add-p)选择要提交的内容,--staged将返回所提交的内容。
简单的图形使这一点更加清晰:
差异比较
显示工作目录和索引之间的更改。这将显示已更改但未准备提交的内容。
git diff—缓存
显示索引和HEAD之间的更改(这是该分支上的最后一次提交)。这将显示已添加到索引中并为提交而暂存的内容。
git diff头
显示工作目录和HEAD之间的所有更改(包括索引中的更改)。这将显示自上次提交以来的所有更改,无论它们是否为提交而暂存。
也:
365Git上有更多细节。
如果您对视觉并排视图感兴趣,漫反射视觉差异工具可以做到这一点。如果某些但不是所有更改都被分段,它甚至会显示三个窗格。在冲突的情况下,甚至会有四个窗格。
使用调用它
diffuse -m
在Git工作副本中。
如果你问我,这是我十年来见过的最好的视觉差异。此外,它并不是特定于Git的:它可以与过多的其他VCS进行互操作,包括SVN、Mercurial、Bazaar等。。。
另请参阅:在gitdiff中显示暂存树和工作树?
注意,gitstatus-v还显示了阶段性的更改!(这意味着您需要进行阶段性的--git-add--一些更改。没有阶段性的更改,没有与git-status-v的差异。自2006年2月Git 1.2.0以来,它就做到了这一点)
在其长格式(默认)中,gitstatus有一个未记录的“verbose”选项,它实际上显示了HEAD和索引之间的差异。
它将变得更加完整:请参阅“在gitdiff中显示阶段树和工作树?”(git2.3.4+,2015年第二季度):
git status -v -v
如果您的意图是将目标推送到远程回购分支,并且提交更改日志的第一次传递不完整,则可以在这样推送之前更正提交语句。
本地
…进行一些更改。。。
git diff # look at unstaged changes
git commit -am"partial description of changes"
…回忆更多提交中未提及的更改。。。
gitdifforigin/master#查看暂存但未推送的更改
…修改分段提交语句。。。
git commit --amend -m"i missed mentioning these changes ...."
git push
gitgui和gitcola是图形实用程序,可用于查看和操作索引。两者都包括用于暂存文件的简单视觉差异,git-cola还可以推出更复杂的并排视觉差异工具。
在如何从git中的索引中删除文件?,以及Git-GUI客户端的官方目录。
您可以使用此命令。
git diff --cached --name-only
gitdiff的--cached选项表示获取暂存文件,--name only选项表示只获取文件的名称。
对于临时区域与存储库(上次提交)的比较,请使用
$ git diff --staged
该命令将暂存的($git add fileName)更改与上次提交进行比较。如果你想看到你已经准备好了什么,然后再提交,你可以使用git diff--staged。此命令将暂存的更改与上次提交进行比较。
用于工作与暂存比较
$ git diff
该命令将工作目录中的内容与暂存区域中的内容进行比较。需要注意的是,gitdiff本身不会显示自上次提交以来所做的所有更改 — 只有未标记的更改。如果您已经暂存了所有更改($git-add-fileName),git-diff将不会给您任何输出。
此外,如果您暂存一个文件($git-add-fileName),然后对其进行编辑,则可以使用gitdiff查看暂存文件中的更改和未暂存的更改。
使用视觉差异工具
默认答案(在命令行)
此处的顶部答案正确显示了如何查看索引中缓存/暂存的更改:
$ git diff --cached
或$gitdiff——暂存,它是一个别名。
改为启动Visual Diff工具
默认答案将在gitbash(即在命令行或控制台中)输出diff更改。对于那些喜欢可视化表示分段文件差异的人,git中有一个脚本,它为每个查看的文件启动一个可视化差异工具,而不是在命令行上显示它们,称为difftool:
$ git difftool --staged
这将执行与git diff相同的操作——staged,但无论何时运行diff工具(即,每次diff处理文件时),它都将启动默认的可视化diff工具。(在我的环境中,这是VS代码,使用代码可执行文件)。
工具启动后,git diff脚本将暂停,直到您的可视化diff工具关闭。因此,您需要关闭每个文件才能看到下一个文件。
您可以始终使用difftool代替git命令中的diff
对于所有的视觉差异需求,gitdifftool将代替任何gitdiff命令,包括所有选项。
例如,要在不询问是否对每个文件执行此操作的情况下启动visualdiff工具,请添加-y选项(我认为通常您会希望这样做!!):
$ git difftool -y --staged
在这种情况下,它将一次一个地在视觉差异工具中提取每个文件,并在工具关闭后打开下一个文件。
或者查看在索引中暂存的特定文件的差异:
$ git difftool -y --staged <<relative path/filename>>
有关所有选项,请参阅手册页:
$ git difftool --help
设置Visual Git工具
要使用非默认的可视化git工具,请使用-t<tool>选项:
$ git difftool -t <tool> <<other args>>
或者,请参阅difftool手册页,了解如何配置git以使用不同的默认视觉差异工具。
vscode的示例.gitconfig条目作为diff/mmerge工具
设置difftool的一部分涉及更改.gitconfig文件,可以通过git命令在后台更改,也可以直接编辑。
您可以在主目录中找到.gitconfig,例如Unix中的~或Windows中的c:\users\<username>)。
或者,您可以使用Git-config-e-global在默认Git编辑器中打开user.gitconfig。
下面是我的全局用户.gitconfig中作为diff工具和merge工具的VS代码的示例条目:
[diff]
tool = vscode
guitool = vscode
[merge]
tool = vscode
guitool = vscode
[mergetool]
prompt = true
[difftool "vscode"]
cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
path = c:/apps/vscode/code.exe
[mergetool "vscode"]
cmd = code --wait \"$MERGED\"
path = c:/apps/vscode/code.exe
默认情况下,gitdiff用于显示未添加到git更新文件列表中的更改。但是,如果您想显示添加或分段的更改,则需要提供额外的选项,让git知道您对分段或添加的文件diff感兴趣。
$ git diff # Default Use
$ git diff --cached # Can be used to show difference after adding the files
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git
实例
$ git diff
diff --git a/x/y/z.js b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {
- if (a)
+ if (typeof a !== 'undefined')
res = 1;
else
res = 2;
$ git add x/y/z.js
$ git diff
$
一旦你添加了文件,你就不能使用默认的“gitdiff”。你必须这样做:-
$ git diff --cached
diff --git a/x/y/z.js b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {
- if (a)
+ if (typeof a !== 'undefined')
res = 1;
else
res = 2;
Emacs中的Magit模式是另一个让这变得简单的工具。它的默认视图列出了暂存和未暂存的更改。它就像类固醇上的git add-p,因为您可以使用编辑器命令轻松地分段或取消分段大块(甚至是单行代码)。了解标准的git瓷器很重要,但我很少再使用git diff缓存。
https://magit.vc/
要查看特定阶段文件的差异,可以使用
git diff --staged -- <path>...
例如
git diff --staged -- app/models/user.rb