【问题标题】:is `git diff` able to apply diff to the current working tree?`git diff` 是否能够将 diff 应用于当前工作树?
【发布时间】:2016-03-12 10:18:38
【问题描述】:

我有一组提交,比如从提交 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 apply。 (另见git am,但am 用于完整提交,而不是单个文件。)如前所述,squashes 可能更合适(和/或git cherry-pick -n)。
  • @torek:谢谢。我认为git apply 是我需要的。

标签: git diff patch


【解决方案1】:

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

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


git-apply - 将补丁应用到文件和/或索引
git-am strong> - 从邮箱应用一系列补丁

【讨论】:

    【解决方案2】:

    可以通过差异和修补来做到这一点,但这对于git rebase -i 来说确实是一个更好的例子。

    如果A..Z 是您要处理的提交范围,请使用git rebase A^ Z,然后将所有行切换到edit,并使用git reset &lt;files&gt;git checkout -- &lt;files&gt; 等命令仅保留更改你想要的。

    然后,如果不知道第一次要做什么,我会第二次通过 git rebase -i 进行任何必要的压缩。

    【讨论】:

    • 是的,我知道交互式变基。但在我的情况下有两个警告:1.它用新的历史替换现有的历史(不确定是否可以不替换现有的历史)2.这是手动过程。相反,我想创建一个能够生成 RC1、RC2 等的 shell 脚本
    • 呃,你也在用任何其他方法替换历史记录......不过,旧的提交仍然在 reflog 中可见。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 2011-06-18
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2018-09-18
      相关资源
      最近更新 更多