git commit -m 和 git commit -am的区别

131

这似乎很简单,但我就是不明白。我在我的应用程序根目录。

下面是我的工作流程。

git add .
git commit -m "added a new feature some files changed"
git push heroku master

通常这样做有效。我所有的更改都被推送了。

但有时我更改了一个文件,但当我推送到Heroku时,更改对于那个文件不起作用...但是对于大多数文件,更改是有效的...

但如果我执行

git add .
git commit -am "added a new feature some files changed"
git push heroku master

所有更改都会被推送到Heroku


1
你能举例说明哪个文件没有被捕获吗?是你已经删除的文件吗?有时候你需要执行 git add . --update 命令来捕获这些文件。 - helion3
@BotskoNet - 这个文件是我Rails应用程序中的CSS文件。出于某种原因,当我编辑该文件时,更改未被推送到Heroku。这种情况以前发生过,但我不明白为什么会这样。 - slindsey3000
也许这会对你有所帮助。这些之间的区别 - Reven
8个回答

141

文档中得知:

git commit -a 在提交之前自动为所有已跟踪并修改的文件添加stage操作。 如果您认为Git工作流程中的git add阶段太繁琐, Git允许您通过-a选项跳过该部分。这基本上告诉Git对任何“已跟踪”的文件运行git add - 也就是说,任何在您最后一次提交中的文件并且已被修改的文件。如果你想使用一种更类似Subversion的工作流程,只需编辑文件,然后在想要快照所有已更改内容时运行git commit -a。 不过,您仍然需要运行git add来开始跟踪新文件,就像Subversion一样。

使用选项-am可以让您在一个命令中添加和创建提交信息。


3
为什么git commit -am "x"可以工作,但是git add .git commit -m "x"的组合却不行? - slindsey3000
20
因为你的一些文件没有被暂存。这通常出现在那些被删除或新增但未被追踪的文件上。通常情况下,你需要运行git add -u命令来暂存这些“未追踪”的文件。-am选项也可以帮助你实现这个目的。 - Davin Tryon
4
@slindsey3000,你可能正在寻找的是 git add -A,它与 git add --all 相同,但不同于 git add . - Alexander Mills
从2022年开始。@DavinTryon。我认为这并不完全正确,“git add -u”只会将修改过的文件添加到暂存区,而不是未跟踪的文件,这在文档中已经很清楚了(不会添加新文件)。 - Diogo
git commit -am 也是一样的情况,-a 选项不会将新文件加入暂存区 - Diogo
@slindsey3000,我相信 git commit -am "x" 能够工作而 git add . 不能是因为 git add . 只会将当前文件夹中的文件加入到暂存区。请参见此回答 - Diogo

39

如果你只更改了一个文件,我建议你这样做:

git add "Your_file.txt"
git commit -m "added a new feature in a file"
git push heroku master

或者,如果您更改了多个文件,则可以像这样操作:

git add .
git commit -m "some files changed"
git push heroku master

同样地,您可以使用此命令在一行上添加并提交所有文件:

git commit -am "added a new feature some files changed"
git push heroku master

6
git commit -am 不会推送代码,因此你无法替换其中提到的三行代码。 - WilomGfx
7
@WilomGfx 我认为不是。他的意思是:你可以添加和提交,而不是推送;所以当他说“在这个命令的一行上”时,他是正确的。 - robe007
最后一种方法不像前两种那样有效。它不会暂存未跟踪的文件。 - undefined

7
它们的基本区别在于:
 git commit -m = send log message (don't work without git add )

 git commit -am = git add -a + git commit -m

git add -a = 将所有文件添加到暂存区


1
阶段一切事情目前被追踪的,更准确地说。 - Michael Bonnet
我想你是指的 git add -A。git add 没有 -a 选项。 - moriaz

5

git commit -am 是一个方便的命令,可以一次性将已跟踪(=已暂存)的文件进行暂存和提交。

正如Nail所回答的那样,

git commit -am = git commit -a + git commit -m 

git commit -m: 提交并附带信息(这部分你可能已经知道了)

git commit -a | git commit --all:

告诉命令自动暂存已修改和删除的文件,但是你没有告诉Git的新文件不受影响。-来自Git文档

你没有告诉Git的新文件不受影响

粗体部分很重要。

-am标志仅适用于已跟踪(已暂存)的修改或删除文件(因为“删除”意味着删除之前存在的已跟踪内容)

因此,如果您添加了新文件并使用-am标志进行提交,则这些新创建的文件将不包括在提交中,因为它们未被跟踪(暂存)。

如果您创建了新文件并想使用-am标志以避免使用

git add .
git commit -m "some commit" // reducing one line makes a big difference, I agree

首先使用git add .将新的文件暂存,然后可以使用git commit -am代替上面两行命令。


新文件位是我正在寻找的! - datalifenyc
我认为你是指的 git add -A。git add 没有 -a 选项。 - moriaz

2
git commit -m "first commit"和git commit -am "your first commit"的区别在于,在前者中,您需要首先执行“git add .”,而在后者中不需要。 "-am"标志中的'a'告诉git首先添加所有更改。

1

假设有文件A、文件B和文件C,您对它们进行了修改。然后提交更改。

git add .
git commit -m "update"

所有文件都由git进行提交和跟踪。
假设fileD是由您或某个工具链创建的,并且您修改了fileD和fileA。然后进行提交。
git add .
git commit -m "update"

fileD被git跟踪(git add .),而fileA和fileD都被git跟踪。


关于“为什么git commit -am“x”可以工作,但是git add . git commit -m“x”不能工作?”

答:

这是因为您做了类似以下操作:

想象一下,fileE是由您或某个工具链创建的(假设它是fileE版本1),并且您对其进行了暂存。

git add .

接着您需要修改 fileE 文件(比如说变成了 fileE 版本2)。^ 然后提交。

git commit -m "update"

因此,只有文件E的版本1被提交。尽管这会让用户感到困惑,但这是git的预期行为:git不知道文件E的版本2。---- 对于未提交的文件E,您过早地进行了暂存,因为您忘记了在提交之前使用git add fileE(在^标记处)让git知道文件E的版本2。
因此,请记住在提交之前添加其最新版本的所有内容。 (添加新版本,提交新版本)
-
让我们回滚到创建文件E之前的整个过程,然后再次进行操作,以便您不会错过文件E的版本2。
想象一下,文件E是由您或某个工具链创建的(假设它是文件E的版本1),然后您修改了文件E(假设它变成了文件E的版本2)。
然后提交。
git add .
git commit -m "update"

因此,文件E的版本2已提交。
如果你想要在提交历史中保留文件E的版本1,只需提交两次:一次为它的旧版本,一次为它的新版本(即,在修改为版本2之前提交一次,在其版本2上再提交一次)。
提示:
始终遵循此顺序:(添加新版本, 提交新版本)
(file modification) + git add . + git commit -m "update",
(file modification again) + git add . + git commit -m "update",
这样就不会遇到漏掉任何更改的问题了。
而且你甚至不需要用"-am"提供的“便利”。因为使用"-am"相当于要求git聪明地宽容你忘记git add。只要有清晰的思路遵循直觉的顺序,你在这个层面上就不需要宽容。有时候,不必要的宽容会增加大脑负担而没有好处。

0
layman话来说:
如果你只使用-m参数,那么你需要逐个添加任何文件,如果由于要避免添加许多不需要的未暂存/未跟踪的文件而无法使用.(点符号)。
因此,你可以像下面这样使用。
git add test1.txt
git commit -m "adding test1.txt file"

现在,如果您知道要添加所有已修改的文件(不是新文件或未跟踪的文件),则可以使用带有提交命令的-am,所有已修改的文件将一起添加和暂存。
因此,如果text1.txt不是新文件/未跟踪的文件,而是修改过的文件/已跟踪的文件,则可以直接执行以下操作,无需使用add命令。
git commit -am "adding test1.txt file"

源代码:

https://www.gitkraken.com/learn/git/commit


-1

它同时完成了两个任务: 1)将修改后的文件进行分组 2)在同一行中添加注释

但它不会将未分组的文件添加到分组中,也就是说,它无法完成$git add .的工作。


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