git mv
Команда git mv: перемещение и переименование отслеживаемых файлов в Git с одновременной индексацией. Опции и примеры.
Команда git mv перемещает или переименовывает файл или директорию, уже отслеживаемые Git, и индексирует изменение за один шаг. В этой главе рассматривается переименование файла, перемещение файла в директорию, опции, которые вам действительно понадобятся (-f, -n, -k), а также подводные камни — в частности, то, что git mv работает только с файлами, уже известными Git, и что Git не хранит переименования как отдельные записи.
Определение
git mv — удобная обёртка. Её выполнение эквивалентно тому, чтобы переместить файл вручную, сообщить Git об удалении старого пути с помощью git rm и добавить новый путь через git add — всё за один раз. Преимущество в том, что рабочее дерево и область индексирования никогда не расходятся, даже на мгновение.
Переименование файла
Чтобы переименовать отслеживаемый файл, укажите старое и новое имя:
git mv old-name.txt new-name.txtФайл переименовывается на диске, и изменение уже проиндексировано — готово к коммиту. Последующий git status показывает чистую запись о переименовании. Краткий вывод наглядно это демонстрирует — флаг R отмечает проиндексированное переименование:
git status --shortR old-name.txt -> new-name.txtОстаётся лишь зафиксировать изменение с помощью git commit.
Перемещение файла в директорию
Укажите директорию в качестве назначения, чтобы переместить файл без переименования:
git mv styles.css assets/Несколько файлов можно переместить в директорию одной командой, если назначение — уже существующая папка:
git mv main.css reset.css print.css assets/Если последний аргумент — существующая директория, все предыдущие пути перемещаются в неё. Если директория ещё не существует, Git воспринимает последний аргумент как новое имя файла — поэтому сначала создайте папку (с помощью mkdir), когда хотите переместить файлы в неё.
Переименование директории
Укажите отслеживаемую директорию в качестве источника, чтобы переместить или переименовать её вместе со всем содержимым:
git mv src/ lib/Git индексирует переименование для каждого отслеживаемого файла внутри директории, поэтому одна команда git mv может породить множество записей renamed: в git status.
Что даёт git mv
Без git mv то же переименование требует трёх ручных шагов:
mv old-name.txt new-name.txt
git rm old-name.txt
git add new-name.txtgit mv сворачивает их в один и гарантирует согласованность области индексирования. Обратите внимание: Git на самом деле не хранит переименования — он обнаруживает их, сравнивая содержимое файлов при выполнении git log или git diff. git mv просто обеспечивает аккуратное и заранее проиндексированное изменение рабочего дерева.
git mv работает только с отслеживаемыми файлами
git mv работает с файлами, которые Git уже отслеживает. Попытка указать неотслеживаемый файл завершится ошибкой:
git mv note.txt moved.txtfatal: not under version control, source=note.txt, destination=moved.txtДля файла, который Git никогда не видел, просто переименуйте его обычной командой mv и добавьте новое имя с помощью git add. Используйте git mv после того, как файл зафиксирован.
Основные опции
| Команда | Описание |
|---|---|
git mv <source> <destination> | Переименовывает или перемещает отслеживаемый файл и индексирует изменение. |
git mv <source> <dir>/ | Перемещает файл в существующую директорию. |
git mv -f <source> <destination> | Принудительно выполняет перемещение, даже если файл назначения уже существует. |
git mv -k <source> <destination> | Пропускает перемещения, которые вызвали бы ошибку, вместо того чтобы прерваться. |
git mv -n <source> <destination> | Пробный запуск — показывает, что произойдёт, не выполняя действий. |
Когда файл назначения уже существует
По умолчанию Git отказывается перезаписывать существующий файл. Если вы намерены его заменить, добавьте флаг принудительного выполнения:
git mv -f draft.md final.mdИспользуйте это осторожно, так как файл назначения будет уничтожен.
Предварительный просмотр с пробным запуском
Перед масштабным перемещением используйте -n (или --dry-run), чтобы точно увидеть, что сделал бы Git — ничего не переименовывается и не индексируется:
git mv -n old-name.txt new-name.txtChecking rename of 'old-name.txt' to 'new-name.txt'
Renaming old-name.txt to new-name.txtСочетайте с -v (verbose), чтобы выводить каждое переименование по мере его выполнения при реальном перемещении.
Связанные команды
- git rm — удаление отслеживаемых файлов;
git mvвыполняетrmстарого пути под капотом. - git add — индексирование изменений;
git mvвыполняет эквивалентaddнового пути за вас. - git status — подтверждение проиндексированного переименования перед коммитом.
- git commit — запись перемещения в историю.
- git log — просмотр переименований с помощью
git log --follow <file>для сохранения истории файла через все перемещения.