在处理另一个文件时,我编辑了README.md,然后运行了git add README.md。 当执行git commit时,我看到README.md既在"要提交的更改"中,又在"未暂存的未提交更改"中。

这有意义吗? 我可以在.git中的哪个位置查看该文件的权威状态?

# On branch master

# Changes to be committed:

#   (use"git reset HEAD ..." to unstage)

#

#       modified:   README.md

#       modified:   utils/arrterm

#

# Changes not staged for commit:

#   (use"git add ..." to update what will be committed)

#   (use"git checkout -- ..." to discard changes in working directory)

#

#       modified:   README.md

您可以这样想:您更改了10行。 使用git add -p,仅添加前5个更改。 现在,您的文件也已暂存且未暂存。

这意味着您所做的部分更改已暂存为提交,而部分更改尚未暂存。

您可以查看是否在运行阶段

git diff --staged -- README.md

并通过运行检查是否取消登台

git diff -- README.md

大多数版本控制系统通常仅存储两个状态之间的更改。 git的工作方式,当您对文件进行多次更改时,您将不得不添加/标记每个更改,使其成为一组更改的一部分,也就是一次提交。使用git add时,这是自动完成的。

但是,这不是添加所有唯一更改("大块")"索引"的唯一方法。例如,您可以对同一文件进行多次更改,然后在不同的提交中进行提交,或者仅将特定更改添加到提交中。例如。要将某些更改显式地添加到"索引"中,而不能将其他更改显式地添加,可以通过使用git add -p仅添加一些"大块"(组)而不是整个更改列表本身来进行。

这里发生的是,您在登台(git add)之前对README.md所做的更改将显示为已登台,而在登台README.md之后进行的任何更改将如上所示显示为未登台。

重要的是要知道git会暂存并提交内容行,而不是文件。这可能非常方便,例如,提交文件中的某些更改而保留其他更改以供将来提交。另外,git gui可以使查看和更改暂存文件的各个部分变得更加容易。

@ Jerry101:"内容行,而不是文件" ---说"更改"。因为:删除文件不包含行。更改权限同样如此

@zerkms是的,但是如果您更改文件的哪些部分已暂存/未暂存,则以"驼峰"的方式执行,这似乎是文本文件的一行或多行。如果我错了,请纠正我。

@ Jerry101:没错。您选择差异,因此会发生变化。多数民众赞成在我的确切点。

staged是一个选项,因此正确的语法是--staged。 (它是--cached,BTW的同义词,我通常会看到--cached的使用更多,但是--staged确实可以使用。)README.md不是一个选项,因此正确的语法是-- README.md。

我的歉意,间距错别字:(,现在已修复

Where in .git could I look to see the authoritative state of this file?

使用git diff:

git diff -- yourFile将为您提供尚未上演的更改(尚未添加到索引中)

git diff --cached -- yourFile将为您提供已添加到索引的更改。

在"更改而非文件"中查看更多信息:

Most version control systems work with files. You add the file to source control and the system tracks changes from that moment on.

Git concentrates on the changes to a file, not the file itself.

A git add file command does not tell git to add the file to the repository, but to note the current state of the file for it to be committed later.

另请参阅" git add -p:您尚未使用的最强大的git功能"

请注意,git status -v -v很快(Git 2.3.4,2015年第二季度)将显示两个差异(暂存和未暂存),可能会列出同一文件的不同差异。

请参阅"在git diff中同时显示暂存和工作树?"。

谢谢,我了解更改的想法。我对了解README.md为什么出现两次状态更感兴趣。

@MarkHarrison,因为您之前添加了更改,然后进行了新的更改

回答"这有意义吗?"

仅当您了解git不存储差异时,它才存储快照。

在示例中,您描述了更改中有两个版本的README.md。分阶段执行的是您当前满意的版本,如果您选择提交,它将最终成为文件的最新快照。未暂存版本是潜在的快照,如果您选择暂存版本,它将替换当前已暂存的版本。

阅读以下链接中的"快照,没有差异"部分,以进一步了解git的工作原理:

http://git-scm.com/book/en/Getting-Started-Git-Basics

另外,请查看以下链接,以进一步说明问题中包含的方案(尤其是"分段修改文件"部分):

http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository

实际上,您看到的状态很容易重现:

git init

touch test

git add test     #1

echo 42 > test   #2

git status       #3

在#1中,我们暂存空测试文件。 #2更改文件的内容。这些更改将不会被暂存(因为您需要使用git add显式暂存更改)。 #3中git status的输出完全告诉您。

要查看已进行的更改,请运行git diff --cached。要查看尚未对工作副本文件进行哪些更改,请运行git diff。

在您的问题中,可以说您运行了git commit。从您的git status输出中,好像未创建提交,可能是因为您没有输入提交消息。检查git commit的输出,git可能告诉您尝试创建提交时出了什么问题!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐