是`git diff`能够将diff应用到当前工作树吗?

时间:2016-03-12 10:18:39

标签: git diff patch

我有一组提交,比如提交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"

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

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

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

但是,避免patch也很棒:

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

有什么可以代替????

3 个答案:

答案 0 :(得分:1)

如果您想应用更改,请使用git format-patch命令生成修补程序,然后使用git apply将它们应用到所需的分支/项目。

enter image description here

获得补丁后,使用git amgit apply将补丁添加到所需的分支/项目中。

  

git-apply - 将修补程序应用于文件和/或索引
   git-am - 从邮箱中应用一系列补丁

答案 1 :(得分:0)

可以通过差异和修补来实现这一点,但这对some.ex来说确实是一个更好的例子。

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

然后我会再做一次git checkout -- <files>来做任何必要的挤压,如果第一次通过不明显的话。

答案 2 :(得分:0)

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