W3docs

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 --short
R  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.txt

git mv сворачивает их в один и гарантирует согласованность области индексирования. Обратите внимание: Git на самом деле не хранит переименования — он обнаруживает их, сравнивая содержимое файлов при выполнении git log или git diff. git mv просто обеспечивает аккуратное и заранее проиндексированное изменение рабочего дерева.

git mv работает только с отслеживаемыми файлами

git mv работает с файлами, которые Git уже отслеживает. Попытка указать неотслеживаемый файл завершится ошибкой:

git mv note.txt moved.txt
fatal: 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.txt
Checking 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> для сохранения истории файла через все перемещения.

Практика

Практика
Что делает команда 'git mv old.txt new.txt'?
Что делает команда 'git mv old.txt new.txt'?
Was this page helpful?