標籤:

Git倉庫中的目錄名稱變了,能識別為重命名嗎?

比如原來是repo/111/hello.cpp

現在改為 repo/222/hello.cpp

貌似Git只能認為是我刪了一個文件,又加了一個文件?能讓Git將其識別為重命名嗎?

非常感謝~


Handling file renames in git

Git - git-mv Documentation

Git tracks content, not files, so it doesnt matter how you get your index into the proper state - add+rm ormv - it produces the same result. Git then uses its rename/copy detection to let you know it was a rename. The source you quoted is inaccurate, too. It really doesnt matter whether you modify+rename in the same commit or not. When you do a diff across both the modify and rename, the rename detection will see it as a rename+modification, or if the modification is a total rewrite, itll show as added and deleted - still doesnt matter how you performed it.

注意,以上這段話的前提是先 add


git mv

如輪子所說,git可以自動識別,但大多沒準。不過如果利用ide的重構功能,通常會自動調用mv命令。


&> 貌似Git只能認為是我刪了一個文件,又加了一個文件?能讓Git將其識別為重命名嗎?

當然可以啊,`git log -p -M`。

&> 那不行,你要打命令告訴git說你重命名了,自動識別是基本沒準確的時候。

這不是扯淡嗎,在一個 commit 中,若只是像題主說的只是目錄名稱變了,那 blob 就是 100% 相似,這還會識別不準?

在我體驗中,`git mv` 等同於 `git add + git rm`,Git 是根據文件相似度來判斷是否是 rename 的。具體參考 `man git-diff` 的 `-C/-M` option。


那不行,你要打命令告訴git說你重命名了,自動識別是基本沒準確的時候。這是git愛好者在我遇到你一樣的問題的時候告訴我的。


你管好你自己就行了,git 怎麼干是他的事。你只要知道 git 和你之間的服務約定沒有變就行了。


推薦閱讀:

Working with Git | 集中式工作流
gitlab 與walle配合搭建,無法檢測,請教一下這個是什麼原因?
git是什麼?github又是什麼?他們都有什麼用啊?
說說Git reset 與 revert 的故事

TAG:Git |