Git撤消对特定变更集中与正则表达式匹配的文件所做的更改

Git撤消对特定变更集中与正则表达式匹配的文件所做的更改,git,version-control,diff,Git,Version Control,Diff,假设我有一堆被变更集X修改过的文件。这个变更集目前是HEAD。我想将所有与regex'*Test.java'匹配的文件更改分离到另一个更改集中。如果我这样做: git diffstat HEAD^ HEAD 我现在会得到如下结果: M a/b/c/ThisIsSomeClass.java M a/b/c/d/ThisIsSomeTest.java M a/JustAnotherClass.java M a/b/c/AnotherTest.java

假设我有一堆被变更集X修改过的文件。这个变更集目前是HEAD。我想将所有与regex'*Test.java'匹配的文件更改分离到另一个更改集中。如果我这样做:

git diffstat HEAD^ HEAD
我现在会得到如下结果:

M       a/b/c/ThisIsSomeClass.java
M       a/b/c/d/ThisIsSomeTest.java
M       a/JustAnotherClass.java
M       a/b/c/AnotherTest.java

要将*Test.java文件分离到另一个变更集中,我可以执行哪些git命令序列?

类似的操作应该可以。确保首先在Git回购协议的副本中运行它,以确保它正常工作;如果不小心运行
重置
,可能会丢失工作。一般来说,当进行这样的操作时,您应该确保您的目录是干净的;所有内容都应该提交、隐藏或忽略,这样就不会有任何重要的更改或未提交的文件

git reset --soft HEAD^
git reset $(git diff --cached --name-only -- '*Test.java')
git commit -m "This is the first commit, that does not contain the *Test.java"
git add -u .
git commit -m "This is the second commit, of just the *Test.java files"

reset--soft
会将您重置为提交
HEAD^
,但上次提交的所有更改仍处于暂存状态,准备提交。下一个
git reset
将取消所有名为
*Test.java
的已更改文件的转储,而其他文件仍处于暂存状态。提交操作将提交仍处于暂存状态的更改。现在使用
git add-u再次暂存所有其他文件。
(这将仅暂存已更改的文件,不会添加新文件,因此即使您有其他不想添加到提交中的文件,也可以安全运行;如果您确实有在执行此操作过程中未暂存的新文件,请删除
-u
或单独添加它们)。然后提交第二组文件。

工作得很好。非常感谢。有一个问题:--cached与--staged相同,对吗?是的,
--cached与
--staged
相同。