如果您想避免交互性(例如“对每个提示说不”),请使用git diff
. 如果您想准确回答您的问题,请使用git diff -R
. 如果您只想要文件名,请使用git diff --name-only
.
如果没有该-R
标志,git diff
将以补丁格式报告您的工作树和索引之间的所有差异,即您在发布时看到的格式git show <commit>
。-R
反转输出,向您展示删除更改后会发生什么,就好像删除本身就是一个补丁一样。考虑一个例子:
git init /tmp/test && cd /tmp/test
echo "old line">file
git add .
git commit -m "Initial commit"
echo "new line">file
现在发行git diff
没有任何标志。你应该得到:
$ git diff
diff --git a/file b/file
index 0906fba..86ba82a 100644
--- a/file
+++ b/file
@@ -1 +1 @@
-old line
+new line
坦率地说,我发现输出很容易解析我从不使用-R
标志。如果您经常发出git diff
命令(我发现它是我最常用的命令之一),则可能不需要反向输出。同样,出于此答案的目的,请尝试:
$ git diff -R
git diff -R
diff --git b/file a/file
index 86ba82a..0906fba 100644
--- b/file
+++ a/file
@@ -1 +1 @@
-new line
+old line
该输出准确地描述了您寻求的内容:“不要覆盖更改,只需告诉我会发生什么。”
默认情况下,该命令会将您的整个工作目录与索引进行比较。它会显示每个修改文件中的差异。假设您只想查看一个文件的效果。这很容易。只需使用您已经在使用的相同的双破折号命名法:
git diff -- <file>
你会发现git diff
它是 git 中最有用、可扩展的命令之一,你可以用它来做各种有用的事情。您可以使用它来比较两个提交、两个分支或两个文件。我最近的“最喜欢的疯狂 git 操作”是管道git diff
到git apply
. 前者产生可理解的补丁。后者应用它们。当它们结合在一起时,你重写历史的能力几乎是无限的——当然,在本地,永远不要重写共享的历史。考虑另一个例子,在这一点上离题但很有趣(如果你喜欢这种事情)。从我们的测试存储库,上面:
git add .
git commit -m "Second commit"
echo "even newer line">file
git add .
git commit -m "Third commit"
你知道吗?我不太喜欢第二次提交。它的实现是错误的。它正在打破测试。我不想分享它。尽管如此,我确实想保留“第二次提交”提交消息,因为这真的很难输入。我可以用 重新设置它git rebase -i HEAD~2
,但这涉及打开编辑器、删除提交、编辑另一个和(呃)复制/粘贴。开发人员要做什么?这个怎么样:
git checkout ":/Initial" ;# get back to the first commit
git diff HEAD ":/Third" | git apply ;# apply the diff between the first and third commit
git add . ;# add the result
git commit -C ":/Second" ;# with second commit's message
git checkout -B master HEAD ;# and replace old 'master'
结果与git rebase
. 我只是设法避免了交互式会话,并且不必使用编辑器。是不是矫枉过正?可能,但它确实很有趣。此外,很容易构建更复杂的用例,尤其是当您组合git diff
、git apply
和git add -p
.