Давайте подумаем о ваших файлах с точки зрения git.
Имейте в виду, git не отслеживает какие-либо метаданные о ваших файлах
В вашем хранилище есть (среди прочего)
$ cd repo
$ ls
...
iphone.css
...
и он находится под контролем git:
$ git ls-files --error-unmatch iphone.css &>/dev/null && echo file is tracked
file is tracked
Проверьте это с помощью:
$ touch newfile
$ git ls-files --error-unmatch newfile &>/dev/null && echo file is tracked
(no output, it is not tracked)
$ rm newfile
Когда вы выполните
$ mv iphone.css mobile.css
С точки зрения git,
- нет iphone.css (удаляется - git предупреждает об этом -).
- есть новый файл mobile.css .
- Эти файлы совершенно не связаны.
Итак, git сообщает о файлах, которые ему уже известны ( iphone.css ) иновые файлы, которые он обнаруживает ( mobile.css ), но только когда файлы в индексе или HEAD git начинает проверять их содержимое.
На данный момент, ни "iphone.css delete", ни mobile.css находятся в индексе.
Добавить удаление iphone.css в индекс
$ git rm iphone.css
git точно скажет, что произошло: (* iphone.css удалено. Nбольше ничего не произошло)
затем добавьте новый файл mobile.css
$ git add mobile.css
На этот раз и удаление, и новый файл находятся в индексе.Теперь git обнаруживает тот же контекст и выставляет его как переименованный.Фактически, если файлы похожи на 50%, он обнаружит это как переименование, которое позволит вам немного изменить mobile.css , сохранив операцию как переименование.
Смотрите, это воспроизводимо приgit diff
.Теперь, когда ваши файлы в индексе, вы должны использовать --cached
.Немного отредактируйте mobile.css , добавьте это к индексу и увидите разницу между:
$ git diff --cached
и
$ git diff --cached -M
-M
- это "обнаружить переименования""опция для git diff
.-M
означает -M50%
(при сходстве 50% и более git выражает его как переименование), но вы можете уменьшить его до -M20%
(20%), если много редактируете mobile.css.