Git 重新添加已经被暂存的文件。

8

我经常遇到这样的情况:我已经使用git add将一组文件添加到提交中,但后来又必须修改这些文件,因此在Changed but not updated中出现了这些文件的修改。

有没有一行命令可以只将存在于Changed but not updatedChanges to be committed列表中的文件添加到git add中?

markdsievers$git status
# On branch master
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   src/com/foo/Bar.java
#   modified:   src/com/foo/Foo.java
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   src/com/foo/Bar.java
#   modified:   src/com/foo/Foo.java
#   modified:   src/com/foobar/FooBar.java

对于上面的示例,我只想要Foo.javaBar.java但不想要FooBar.java添加到要提交的更改:列表中。


你是否考虑过除了 git add -u 以外的其他方法? - Greg Hewgill
git add -u 似乎需要一个文件模式,否则它会使用 . 添加 Foobar.java。是的,我可以添加一个文件模式来解决我的矫揉造作的示例,那样可以起作用,但是更改通常不会那么简单,一个单一的文件模式可能行不通。 - markdsievers
2个回答

4
这是一种方式:
 git add -u $(git status --porcelain | grep ^MM | cut -d ' ' -f 2)

嗨,谢谢您。我不知道 --porcelain 的存在。虽然也许我的工作流需要调整,但我觉得这并不是一个不合理的特性请求。 - markdsievers
这对我来说并没有完全起作用... 它试图添加已修改但尚未暂存的文件。 - Darien
+1!但它只在git根目录中有效,而使用git status -s则可以在任何目录中使用。 - pktangyue
经过6年的时间,我可以自信地说这是一个工作流问题。别在主分支上做更改了,孩子们!checkout一些功能分支吧! - markdsievers

0

如果文件名包含空格,则接受的答案将无法正常工作。此外,在这种情况下,-u是无用的,但如果没有文件既在“已更改但未更新”列表中,又在“要提交的更改”列表中,则会添加所有未暂存的文件。请改用以下方法:

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^MM(.*)$/')

这仅适用于仅更改的文件。如果您希望此功能也适用于已删除、添加、重命名或复制的文件,请使用以下内容:

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^[MADRC][MD](.*)$/')

但是最后一个要小心。例如,如果文件已添加至索引,但删除未暂存,则运行此命令也会删除索引中的文件,导致您丢失该文件的内容。

请注意,这两个命令只能在 git 仓库的根目录下运行。


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