git只重新添加那些已经暂存的文件

git只重新添加那些已经暂存的文件,git,Git,我经常遇到这样一种情况,我在git中添加了一组文件以进行提交,但随后不得不对这些文件进行修改,因此最后对中的相同文件进行了修改,但没有更新 我是否可以执行一行代码,只添加已更改但未更新的和要提交的更改列表中存在的文件 markdsievers$git status # On branch master # # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified:

我经常遇到这样一种情况,我在
git中添加了一组文件以进行提交,但随后不得不对这些文件进行修改,因此最后对
中的相同文件进行了修改,但没有更新

我是否可以执行一行代码,只添加
已更改但未更新的
要提交的更改
列表中存在的文件

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
markdsievers$git状态
#论分行行长
#
#要提交的更改:
#(使用“git重置磁头…”取消分级)
#
#修改:src/com/foo/Bar.java
#修改:src/com/foo/foo.java
#
#已更改但未更新:
#(使用“git add…”更新将提交的内容)
#(使用“git签出--…”放弃工作目录中的更改)
#
#修改:src/com/foo/Bar.java
#修改:src/com/foo/foo.java
#修改:src/com/foobar/foobar.java
对于上面的示例,我只想将
Foo.java
Bar.java
添加到
FooBar.java
要提交的更改列表中。

这是一种方法:

 git add -u $(git status --porcelain | grep ^MM | cut -d ' ' -f 2)

如果文件名包含空格,则接受的答案无效。此外,-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 repo的根目录下工作。

您是否在考虑除
git add-u
之外的其他内容?
git add-u
似乎需要一个文件模式,否则它会使用
来添加
Foobar.java
。是的,我可以添加一个文件模式来获得我设计的示例,这会起作用,但更改很少像单个文件模式那样简单。您好,谢谢。不知道关于瓷器的事。我不认为这是一个不合理的功能,要求从git,虽然也许这是我的工作流程,需要调整。这不是很适合我。。。它尝试添加已修改但尚未暂存的文件。+1!但是它只在git根目录下工作,而使用
git status-s
,它可以在任何目录下工作。在我问这个问题6年后,我可以自信地说这是一个工作流问题。停止对主功能和签出功能分支进行更改,小子!