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
现在
foo
和 bar
都已提交$ 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/