在提交到git之前,如何查看文件中的更改?


351

我注意到在处理一张或两张票时,如果我走开,我不确定自己在做什么,发生了什么变化等。

有没有办法查看在git add然后git commit之前对给定文件所做的更改?

Answers:


525

您正在寻找git diff。根据您的实际情况,有三种有用的使用方式:

# show differences between index and working tree
# that is, changes you haven't staged to commit
git diff [filename]
# show differences between current commit and index
# that is, what you're about to commit
# --staged does exactly the same thing, use what you like
git diff --cached [filename]
# show differences between current commit and working tree
git diff HEAD [filename]

它将在目录上递归工作,如果没有给出路径,它将显示所有更改。


1
@ sveilleux2不,只运行不带任何参数的git diff-答案的最后一句话说,如果没有给出路径,它将显示所有更改。(方括号上的括号[filename]表示可选参数。)使用,*shell会列出所有文件,因此,如果您位于子目录中,则只会在该子目录中获取内容(而不是整个存储库),并且会丢失隐藏文件中的更改。
卡斯卡贝尔

#显示当前提交和索引之间的差异#即您将要提交的内容git diff --cached [filename]不是您的意思:#显示当前提交和索引之间的差异#即您要进行的要?git diff --cached [filename]
ofarooq '17

3
要查看添加文件后的差异(即在“ git add”之后),请执行“ git diff --staged [filename]”
Sidtharthan

哦,为什么这么复杂?如果我们有几个十几个文件?..只是抱怨混帐接口...是啊,看来,git add -p是检查所有文件的替代品。
Kirby

@Jefromi-请考虑添加git diff --staged [filename]您的主要答案,因为这是最经常需要的情况。
拉撒路·瑟斯顿



8

对我git add -p来说,复查所有未分段的更改(显示每个文件的差异)是最有用的方式(我想由git开发人员使用吗?),选择一组应该进行提交的良好更改,然后暂存所有这些内容,然后使用git commit,并重复下一次提交。然后,即使每次提交都发生在各种文件中,您也可以使它们成为有用或有意义的更改。我还建议为每个故障单或类似的活动创建一个新分支,并使用checkoutgit stash在切换之前不希望使用,也许使用)在它们之间进行切换,尽管如果要进行许多快速更改,这可能会很麻烦。不要忘记经常合并。


因此,使用git add -p代替git add文件名?
蒂莫西T.15年

1
git add -p是分段的组合,可以看到可以分段的更改并以交互方式逐一选择。有关git add -p的更多信息,请参见在Git中仅提交文件的一部分
Angelos Asonitis

5

git diff

显示工作树与索引或树之间的更改,索引与树之间的更改,两棵树之间的更改或磁盘上两个文件之间的更改。


引号有点太多-默认情况下,它执行第一个比较:工作树和索引之间。
卡斯卡贝尔

4

请记住,您是在提交更改,而不是文件。

因此,很少使用git add -p(或等效于magit的)我没有添加更改。


2
混帐确实变化在于处理-试图去想它,就好像它是混淆和错误的主要来源。git处理快照。
克里斯·多德

3
git diff <path>/filename

path可以是直到文件的完整系统路径,或者
如果您在项目中,则还可
以为使用path 的修改文件粘贴修改后的文件路径:git status


2

好吧,我的情况是您不想关心文件列表。只显示它们全部。

当您已经运行git add了文件列表时:

$ git diff --cached $(git diff --cached --name-only)

在的最新版本中git,您也可以使用--staged,这是的同义词--cached

相同的方法可用于尚未添加文件但没有--cached选项的情况。

$ git diff $(git diff --name-only)

Git的“ cached”选项别名:

$ git config --global alias.diff-cached '!git diff --cached $(git diff --cached --name-only)'

3
感谢您提供的详细信息git diff --cached --name-only是我正在寻找的命令...
Doogle

1

转到各自的git repo,然后运行以下命令:

git diff文件名

它将打开带有更改标记的文件,按回车/确认键向下滚动文件。

PS文件名应包含文件的完整路径,否则,您可以通过进入文件各自的目录/文件夹而在没有完整文件路径的情况下运行


0

您还可以使用git友好的文本编辑器。它们在已修改的行上显示颜色,为添加的行显示另一种颜色,为已删除的行显示另一种颜色,等等。

GitHub的Atom 1.0是一个很好的文本编辑器。

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.