Git提交 -a "未跟踪的文件"?

126

当我执行 git commit -a 命令时,我看到了以下内容:

  # Please enter the commit message for your changes. Lines starting
  # with '#' will be ignored, and an empty message aborts the commit.
  # On branch better_tag_show
  # Changes to be committed:
  #   (use "git reset HEAD <file>..." to unstage)
  #
  # modified:   ../assets/stylesheets/application.css
  # modified:   ../views/pages/home.html.erb
  # modified:   ../views/tags/show.html.erb
  # modified:   ../../db/seeds.rb
  #
  # Untracked files:
  #   (use "git add <file>..." to include in what will be committed)
  #
  # ../assets/stylesheets/
  # ../views/pages/
那些未跟踪的文件是什么意思?所有更改都已被跟踪,我不明白为什么git在这里警告我有未跟踪的文件。
编辑:好的,我看到很多困惑的回复。这是在我执行“git commit -a”之后发生的事情。
# On branch master
nothing to commit (working directory clean)

正如您所看到的,除了那四个文件被更改之外,没有其他任何内容。

我的问题应该重新表述为:当此提交中的所有更改都已被跟踪时,为什么Git会警告我有未跟踪的文件?

换句话说,Git提交信息中的未跟踪警告是否是不必要的?


2
(use "git add <file>..." to include in what will be committed) - zengr
1
增加这个命令并不是必要的,因为 git commit -a 会提交所有已经被追踪的文件的更改。 - xjq233p_1
4
如果文件直到现在都没有被 add 过,那么使用 -a 是必要的。从 -a 的文档中可以看到:告诉命令自动暂存已修改和删除的文件,但是新添加的文件不受影响,因为你还没有告诉 Git 这些文件的存在。 - Noufal Ibrahim
问题不在于Git太难,而是聪明的开发人员缺乏耐心,并且对工具中的意外行为完全容忍度为零。:http://teddziuba.com/2010/08/too-smart-for-git.html - zengr
你知道.gitignore吗?你很可能需要这样的文件! - Basile Starynkevitch
显示剩余4条评论
7个回答

130
对于其他遇到相同问题的人,请尝试运行以下命令: git add . 这将添加当前目录下的所有文件以进行跟踪(包括未跟踪的文件),然后使用 git commit -a
来提交所有已跟踪的文件。
如@Pacerier所建议的,一个执行相同操作的单行命令是: git add -A

9
git commit -a 命令会提交所有已被跟踪的文件,但不会跟踪未被跟踪的文件。git add . 命令会跟踪当前目录下未被跟踪的文件。 git add -a 命令会跟踪所有未被跟踪的文件。 - here
1
@matteo,应该使用git add -A而不是git commit -A。据我所知,你无法通过传递开关给git commit来包含未跟踪的文件。 - Len
1
现在似乎已经弃用了-a,改为使用A。不过还是非常感谢你的帮助。 :) - tcratius
要进一步了解这些命令,您可以查看以下链接:https://dev59.com/lHRB5IYBdhLWcg3wn4UL - Onat Korucu
值得一提的是,git add . 不会添加您在 .gitignore 文件中手动指定的任何文件,这意味着您可以精细地控制使用 git add . 自动添加哪些内容。 - aggregate1166877

37

git commit -am "msg" 不同于 git add filegit commit -m "msg"

如果有一些文件从未被添加到git跟踪中,您仍然需要执行 git add file

“git commit -a”命令是一个两步操作的快捷方式。在修改已知于repo的文件后,你仍然需要告诉repo:“嘿!我想将它添加到暂存区并最终提交给你。”这可以通过发出“git add”命令来完成。“git commit -a”是将文件加入暂存区并在一个步骤中提交。

来源:"git commit -a" and "git add"


但是,正如你所说的 git commit -a = git add . + git commit为什么它不会自动将文件添加到跟踪区域呢?... - Johnny
1
@Johnny:git commit -a 不等于 git add . + git commitgit add 步骤仅添加在你的 git status 中列出为修改过的文件,而不是当前目录中的所有文件。 - Soren Bjornstad
是的,我今天发现了这件事! - KansaiRobot

25
你应该输入到命令行中。
git add --all

这将提交所有未跟踪的文件

编辑:

在暂存您的文件后,它们已准备好提交,因此您的下一个命令应该是

git commit -am "Your commit message"

17
如果您遇到未跟踪文件的问题,这个三行脚本可以帮助您。
git rm -r --cached .
git add -A
git commit -am 'fix'

然后只需执行 git push 命令即可。


这对我很有用,因为我需要取消跟踪已被我现在忽略的文件。 - spyder man
这个 -A 标志是什么? - Diego
@Diego 将整个工作区中除了被忽略的文件之外的所有文件添加进去。 - AliFurkan
好的,是的,这就是我从现在开始需要的。以前,我开始取消跟踪的文件不会出现在我的git状态输出中。 - Diego

9
  1. 首先,您需要添加所有未跟踪的文件。使用以下命令行:

    git add *

  2. 然后使用以下命令行提交:

    git commit -a


7

顾名思义,“未跟踪的文件”是指没有被Git跟踪的文件。它们不在您的暂存区中,也不属于任何以前的提交。如果您想对它们进行版本控制(或由git管理),可以通过告诉'git'来使用'git add'来实现。请查看将更改记录到存储库章节,该章节在Progit书中使用了一个漂亮的可视化图形,提供了关于记录更改到git存储库并解释“已跟踪”和“未跟踪”术语的良好解释。


1
请更新URL到v2版本,包括https://git-scm.com/book/en/v2和https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository。此外,提到progit的参考资料也值得一提。 - stefan123t

0
确保你在提交或添加文件之前,本地Git中的正确目录(仓库主文件夹)可以找到.git文件夹配置。

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