如果你想避免交互(一拉「對每個提示說不」),使用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
時。
也許我很困惑,但你不只是要求你的工作樹和索引之間的差異?那些用'git diff'顯示。 –
@TilmanVogel:如您所知,'git clean'命令將刪除未跟蹤的文件。但'git clean -n'不會刪除文件,它只是告訴文件將被刪除。我只是想知道,在git checkout命令中是否有這樣的選項。謝謝。 –
好的,那麼看看'git help checkout'很容易回答爲「否」。我認爲原因是'git status'和'git diff'一起給出了所有相應的信息。我也喜歡'git citool'。當然,這個故事在使用'git checkout'時不同於索引。 –