Зачем использовать «git rm» для удаления файла вместо «rm»?

171

В SVN удаление чего-либо из файловой системы напрямую (а не использование svn) создавало множество головных болей.

Я не нашел, чтобы это было проблемой при использовании git, но я заметил, что у git есть своя собственная rmреализация ( git rm).

В чем разница между rmи git rm?

cjm2671
источник

Ответы:

253

Если вы просто используете rm, вам нужно будет следить за этим git add <fileRemoved>. git rmделает это за один шаг.

Вы также можете использовать git rm --cachedкоманду, которая удалит файл из индекса (поместит его для удаления при следующем коммите), но сохранит вашу копию в локальной файловой системе.

Энди
источник
Хороший ответ. Я смог использовать, git reset --hardа затем выполнить проверку мастера, чтобы выйти из оторванного состояния головы, потому что я знал, что у меня не было никаких незафиксированных изменений. Если вы не зафиксировали свои изменения, возможно, вы захотите сделать git stash, но я относительно новичок в git, поэтому не знаю точной команды. Если вы приехали сюда в или после 2014 года, я надеюсь, что этот ответ был вам полезен.
Эрик Хепперл - CodeSlayer2010
@Andy - если я использовал rm(вместо git rm) и удалил много файлов, используя его, и теперь не хочу gitотслеживать их. Есть ли способ отменить изменения? Я хочу gitнаступить на то, rmчто удалено, так как я не использовал git rmв первую очередь.
Четан Арвинд Патил
Было бы неплохо, если бы это было четко прописано в онлайн-документах (это может быть там, но это, очевидно, неочевидно, иначе этот вопрос не задавался бы). Пользователям было бы полезно знать, что они не делают ничего плохого, если идут по пути ОС. И есть причины пойти по пути ОС. Например, если вам нужно удалить файл, чтобы проверить, что что-то работает, прежде чем вносить изменения, маршрут ОС немного безопаснее, чем использование git rm, так как в случае с git вы должны отменить действие, тогда как в опции ОС вы просто принести (я верю).
Боб
12

Удаление файлов с помощью использования rmне является проблемой само по себе, но если вы затем захотите зафиксировать, что файл был удален, вам придется все git rmравно сделать , так что вы могли бы сделать это таким же образом.

Кроме того, в зависимости от вашей оболочки, git rmпосле удаления файла, вы не получите завершение табуляции, поэтому вам придется прописать путь самостоятельно, тогда как если вы, git rmпока файл еще существует, завершение табуляции будет работать как обычно.

Хаммар
источник
7

git rmудалит файл из индекса и рабочего каталога (только индекс, если вы его использовали --cached), так что удаление будет подготовлено для следующей фиксации.

manojlds
источник
4

Однако, если вы в конечном итоге используете rm вместо git rm. Вы можете пропустить git add и напрямую зафиксировать изменения, используя:

git commit -a

борец
источник
3

Удалите файлы из индекса или из рабочего дерева и индекса. git rm не удалит файл только из вашего рабочего каталога.

Вот как вы можете удалить файл с помощью, rm -fа затем удалить его из индекса с помощьюgit rm

$ rm -f index.html
$ git status -s
 D index.html
$ git rm index.html
rm 'index.html'
$ git status -s
D  index.html

Однако вы можете сделать это все сразу git rm

$ git status -s
$ git rm index.html
rm 'index.html'
$ ls
lib vendor
$ git status -s
D  index.html
basicxman
источник
2

При использовании git rm удаление будет частью вашего следующего коммита. Так что, если вы хотите внести изменения, вы должны использовать git rm

Кейс
источник
2

В добавление к ответу Энди есть дополнительная утилита для git rm:

  1. Безопасность : когда git rmвместо этого rmGit блокирует удаление, если есть расхождение между HEADверсией файла и промежуточным индексом или версией рабочего дерева. Этот блок является механизмом безопасности для предотвращения удаления текущих изменений.

  2. Защита : git rm --dry-run. Эта опция является защитой, которая выполнит git rmкоманду, но не удалит файлы. Вместо этого он выведет, какие файлы он бы удалил.

Джо
источник