如何对已在索引中暂存的文件暂存后续更改?

How to stage subsequent changes to a file that has already been staged in index?

我对文件进行了一些更改,然后将其暂存在索引中以供下一次提交。然后我意识到我需要做更多的改变。有没有办法在最终提交之前捕获这些后续更改,而不是取消暂存?

会不会

git add -u filename (与我对 filename 文件进行更改的次数一样多)

而不是

git重置

git 添加文件名

?

您可以对同一个文件多次调用 git add filename

它会始终添加任何现有的非暂存更改,无论文件是否已在索引中更改。


-u 标志(--update 的快捷方式)有不同的用途。来自 the man page:

Update the index just where it already has an entry matching <pathspec>. This removes as well as modifies index entries to match the working tree, but adds no new files.

换句话说:如果 filename 以前从未被跟踪过,git add -u filename 将不会将其添加到索引中。但是对于已经被跟踪的文件,使用 -u 标志没有区别。

显示对已经暂存的文件进行后续更改的影响的示例,并且每次 运行 "git add"

回声"new file" > newfile.txt

git 添加 newfile.txt

git ls-files --stage [注意newfile.txt对应的对象]

100644 fa49b077972391ad58037050f2a75f74e3671e92 0 newfile.txt

ls -Fls .git/objects/fa [查看 fa 文件夹]

1 -r--r--r-- 1 user1234 1049089 24 Mar 19 00:17 49b0779 ......

回显 "adding a second line to my new file" >> newfile.txt

git 添加 newfile.txt

git ls-files --stage [注意newfile.txt对应的新对象]

100644 9f70c3077ccb16453d0ad0c152e8c169f81d8466 0 newfile.txt

ls -Fls .git/objects/9f [查看 9f 文件夹]

1 -r--r--r-- 1 user1234 1049089 54 Mar 19 00:22 70c3077 ......

git fsck | grep fa49b0779 [扫描悬空 blob]

检查对象目录:100% (256/256),完成。 检查对象:100% (462/462),完成。 dangling blob fa49b0779.... [发现之前的blob现在是悬空的!]

git fsck | grep 9f70c3077 ...... [扫描当前blob是否悬空]

检查对象目录:100% (256/256),完成。 检查对象:100% (462/462),完成。 [很明显,没找到!]

echo "this is the third line" >> newfile.txt [对 newfile.txt 进行更多更改]

git 添加 newfile.txt

git fsck | grep 9f70c3077..... [再次扫描9f70c3077......]

检查对象目录:100% (256/256),完成。 检查对象:100% (462/462),完成。 悬挂 blob 9f70c3077....

[这次,我们发现9f70c3077……不再是newfile.txt对应的blob了。它现在悬空,等待垃圾收集器将其清除!]