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

#git #github

#git

Вопрос:

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

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

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

Ответ №1:

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

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

Комментарии:

1. Хороший ответ. Я смог использовать git reset --hard , а затем выполнить проверку master, чтобы выйти из состояния отсоединенного head, потому что я знал, что у меня нет никаких незафиксированных изменений. Если вы не зафиксировали свои изменения, вы можете захотеть сделать git stash, но я относительно новичок в git, поэтому я не знаю точной команды. Если вы пришли сюда в 2014 году или после, я надеюсь, что этот ответ был вам полезен.

2. @Andy — Если я использовал rm (вместо git rm ) и удалил много файлов, используя его, и теперь не хочу git их отслеживать. Есть ли способ отменить изменения? Я хочу git , чтобы мой rm был удален, поскольку я не использовал git rm его в первую очередь.

3. Было бы неплохо, если бы это было четко прописано в документации онлайн (это может быть там, но это явно не очевидно, иначе этот вопрос не был бы задан). Пользователям было бы неплохо знать, что они не делают ничего плохого, если они идут по маршруту OS rm. И есть причины пойти по пути ОС. Например, если вам нужно удалить файл, чтобы проверить, что что-то работает, прежде чем вносить изменения, маршрут OS немного безопаснее, чем использование git rm, так как в случае с git вам нужно отменить действие, тогда как в опции OS вам просто нужно извлечь (я полагаю).

4. Я все еще этого не понимаю.

Ответ №2:

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

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

Ответ №3:

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

Ответ №4:

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

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

Ответ №5:

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

git commit -a

Ответ №6:

Удалите файлы из индекса или из рабочего дерева и индекса. 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
 

Ответ №7:

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

Ответ №8:

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

Допустим, в вашем репозитории git в системе без учета регистра есть зафиксированный файл с именем foo.js , и при запуске вы столкнетесь с ошибкой git rm Foo.js . Но не с rm Foo.js помощью instead.