`git diff` 是否能够将 diff 应用于当前工作树?
is `git diff` able to apply diff to the current working tree?
我有一组提交,比如从提交 A 到提交 Z。这组更改存储库中的文件集。这就像功能的开发历史,有很多尝试和失败。
现在我想清理历史记录,减少提交次数并从历史记录中删除错误尝试。我想保持当前的开发分支不变,并在另一个名为 feature-rc1
的分支中创建干净的历史记录。稍后此分支将合并到上游存储库。
所以我的计划是将对某个文件 file1.cpp
所做的所有更改应用到 feature-rc1
分支的工作树中。然后我将对 file2.cpp
和 file3.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 am
或 git 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
的输出应用到工作树。
我有一组提交,比如从提交 A 到提交 Z。这组更改存储库中的文件集。这就像功能的开发历史,有很多尝试和失败。
现在我想清理历史记录,减少提交次数并从历史记录中删除错误尝试。我想保持当前的开发分支不变,并在另一个名为 feature-rc1
的分支中创建干净的历史记录。稍后此分支将合并到上游存储库。
所以我的计划是将对某个文件 file1.cpp
所做的所有更改应用到 feature-rc1
分支的工作树中。然后我将对 file2.cpp
和 file3.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 am
或 git 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
的输出应用到工作树。