Является ли git commit -am избыточным, если я сделаю git add раньше?
Это избыточно для запуска git add .
а потом git commit -am "commit message"
?
Могу ли я просто запустить git add .
а потом git commit -m "commit message"
или, альтернативно, просто git commit -am "commit message"
?
5 ответов
Git add
+ git commit -m
просто зафиксирует те файлы, которые вы добавили (новые и ранее отслеженные), но git commit -am
внесет все изменения в отслеживаемые файлы, но не добавит новые файлы.
С Git до версии 2.0 запуск не является избыточным git commit -am
если вы удалили какие-либо отслеживаемые файлы. Смотрите дальнейшее объяснение вариантов ниже.
Пока вы находитесь в корневом каталоге и хотите добавить все новые файлы, изменения и удаления, вы хотите 3) ниже.
1) Зафиксируйте новые файлы и модификации ранее отслеженных файлов, но не добавляйте удаления.
С Git < 2.0:
$ git add .
$ git commit -m
С Git >= 2.0:
$ git add --ignore-removal .
$ git commit -m
2) Зафиксируйте изменения и удаления в отслеживаемых файлах, но не добавляйте новые файлы.
$ git commit -am
3) Зафиксировать новые файлы и все измененные отслеживаемые файлы (как модификации, так и удаления). Или:
С Git < 2.0:
$ git add .
$ git commit -am
...Или же:
$ git add -A
$ git commit -m
С Git >= 2.0:
$ git add .
$ git commit -m
На самом деле, git commit -a
не всегда избыточен, так как он также удаляет файлы! Например, у вас есть два файла: один файл отслеживается, другой нет. Теперь вы хотите удалить отслеженное (везде) и добавить не отслеженное.
Таким образом, вы удалите отслеживаемый файл. Если вы тогда используете только git add .
а потом git commit
он будет отслеживать новый, но не удалит старый файл в хранилище.
Таким образом, вы либо выполните git rm …
или используя git commit -a
,
Я думаю, что некоторые из предыдущих ответов не видели период после git add
(Ваш первоначальный вопрос и некоторые ответы с тех пор были отредактированы, чтобы сделать период более ясным).
git add .
добавит все файлы в текущем каталоге (и любые подкаталоги) в индекс (кроме тех, которые игнорируются .gitignore
).
-a
возможность git commit
будет включать все изменения в файлах, которые уже отслеживаются git, даже если эти изменения еще не были добавлены в индекс.
Следовательно, если все файлы уже отслеживаются с помощью git, то оба подхода имеют одинаковый эффект. С другой стороны, если новые файлы были созданы, то git add .; git commit
добавит их в хранилище, а git commit -a
не буду.
git add .; git commit -a
действительно избыточно. Все изменения уже добавлены в индекс, поэтому -a
ничего не делает.
-a
switch указывает git ставить измененные файлы для добавления - он означает "все", а не "добавить". Если вы не хотите, чтобы содержимое в новом файле было добавлено в git, вы должны добавить его с помощью git add, прежде чем его зафиксировать.
Если вы уже сделали git add .
затем он уже добавил все файлы в текущем каталоге, т.е. новые и измененные файлы. Следовательно, вам не нужно -a
переключиться на содержание сцены снова. Таким образом, вы можете справедливо просто следить за этим с git -m "msg"