如果我在运行 git add 命令之后,再运行 git commit -am 命令,这是否是多余操作?

38

运行git add .,然后再运行git commit -am "commit message"是否多余?

我能否只运行git add .,然后再运行git commit -m "commit message",或者只运行git commit -am "commit message"


6
如果你处于项目的最高层级,那么我认为你应该明确说明这个假设;如果你在子目录中,git add .git commit -a会完成非常不同的操作。 - user229044
5个回答

51

Git add + git commit -m 只会提交你添加的文件(新文件和之前已追踪的文件),但是 git commit -am 会提交所有追踪文件的更改,但它不会添加新文件。


3
如所述,git commit -am不会添加未跟踪的文件,但我想指出git add -u只会添加当前已跟踪的项目(update),并不会添加未跟踪的文件。 - johnny

31

在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 add . + git commit -am 等同于 git add -A 吗? - user1322092
如果您在第二个选择后也进行提交,是的。 git add . + git commit -am 等同于 git add -A + git commit -m。我已更新我的答案以反映这一点。 - Karl Horky
自Git 2.0.0版本以来,“git add .”命令会添加文件删除操作:“git add <path>”现在与“git add -A <path>”相同。我已经相应地更新了帖子。 - Matthieu Moy

11

实际上,git commit -a并非总是多余的,因为它还可以删除文件!例如,您有两个文件:一个已被跟踪,另一个未被跟踪。现在您想要删除已被跟踪的文件(无论在何处),并添加未被跟踪的文件。

因此,您需要删除已被跟踪的文件。如果您只使用git add .,然后使用git commit,则会将新文件跟踪起来,但不会从存储库中删除旧文件。

所以你需要执行git rm ...或使用git commit -a


1
这是实际的正确答案,直接回答了问题。 - CDR

4

我认为之前的答案中有些人没有看到git add后面的句号(你原来的问题和一些答案已经被编辑过,以使句号更加清晰可见)。

git add .会将当前目录(和所有子目录)中的所有文件添加到索引中(除了那些在.gitignore中被忽略的文件)。

-a选项添加到git commit中将包括所有已经被Git跟踪的文件的更改,即使这些更改还没有被添加到索引中。

因此,如果所有文件都已经被Git跟踪,那么这两种方法的效果是相同的。但是,如果有新文件被创建,那么git add .; git commit会将它们添加到仓库中,而git commit -a则不会。

git add .; git commit -a确实是多余的。所有的更改已经被添加到索引中,所以-a没有任何作用。


你只是用更多的话说了我说过的话。当有人说 git add 时,它意味着他们将想要添加的文件与之一起添加,可以是 . 或文件列表。不管怎样,区别很明显,-am 不会添加任何新文件。 - Tuminoid

2
-a开关告诉git要将修改的文件暂存以添加 - 它代表“所有”而不是“添加”。如果您想要将新文件中的内容添加到git中,则必须在提交之前使用git add添加它。
如果您已经执行了git add .,那么它已经添加了当前目录中的所有文件,即新文件和修改的文件。因此,您不需要-a开关再次暂存内容。所以您可以正确地跟随它使用git -m "msg"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接