如何从一个文件中挑选变更内容并应用到另一个文件中?该问题涉及IT技术。

11
我有两个文件,一个叫做vvn.c,另一个叫做aqu.c。我对vvn.c进行了更改,并将其提交到了我的git中。如何将相同的更改cherry-pick到aqu.c中去呢?唯一的区别是API不同。 vvn.c包含API为vvn_function_names()
aqu.c包含API为unions_function_names()
我不知道该怎么做,我只知道如何将更改cherry-pick到同一文件中。有没有办法做到这一点?

https://dev59.com/x2Qn5IYBdhLWcg3w1qEc#16527024 这才是你可能想要的答案。如果其他人也来到这里,应该提一下。 - Adam McCormick
4个回答

10
不完全是筛选功能,但您可以使用以下命令:git checkout <branch or sha of commit> -- filename。这会按其版本在另一个分支中签出该文件;如果满足您的需求(即,如果您不需要实际合并两个分支中文件的更改),则这是最简单的解决方案。
另一种可能性是生成差异(您可以从一系列提交中生成差异,然后将其限制为一个文件),然后应用差异。请查看:如何在同一分支上区分两个不同提交之间的相同文件?

你能否举个第一个的例子? - optimus prime
在您的情况下,应该是这样的:git checkout branch-witch-aqu-changes -- aqu.c - Tomas Kulich
嗯,我在同一个分支中有两个文件。vvn.caqu.c在不同的目录中。那么现在该如何检出呢? - optimus prime
据我所知,您想从另一个分支中仅检出一个文件。如果是这样,您不应该关心vvn.c,您只需要从包含此文件正确版本的提交中执行此操作即可。 - Tomas Kulich

4
基本上,您需要对 vvn.c 的更改进行差异分析,并将其应用于 aqu.c。例如,请参见这里: 如何将 Git 补丁应用于具有不同名称和路径的文件? 但是,这是非常棘手的事情。为什么您拥有不同的文件名,然而它们很相似,以至于您应该进行相同的更改呢?
可能最好想出另一种方法。例如,对于 C 语言,您可以使用 #include 并将公共部分提取到单独的文件中。

1
我使用补丁文件。这样,我可以编辑补丁文件中的路径以匹配新的位置。您可以使用以下命令创建补丁文件: "git format-patch {commit}~1...{commit}",这将在本地目录中生成一个包含更改内容的 ".patch" 文件。或者您也可以使用命令 "git show {commit} > {my-changes.patch}",其中 "{my-changes.patch}" 是您指定的文件名/路径。现在,您需要在编辑器中编辑 "{my-changes.patch}" 文件,并将旧路径替换为新路径。此时还可以进行其他编辑或更改。最后,您可以使用命令 "git am < {my-changes.patch}" 应用补丁。
如果您编辑了某些内容并破坏了补丁,则会出现错误。检查您所做的步骤和编辑,并重试。使用此方法的一个好处是,如果需要,您可以重置、撤消部分编辑或整个文件。但是,应用的更改不受用户拼写错误的影响,因为 git 是根据原始更改进行合并的。
在提交更改之前,重要的是要查看您所做的更改并确保它们符合您的要求。只有在这种情况下,才可以将其暂存并提交。
注意:git am 有很多选项,比如--ignore-whitespace 和 --interactive 可以帮助您。

1

另一种更容易保留原始提交作者信息的选项:

  • git cherry-pick 正常操作
  • git mv 将文件移动到正确位置
  • git commit --amend 修改挑选的提交

如果原始提交将修改已经存在于仓库中的文件,则可能需要几个额外步骤(我没有测试过这部分):

  • git checkout --orphan temp/cherry-pick (ref)
  • git reset
  • 按照第一组步骤应用提交
  • 最后切换回原始分支并执行 git cherry-pick temp/cherry-pick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接