Git列出同一文件修改但未准备提交的问题?

32

出于某些原因,Git告诉我有一个文件既是“要提交的”,又是“未暂存的”?这没有意义:

% git status 
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   Dir1/Dir2/filename.cpp
#
# 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:   Dir1/Dir2/filename.cpp

Dir1Dir2filename.cpp 绝对是同一个文件。我不得不再次添加 filename.cpp,以便它出现为要提交的更改(在它最初在存储库中之后)。唯一可能导致问题的原因是我先进行了保存,然后执行了 pull --rebase,然后弹出了 stash.gitignore 没有在任何地方列出 Dir1Dir2filename.cpp,而且模式也没有表明它们会捕捉此文件?


这个问题具体是什么? - svick
1
看起来你在添加后进行了修改,再次添加它应该就没问题了。 - thenetimp
1
在生产环境中使用工具之前,请先阅读基础知识 - kostix
4
虽然问题的措辞可能不是完美的,但输出本身清楚地显示了Git中确实存在非常令人困惑的问题,即将文件列在“待提交”和“未暂存”的情况下,对此简单地回答“RTFM”显然不是最佳解决方案。 - Sz.
3个回答

37

这意味着您对filename.cpp进行了更改,添加了该更改(使用git add),然后进行了另一项尚未添加的更改。

"要提交的更改"的部分意味着Git已经更新了其索引以进行更改。当您运行git commit时,索引中的更改将用于创建新的提交对象。

"未暂存的更改"部分显示了索引与您的工作副本之间的差异。

您可以按以下方式重现所看到的内容:

  • 编辑 filename.cpp
  • 运行 git status。您将看到"未暂存的更改"。
  • 运行 git add filename.cpp
  • 再次运行 git status。您将看到"要提交的更改"。
  • 再次编辑 filename.cpp
  • 再次运行 git status。您将同时看到"未暂存的更改"和"要提交的更改"。

这有意义吗?解释Git的工作原理总是有点棘手。


1
请注意:每个提交组只能添加一次文件。如果您在添加文件后再次更改它,则这些更改将不会包含在提交中。为了将所有新更改包含在提交中,您必须执行 "git reset -file-",然后执行 "git add -file-",以使提交的副本保持最新状态。 - ppostma1
1
我运行了 git add file.java,然后立即运行了 git status,但是它仍然在 "changes not staged" 和 "changes to be committed" 中显示该文件,非常困惑。 - Jose V

12
在 CVS、SVN、BZR 和其他许多工具中,一旦添加了文件,它就会被包含在下一次提交中。
但是在 GIT 中不是这样的。
在 git 中,您不是“添加一个文件”,而是“添加一个更改”(有时称为“暂存一个更改”)。
如果您对文件进行了两次更改,则必须两次“添加”它。

没错。我只想补充一下,你可以从文件中暂存一行或几行代码,甚至是某个部分(称为块)。这是一个很棒的功能,我经常使用它,例如当我在同一个文件中进行了更多(逻辑上不相关的)更改,并且我想将它们拆分成单独的提交时。 - David Ferenczy Rogožan

5
如果您修改了一个文件,添加了它,然后再次修改该文件,您将得到这种行为。当您执行git add操作时,它会添加到那个时间点的更改,并在之后提交而不重新添加时,只提交第一组已添加的更改。
$ git status
# On branch master
nothing to commit (working directory clean)

matthewfarwell (master)
$ vi foo.txt <-- add lines 1,2,3 here

matthewfarwell (master)
$ git add foo.txt

matthewfarwell (master)
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.txt
#

matthewfarwell (master)
$ vi foo.txt <-- add lines 4,5,6, here

matthewfarwell (master)
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.txt
#

如果我现在提交,只有第1、2、3行将被提交。


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