如何在Git中重新添加已添加的文件(仅更新暂存文件)?

8
我们已经修改了路径为path/to/another/path/to/main/下的文件。
path/to/main/下的文件已经添加到git缓存中,但我们再次更新了path/to/main/Bar.php文件。现在我们有以下情况:
$ git status
[...]
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   path/to/main/Foo.php
        modified:   path/to/main/Bar.php

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:   path/to/main/Bar.php
        modified:   path/to/another/Aaa.php
        modified:   path/to/another/Bbb.php

请注意,路径/path/to/main/Bar.php出现了两次。

我需要一条命令,可以重新添加之前添加的文件,而无需使用特定路径。

附注:git add --update会添加所有这些文件。但它不起作用。

另外,此命令应能重新添加“modified:”和“new file:”类型的文件。

更新1

感谢@AyonNahiyan,是的,它在bash中可行。但也许有一种不使用bash技巧(子命令)的命令。


你可以执行 git reset 然后再次执行 git add - potame
当你执行 git reset 命令时,你将失去文件列表。这并不起作用。 - Kirby
哪些文件丢失了?我不明白你的意思。 - potame
@potame,git reset会从“stage”中删除文件。假设我们有20个位于不同目录下的文件,那将是一场灾难 :) - Kirby
如果您只想删除单个文件,请使用 git reset -- path/to/main/Bar.php。然后再次运行 git add path/to/main/Bar.php - potame
显示剩余3条评论
4个回答

21

这显示了仅处于暂存状态的文件列表:

git diff --name-only --cached

现在使用它们的新更改对这些文件进行分组(在bash中操作)

git add $(git diff --name-only --cached)

注意:(前提条件)在运行这些命令时,您需要处于git存储库的根目录。 在任何子文件夹中运行将无法正常工作。


我想你的意思是 git add $(git diff --name-only --cached)。没错,它可以工作。 - Kirby
2
FYI:对于“已删除”的文件会中断。但非常有用。 - teddybear
非常有用的命令,谢谢。唯一的问题是,它会输出完整的文件路径,所以如果你不在 git 仓库的根目录下,这个命令就无法工作。 - Husmus

13

git update-index 可以用于此目的。

具体来说,

git update-index --again

应该可以工作。

--again 选项选择与 HEAD 不同的已在索引中的文件。

update-index 的实际操作是将这些文件的新内容拉入索引中。


1
是的,没错。但是有一个性能问题。我在git中有24000个文件,尝试重新添加仅有的一个文件,但速度太慢了。 :( 也许它尝试从缓存中添加所有文件。 - Kirby

7
git update-index --again

这条命令会按照你的要求执行。需要注意的是,默认情况下,此命令会在当前工作目录(以及子目录,递归地)进行操作。如果想要将此命令应用于整个代码库,需要添加路径规范

git update-index --again :/:

:/: 在这里表示“工作树的根目录”。

P.S. 您可以将此命令的别名添加到您的.gitconfig文件中,例如:

[alias]
    readd = update-index --again :/:

0
Ayon的答案有效。修复已删除文件的一个可能方法是添加另一个参数。
--diff-filter=d

这将从“git add”中排除所有已删除的文件。 关于如何使用此参数的更多信息可以在以下线程中找到: 根据更改类型过滤git diff


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接