为什么执行'git commit'命令后没有保存我的修改?

262

我像这样执行了一个git commit -m "message"

> git commit -m "save arezzo files"
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

但之后,当我执行git status时,它显示相同的修改文件:

> git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")
我做错了什么?

16
使用git commit -am "save arezzo files"可以自动添加所有更改内容(与.gitignore有关)。您也可以只添加特定的文件/目录:git add file.src - mbx
可能存在重复问题:https://dev59.com/H3E95IYBdhLWcg3wMa91 https://dev59.com/aFPTa4cB1Zd3GeqPfgi6 - mbx
14个回答

419

正如提示消息所说:

没有更改添加到提交中(使用 "git add" 和/或 "git commit -a")

Git有一个"暂存区(staging area)",在提交之前需要将文件添加到其中。你可以在这里阅读其解释


对于你的具体示例,你可以使用以下命令:

git commit -am "save arezzo files"

(注意flags中额外的a,也可以写成git commit -a -m "message" - 两者都是一样的功能)

或者,如果你想更有选择性地将内容添加到提交中,可以使用 git add 命令将适当的文件添加到暂存区,并使用 git status 预览即将添加的内容(记得关注使用的措辞)。

你还可以在 Git文档页面 找到关于如何使用Git的通用文档和教程,这些将更详细地介绍暂存/添加文件的概念。


另一个值得知道的东西是 交互式暂存 - 这使您可以将文件的一部分添加到暂存区,因此如果您进行了三个不同的代码更改(用于相关但不同的功能),则可以使用交互模式来拆分更改并依次添加/提交每个部分。像这样具有更小特定范围提交的做法可以很有帮助。


@PeterBoughton 你是不是想说“交互式添加”而不是“互动添加”? - djb
3
我理解您的意思是“交互式添加”。 - Peter Boughton
2
本地存储库是将代码推送到远程存储库之前的一个中间阶段。为什么要在提交更改之前再添加一个“层”,这不会过于复杂吗?虽然我对 Git 还很陌生,但我想 99.99% 的开发人员都会使用 commit -am 命令,因为这样的更改不会影响到他们的本地环境。 - PawelRoman
2
我认为我遇到这个问题是因为我习惯了我的IDE自动处理它。我不确定为什么这是必要的步骤,但再说一遍,关于git有很多我不理解的东西... 我的意思是git... - trpt4him

53

你没有添加更改。要么通过以下方式明确地添加它们:

git add filename1 filename2

或者将所有更改添加(从项目的根路径)

git add .

或者在提交时使用简写 -a:

git commit -a -m "message".

此外,我强烈建议用户使用交互式添加。特别是当您试图进行漂亮的小提交并且易于撤消时。 - jer

45

你应该这样做:

git commit . -m "save arezzo files"

4
这似乎是对楼主问题的正确回答。他不想“添加”,而是想提交所修改的内容。 - VectorVortec

10

我将一个受 Git 版本控制的小子项目复制到另一个项目中,并忘记删除 .git 文件夹。当我试图提交时,出现了与上述相同的消息,直到我删除 .git 文件夹才能清除它。

这可能有点傻,但值得检查一下你的文件夹中是否有一个不能提交的 .git 文件夹。


7

您本来可以采取以下措施:

git add -u -n

要检查您修改并将要添加的文件(干运行:-n选项),然后

git add -u

添加修改文件


6
这是因为您有一个文件夹已经被 Git 跟踪,而这个文件夹又包含在另一个被 Git 跟踪的文件夹中。比如说,我有一个项目,并添加了一个子文件夹。在将它们组合成一个文件夹之前,它们都已经被 Git 跟踪了。为了停止跟踪内部的那个文件夹,请找到它并移除 Git 文件:
rm -rf .git

在我的情况下,我有一个WordPress应用程序,我添加的文件夹是一个主题。所以我必须进入主题根目录,删除Git文件,这样整个项目就会被父级WordPress应用程序跟踪。


4

当我在存储库根目录下(我的意思是.gitignore文件所在的主目录)的子目录中运行git add .时,我发现出现了这个问题。 尝试更改目录到您的最上层目录,然后运行git add . ,接着再运行git commit -m "我的提交信息"


4

也许这是一个显而易见的事情,但...

如果您在索引方面遇到问题,请使用git-gui。您可以获得关于索引(暂存区)如何实际工作的非常好的视图。

帮助我理解索引的另一个信息来源是Scott Chacons的“Getting Git”页面259及其后续内容。

最初我使用命令行,因为大多数文档只显示了那个......

我认为git-gui和gitk实际上使我的工作更快,我摆脱了一些不良习惯,例如“git pull”......现在我总是先fetch......查看新变更真正是什么再合并。


2
如果你有更多的文件,例如我有7000个图像文件,当我尝试从项目路径文件夹添加它们时,它没有成功添加。但是当我进入图像文件夹时一切都没问题。请检查目标文件夹并执行以下命令。最初的回答:在终端中输入“cordova plugin add cordova-plugin-file-transfer”,然后重新运行项目。
git add .
git commit -am "image uploading"
git push origin master

git push origin master 翻译成中文是"将本地代码推送到远程仓库,分支为master"。
最初的回答内容如下:

git push origin master 枚举对象: 6574, 完成。计算对象: 100% (6574/6574), 完成。使用多达4个线程进行增量压缩。压缩对象: 100% (6347/6347), 完成。正在写入对象: 28% (1850/6569), 142.17 MiB | 414.00 KiB/s


0
如果您有一个子文件夹,它是从其他 Git 存储库克隆的,那么首先您必须从子存储库中删除 $.git$ 文件: rm -rf .git 之后,您可以切换到父文件夹并使用 git add -A

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