Git 提交提交暂存和未暂存文件

标签 git

TL;DR:当一个文件具有暂存和未暂存更改时,提交将提交两个版本,以及对文件的最新更改。为什么?我认为提交只会提交暂存版本,如此处所述: https://stackoverflow.com/a/19892657/279516

假设我们的工作目录中有一个文件。 (它之前已经提交给 repo 。)

$ ls
foo.txt

该文件的内容目前只有一个字符(数字 1):
$ cat foo.txt
1

让我们将文件的内容更改为“12”。现在我们有这个:
$ cat foo.txt
12

我们的工作目录显示了更改(为简洁起见,删除了说明性 git 输出):
$ git status
modified:   foo.txt

现在 git add 会将该文件添加到暂存索引中。
$ git add foo.txt

你在这里看不到它,但文件名现在是绿色的,表明它已经上演了:
$ git status
modified:   foo.txt

此时,我们可以提交文件,它将成为我们本地存储库的一部分。但是,让我们先更改 foo.txt 看看会发生什么。
$ cat foo.txt
123

如果我们检查 git status,我们会看到 foo.txt 的两个版本:
$ git status
On branch master
Changes to be committed:

        modified:   foo.txt

Changes not staged for commit:

        modified:   foo.txt

第一个 foo.txt 是绿色的。第二个是红色。第一个的内容为“12”。第二个有“123”。如果我们现在提交会发生什么?只应提交暂存的 foo.txt。所以以“12”为主体的 foo.txt 将在我们的本地仓库中。 foo.txt 的另一个版本仍然在我们的工作目录中。

foo.txt 提交到我们的本地存储库,就像我们添加它时一样:
$ git commit -m "Added 2 to foo." foo.txt

然而,事实并非如此。我们的工作目录现在没有变化。两个版本都提交了。为什么?
$ git status
On branch master
nothing to commit, working tree clean

最佳答案

如果您只想提交暂存版本,请在不指定任何文件的情况下运行 git commit

例子:

$ echo 2 > foo
$ git add foo
$ echo 3 > foo
$ git commit -m haha

现在已提交暂存版本,而未暂存的更改仍保留在您的工作目录中。这很容易验证:
$ git show HEAD:foo
2
$ git diff
--- a/foo
+++ b/foo
@@ -1 +1 @@
-2
+3

也许让我用另一个例子来演示这种行为(带有文件的 git commit):

执行这些操作:
$ git init
$ echo 1 > foo
$ echo 1 > bar
$ git add foo bar
$ git commit -m 1

现在 foobar 都已提交
$ echo 2 > foo
$ echo 2 > bar

现在两者都已更改,让我们暂存 foo 并提交 bar :
$ git add foo
$ git commit -m 2 bar
$ git status
Changes to be committed:
    modified: foo
$ git diff --name-only HEAD~ HEAD
bar

您会看到 foo 在提交中未更改,但保留了暂存状态。

关于Git 提交提交暂存和未暂存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53616041/

相关文章:

git - RPM 规范中的 Source0 可以是 git repo 吗?

javascript - 在 Aptana Studio 中自动插入版本号

git - 如何使用 github PR 工作流程更好地针对分布式系统进行端到端测试?

git高级别名参数问题

swift - 提交失败 - 存储库已锁定,XCode 7

git - 替换git中一个目录的内容

git - 如何更新 Git 克隆

git - 使用 git,如何将工作树(本地文件系统状态)重置为索引 ("staged"文件的状态)?

git - 如何管理一个项目的多个版本?

git - 从命令行添加换行符到 'git commit -m'