Git commit-m vs. git commit-am

看起来很容易,但我就是不明白。我在我的应用程序的根。

这是我的工作流程。

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

132983 次浏览

来自 那些文件:

Git commit-a 在提交之前自动暂存所有跟踪的、修改过的文件 如果您认为工作流的 git 添加阶段是 太麻烦了,Git 允许您使用 -a 选项跳过该部分。 这基本上告诉 Git 在“跟踪”的任何文件上运行 Git add - 也就是说,在您上次提交中被修改的任何文件。这允许您在以下情况下执行更多的 Subversion 样式工作流 只需编辑文件,然后运行 git commit-a 即可 想要快照已经被改变的一切。你仍然需要 运行 git add 开始跟踪新文件,就像 Subversion 一样。

Using the option -am allows you to add and create a message for the commit in one command.

我建议,如果您只更改一个文件,那么您可以执行以下操作:

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

Git commit-m“第一次提交”和 git commit-am“您的第一次提交”之间的区别在于,在前者中,您需要首先执行“ git add”而后者则不需要。“-am”标志中的‘ a’告诉 git 首先添加所有更改

它是做两个工作在一起 1)暂存已修改的档案 2)adding comment in the same line

但是它不会将文件从 unstage 添加到 stage,即 $git add 的工作不起作用。

The basic difference between them is that:

 git commit -m = send log message (don't work without git add )
 git commit -am = git add -a + git commit -m

Git add-a = stage Everything

git commit -am is a convenient command to stage and commit at once for TRACKED(=STAGED) files.

就像内尔回答的那样,

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

git commit -m: 使用消息提交(您可能知道这一部分)

git commit -a | git commit --all:

告诉命令自动暂停已经修改和删除的文件,但 new files you have not told Git about are not affected。 从 git 文件

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

大胆的部分才是最重要的。

the -am flag works only for 追踪到了(staged) files that are modified or deleted(b/c "delete" means removing what existed = tracked before)

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

如果创建新文件并希望使用 -am标志以避免使用

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

,阶段这些新的第一与 git add .和您可以使用 git commit -am,而不是两行以上的命令。

假设有 fileA fileB fileC,然后修改它们,然后提交。

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"不工作?”

答:

IT IS BECAUSE you did something like this:

假设 fileE 是由您或某个工具链创建的(让我们假设它是 fileE version 1) ,并且您对它进行了暂存

git add .

and then you modify fileE (let's say it becomes fileE version2). ^ Then commit.

git commit -m "update"

因此,只提交 fileE 的版本1。尽管这会让用户感到困惑,但这是 git 的预期行为: git 不知道 fileE version 2。--对于未提交的文件 E,在提交之前,在较新版本的 fileE 之后执行 git add fileE(at ^ mark of moment) ,忘记让 git 知道 fileE version 2,因此将其暂存为 太早了

所以只要记住在提交之前使用 Git 添加其最新版本的所有内容(添加新版本,提交新版本)

-

LET'S ROLL BACK the whole story before fileE is created, and do it again so that you don't miss the fileE version2.

假设 fileE 是由您或某个工具链创建的(假设它是 fileE version 1) ,并且您修改了 fileE (假设它变成 fileE version 2)。

那就承诺吧。

git add .
git commit -m "update"

因此,将提交 fileE 的版本2。

如果希望在提交历史记录中提交 version 1 fileE,只需提交两次: 一次针对旧版本,一次针对新版本(又名。一次是在修改为版本2之前,一次是在修改为版本2之前


提示:

始终遵循以下顺序: (添加新版本,提交新版本)

(file modification) + git add . + git commit -m "update",

(file modification again) + git add . + git commit -m "update",

你也不会遇到错过任何改变的问题。

你甚至不需要 -am提供的“便利”。因为使用 -am相当于要求 git 变得聪明,并且对遗忘 git add .要宽容。只要头脑清醒,遵循直觉的顺序,你就不需要在这个层面上宽容。有时候,不必要的宽容带来的大脑负荷多于好处。

用外行人的话说:

如果只使用-m,则需要逐个添加任何文件,如果不能使用。(点) ,以避免添加许多不需要的非暂存/未跟踪文件

所以你可以像下面这样使用

git add test1.txt
git commit -m "adding test1.txt file"

现在,如果您知道您想添加所有修改过的文件(不是新文件或未跟踪的文件) ,您可以简单地使用-am 和 commit 命令,所有修改过的文件将在一个命令中一起添加和登台

所以,如果 text1.txt 不是一个新的文件/取消跟踪的文件,而是一个修改过的文件/跟踪的文件,那么只需要做下面的操作,而不需要使用 add 命令

git commit -am "adding test1.txt file"

Source:

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