`git diff` 是否能够将 diff 应用于当前工作树?

is `git diff` able to apply diff to the current working tree?

我有一组提交,比如从提交 A 到提交 Z。这组更改存储库中的文件集。这就像功能的开发历史,有很多尝试和失败。

现在我想清理历史记录,减少提交次数并从历史记录中删除错误尝试。我想保持当前的开发分支不变,并在另一个名为 feature-rc1 的分支中创建干净的历史记录。稍后此分支将合并到上游存储库。

所以我的计划是将对某个文件 file1.cpp 所做的所有更改应用到 feature-rc1 分支的工作树中。然后我将对 file2.cppfile3.cpp 做同样的事情。然后我提交更改并继续另一个文件并提交。所以我的基本操作是这样的:

git diff A Z -- file1.cpp >temp.diff
patch -P1 <temp.diff
git diff A Z -- file2.cpp >temp.diff
patch -P1 <temp.diff
git diff A Z -- file3.cpp >temp.diff
patch -P1 <temp.diff
git commit -a -m "commit"

我的问题是是否可以避免使用临时差异文件和外部实用程序,例如 patch?如果 git diff 具有将差异结果应用于当前工作树的内置功能,或者如果有另一个具有相同功能的 git 命令,那就太好了。

更新: 我认为可以避免这样的临时文件:

git diff A Z -- file1.cpp | patch -P1

但最好也避免 patch:

git diff A Z -- file1.cpp | git ????

什么可以代替 ????

如果您想应用更改,您应该使用 git format-patch 命令生成补丁,然后使用 git apply 将它们应用到所需的 branch/project。

获得补丁后,使用 git amgit apply 将补丁添加到所需的 branch/project。


git-apply - Apply a patch to files and/or to the index
git-am - Apply a series of patches from a mailbox

可以通过 diffing 和 patching 来做到这一点,但这确实是 git rebase -i 的更好案例。

如果 A..Z 是您要使用的提交范围,请使用 git rebase A^ Z,然后将所有行切换为 edit,并使用 git reset <files> 等命令] 和 git checkout -- <files> 以仅保留您想要的更改。

然后我会进行第二遍 git rebase -i 以进行任何必要的挤压,如果第一次遍要做什么不是很明显的话。

@torek 在评论中提供了我问题的最佳答案。 答案是 git apply 命令,它可以将 git diff 的输出应用到工作树。