【问题标题】:How to cherry-pick changes from one file to another file?如何挑选从一个文件到另一个文件的更改?
【发布时间】:2016-09-25 18:53:40
【问题描述】:

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

vvn.c 包含 API 为 vvn_function_names()

aqu.c 包含 API 为 unions_function_names()

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

【问题讨论】:

标签: git cherry-pick git-cherry-pick


【解决方案1】:

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

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

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

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

【讨论】:

  • 你能举一个关于第一个的例子吗?
  • 在你的情况下,它会是:git checkout branch-witch-aqu-changes -- aqu.c
  • 嗯。我在同一个分支中有两个文件。 vvn.caqu.c 位于不同的目录中。那么现在如何结账呢?
  • 据我了解,您只想从另一个分支签出一个文件。如果是这样,您不应该关心 vvn.c,您只需从该文件所在的提交中执行此操作在它的正确版本..?
【解决方案2】:

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

然而,这是一件相当棘手的事情。为什么你有不同的文件名,但无论如何都相似,所以你应该进行相同的更改?

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

【讨论】:

    【解决方案3】:

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

    • git cherry-pick正常
    • git mv文件就位
    • git commit --amend 修改精选提交

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

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

    【讨论】:

      【解决方案4】:

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

      您可以使用以下命令创建补丁文件:

      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 可以帮助您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        • 2014-04-21
        • 1970-01-01
        • 2014-01-26
        相关资源
        最近更新 更多