出于某种原因,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
Dir1
,Dir2
和filename.cpp
绝对是同一个文件。我不得不再次添加filename.cpp
以使其显示为要提交的更改(在它最初位于存储库之后)。关于唯一可能导致问题的是我隐藏了pull --rebase
,然后弹出了stash
? .gitignore
未在任何地方列出Dir1
,Dir2
或filename.cpp
,且模式不建议他们会抓住此文件?
答案 0 :(得分:29)
这意味着您对filename.cpp
进行了更改,添加了更改(使用git add
),然后进行了另一项尚未添加的更改。
“要提交的更改”部分意味着Git已通过更改更新其索引。运行git commit
时,对索引的更改将用于创建新的提交对象。
“未分阶段更改”部分显示索引与工作副本之间的差异。
您可以重现您所看到的内容:
git status
。你会看到“没有上演的变化”。git add filename.cpp
git status
。您将看到“要提交的更改”。git status
。您将看到“未更改的更改”和“要提交的更改”。这有意义吗?解释Git如何运作总是有点棘手。
答案 1 :(得分:10)
在CVS,SVN,BZR以及毫无疑问的其他工具中,一旦添加了文件,这意味着它将被包含在下一次提交中。
不是GIT。
在git中你没有“添加文件”,你“添加了一个更改”(有时它被称为“阶段变化”)。
如果您更改文件两次,则必须“添加”两次。
答案 2 :(得分:4)
如果您修改文件,添加它们并重新修改文件,您将得到此行为。当您执行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行。