Из того, что я понимаю, Git на самом деле не нужно отслеживать операции переименования / перемещения / копирования файлов , так какова реальная цель git mv ? Страница man не является специально описательной ...
Это устарело? Это внутренняя команда, не предназначенная для использования обычными пользователями?
mv oldname newname; git add newname; git rm oldname
, оно также пойдет не такgit mv oldname newname
(см. Этот ответ ).git mv
это немного отличается от тогоmv oldname newname; git add newname; git rm oldname
, что, если вы внесли изменения в файл передgit mv
его использованием, эти изменения не будут размещены, пока вы не создадитеgit add
новый файл.С официального GitFaq :
источник
git mv
и ручном подходе? Это не очевидно изgit help mv
.Git просто пытается угадать для вас, что вы пытаетесь сделать. Он делает все возможное, чтобы сохранить непрерывную историю. Конечно, это не идеально. Так что
git mv
позволяет вам быть явным с вашим намерением и избежать некоторых ошибок.Рассмотрим этот пример. Начиная с пустого репо,
Результат:
Не удалось автоопределение :( Или сделал?
а потом
Теперь попробуйте вместо этого (не забудьте удалить
.git
папку при экспериментировании):Все идет нормально:
Теперь никто не идеален
В самом деле? Но конечно...
... и результат тот же, что и выше:
--follow
показывает только полную историю.Теперь будьте осторожны с переименованием, так как любой из этих вариантов может по-прежнему вызывать странные эффекты . Пример:
Сравните это с:
Результат:
Упс ... Теперь история возвращается к начальной а вместо начальной b , что неверно. Поэтому, когда мы делали два хода за раз, Git запутался и не отслеживал изменения должным образом. Кстати, в моих экспериментах то же самое происходило, когда я удалял / создавал файлы вместо использования
git mv
. Действовать осторожно; вы были предупреждены ...источник
Как говорит @Charles,
git mv
это сокращение.Реальный вопрос здесь: «Другие системы контроля версий (например, Subversion и Perforce) обрабатывают переименования файлов специально. Почему не Git?»
Линус объясняет на http://permalink.gmane.org/gmane.comp.version-control.git/217 с характерным тактом:
источник
Есть еще одно использование, которое я
git mv
не упомянул выше.С момента обнаружения
git add -p
(режим патча git add; см. Http://git-scm.com/docs/git-add ) я люблю использовать его для просмотра изменений при добавлении их в индекс. Таким образом, мой рабочий процесс становится (1) работой над кодом, (2) просмотром и добавлением в индекс, (3) фиксацией.Как
git mv
вписывается? Если файл перемещается напрямую, то с помощьюgit rm
иgit add
все изменения добавляются в индекс, а использование git diff для просмотра изменений не так просто (перед фиксацией). Использованиеgit mv
, однако, добавляет новый путь к индексу, но не вносит изменения в файл, что позволяетgit diff
иgit add -p
работать как обычно.источник
Есть нишевый случай, который
git mv
остается очень полезным: когда вы хотите изменить регистр имени файла в файловой системе без учета регистра. APFS (mac) и NTFS (windows) по умолчанию нечувствительны к регистру (но сохраняют регистр).greg.kindel упоминает об этом в комментарии к ответу CB Bailey.
Предположим, вы работаете на Mac и у вас есть файл,
Mytest.txt
управляемый git. Вы хотите изменить имя файла наMyTest.txt
.Вы можете попробовать:
О, Боже. Git не признает, что в файле произошли какие-либо изменения.
Вы можете обойти это, переименовав файл полностью, а затем переименовав его обратно:
Ура!
Или вы можете сэкономить на этом, используя
git mv
:источник