如何在提交之前在git中查看文件差异


443

这经常发生在我身上:

我在一两天内同时进行了一些相关的更改,但是到了该提交的时候,我最终忘记了特定文件中的更改。(这只是个人的git存储库,因此我可以在一次提交中进行多个更新。)

有什么办法可以预览要检入的本地文件与该文件的最后一次提交之间的更改?

就像是:

git diff --changed /myfile.txt

它会打印出类似以下内容:

line 23
  (last commit): var = 2+2
  (current):     var = myfunction() + 2

line 149
  (last commit): return var
  (current):     return var / 7

这样,我可以快速查看自上次签入该文件以来在该文件中所做的事情。

Answers:


732

如果您想查看git add尚未阅读的内容:

git diff myfile.txt

或者如果您想查看已经添加的更改

git diff --cached myfile.txt

20
退房git add -p。查看每个更改,有选择地批准更改到阶段,如果您改变主意,则随时中止,甚至内联编辑块。我永远不会git add没有它。
凯尔·贝克

2
如何退出文件?
Kick Buttowski

3
@Kick尝试按q
wjandrea '19

另外,如果要在差异结果中删除愚蠢的'a /'和'b /'前缀,则可以设置git config --global diff.noprefix true

64
git diff HEAD file

将显示您从上次提交添加到工作树中的更改。将显示所有更改(已暂存或未暂存)。


1
您的解决方案有效。但是我有点困惑。HEAD指向最新的提交编号。因此,当我们git add时,工作目录的索引将更新,而不是HEAD。那么如何显示差异。
Mav55

17

要检查局部差异:

git diff myfile.txt

或者,您也可以使用差异工具(以防您要恢复某些更改):

git difftool myfile.txt

git difftool更有效地使用,请安装并使用您喜欢的GUI工具,例如Meld,DiffMerge或OpenDiff。

注意:您也可以使用.(而不是文件名)查看当前目录更改。

为了检查每行的更改,请使用:git blame它将显示在哪一次提交中提交了哪一行。


要在提交之前查看实际文件(master您的分支在哪里),请运行:

git show master:path/my_file

15

你试过了吗 -v(或--verbose)选项git commit?它在消息编辑器中添加提交的差异。


好答案。这样可以在提交编辑器中提供信息,使我更轻松地提交。有什么办法可以关闭其信息区域,Changes not staged for commit:从而使提交编辑器更干净。
Radian Jheng

15

如果您想将文件与上一次提交进行比较,则可以考虑另一种技巧:

git diff master myfile.txt

这种技术的优点是您还可以将倒数第二次提交与以下内容进行比较:

git diff master^ myfile.txt

和之前的那个:

git diff master^^ myfile.txt

如果您不在master分支上,也可以用'〜'代替插入号'^'字符,用'you branch name'代替'master'。


14

我认为这是保证GUI的完美用例。-尽管我完全理解,在命令行中也可以很好地实现它。

就个人而言,我的每一次提交,我都是从git-gui中完成的。如果可行,我可以在其中使用单独的块/行进行多个原子提交。

Gut Gui可以在格式良好的彩色界面中查看差异,相当轻。看起来这也是您也应该结帐的内容。


我同意-它也允许您在查看差异时编辑提交消息。
弗朗索瓦

很高兴知道,但是我想坚持使用CLI。我已经使用了几个包含它的软件包,但是对于我的工作流程,我已经严格地转移到了终端/ vim。不过谢谢
Sauce McBoss '04年

是的,如果您坚持使用GUI,那么有很多很酷的功能git bisect实际上是无法访问的。
NoBugs 2014年

2
我同意-有许多选项可以更快,更合理地使用命令行。但是,预览更改不是其中之一。
VitalyB 2015年

还有在终端中运行的文本用户界面。值得一看的是tig“ Git的文本模式界面”。
smido

10

在macOS上,转到git根目录并输入 git diff *


是的,我刚刚对其进行了测试。您安装了git吗?有任何错误讯息吗?也许会对此提出一个新的问题。
catanore

4

除了使用专用的提交GUI之外,我发现的最佳方法是使用git difftool -d-这将以目录比较模式打开diff工具,将HEAD与当前脏文件夹进行比较。


正是我需要的。谢谢
伊万·费雷尔

3
git difftool -d HEAD filename.txt

这显示了在终端中使用VI狭缝窗口进行的比较。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.