當我使用 移動或重命名檔案時git mv,git 在全域差異輸出中顯示移動/重命名操作:
me@myhost:~/test$ git mv foo.txt bar.txt
me@myhost:~/test$ git diff --staged
diff --git a/foo.txt b/bar.txt
similarity index 100%
rename from foo.txt
rename to bar.txt
但是,當我呼叫git diff該檔案時,它顯示為新檔案:
me@myhost:~/test$ git diff --staged bar.txt
diff --git a/bar.txt b/bar.txt
new file mode 100644
index 0000000..fad95f3
--- /dev/null
b/bar.txt
@@ -0,0 1 @@
Hey there!
為什么git diff這個檔案的輸出會根據我是否使用檔案名來呼叫它而有所不同?當我傳遞檔案名時,是否有標志或其他方式來查看重命名/移動狀態?
Stack Overflow 上的大多數類似問題都建議將--find-renames引數添加到呼叫中。不過,這似乎是我的默認行為,因為git diff沒有引數已經正確顯示了重命名。但是,使用檔案名傳遞--find-renames給第二個呼叫并沒有什么不同。
uj5u.com熱心網友回復:
請注意,為簡單起見,假設您提交了更改并正在比較提交;無論您是在提交之前--staged還是之后使用提交,結果都是相同的。
為什么這個檔案的 git diff 的輸出會有所不同,這取決于我是否使用檔案名來呼叫它?
將檔案規范視為通過.
在查看這兩個提交的全部內容時,Git 看到:
- 提交 1 包含檔案名 F1,其內容為帶有哈希 H1 的 blob B1,并且不包含 F2。
- 提交 2 包含檔案名 F2,其內容為帶有哈希 H1 的 blob B1,并且不包含 F1。
Git 看到 F1 和 F2 指向同一個 blob,并且由于 F1 消失了,而 F2 出現在同一個 blob 中,Git 可以推斷這是一個重命名。如果檔案也被編輯過,Git 可以進行啟發式(這是可配置的,順便說一句),以確定 blob 之間的差異是否足夠接近,仍然可以將其稱為重命名。
通過檔案名鏡頭查看兩個提交時,Git 看到:
- 提交 1 不包含 F2。
- 提交 2 包含檔案名 F2,其內容為帶有哈希 H1 的 blob B1。
Git 認為這是一個補充。
你能做什么?
您可以使鏡頭更大以包含兩個檔案名。使用您的示例語法進行移動,請考慮以下陳述句:
git diff --staged -- foo.txt # specify only the old file shows a delete
git diff --staged -- bar.txt # specify only the new file shows an add
git diff --staged -- foo.txt bar.txt # specify both shows a rename
或者在你提交之后,這里是比較當前和以前提交的類似語法:
git diff @~1 @ -- foo.txt # specify only the old file shows a delete
git diff @~1 @ -- bar.txt # specify only the new file shows an add
git diff @~1 @ -- foo.txt bar.txt # specify both shows a rename
這樣做的明顯缺點是您還必須知道以前的名稱。根據您最終要實作的目標,也許您可??以將多個命令鏈接在一起以決議出之前和之后的檔案名,并將它們都用作差異檔案規范。這是一個示例起點,僅顯示全域鏡頭的重命名:
git diff --staged --name-status -R
# or
git diff @~1 @ --name-status -R
Which could lead you to something like this (using Bash):
git diff --staged -- $(echo $(git diff --staged --name-status -R | grep bar.txt) | cut -d' ' -f 2-)
# or
git diff @~1 @ -- $(echo $(git diff @~1 @ --name-status -R | grep bar.txt) | cut -d' ' -f 2-)
Here's a great question and answer with details on the various diff filter options.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/435167.html
標籤:混帐
