如何挑选从一个文件到另一个文件的更改?

How to cherry-pick changes from one file to another file?

我有两个文件 vvn.caqu.c 我对 vvn.c 进行了更改,并且在我的 git 中进行了该提交。 如何挑选对 aqu.c 的相同更改 唯一的区别是 API 的。

vvn.c 包含 API 作为 vvn_function_names()

aqu.c 包含 API 作为 unions_function_names()

我不知道该怎么做。 我知道将樱桃挑选到同一个文件中。 有什么办法吗?

不完全是精选,但您可能想使用:

git checkout <branch or sha of commit> -- filename

这会根据文件在另一个分支中的版本签出该文件;这是最简单的解决方案,如果它满足您的需求(即,如果您不需要实际合并来自两个单独分支的文件更改)

另一种可能性是生成差异(您可以从一系列提交中生成差异并将其限制为一个文件)然后应用差异。查看:How to diff the same file between two different commits on the same branch?

基本上,您需要对 vvn.c 更改进行区分,并将它们应用到 aqu.c。参见例如这里:How to apply a Git patch to a file with a different name and path?

不过,这是一件很棘手的事情。为什么你有不同的文件名,但无论如何相似,所以你应该做出相同的更改?

可能最好想出另一种方法。例如。对于 C,您可以使用 #include 并将公共部分提取到单独的文件中。

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

  • git cherry-pick正常
  • git mv文件到位
  • git commit --amend 修改 cherry-picked 提交

如果原始形式的提交会修改存储库中已经存在的文件,那么您可能需要几个额外的步骤(我还没有测试这部分):

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

我用的是补丁文件。这样我就可以编辑补丁文件中的路径以匹配新位置。

您可以创建补丁文件:

git format-patch {commit}~1...{commit}

这会在本地目录中生成一个包含更改的 .patch 文件。

-或-

git show {commit} > {my-changes.patch}

其中 {my-changes.patch} 是 filename/path 您确定的。

现在在编辑器中编辑 {my-changes.patch} 文件并将旧路径替换为新路径。此时可以进行其他编辑或更改。

现在您可以应用补丁:

git am < {my-changes.patch}

如果你编辑了一些东西并破坏了补丁,你会得到一个错误。检查您可能执行的步骤和编辑,然后重试。这种方法的一个好处是,您可以根据需要重置、撤消编辑的部分或编辑中的整个文件。但是,正在应用的更改没有用户拼写错误,因为 git 正在对原始更改进行合并。

重要的是,在您提交更改之前,比较您所做的更改并确保它们是您想要的。 然后才 暂存并提交它们。

注意:git am 有很多选项,例如 --ignore-whitespace--interactive 可以帮助您。