Является ли 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"

Другие вопросы по тегам