我有两个名为vvn.c
和aqu.c
的文件
我对vvn.c
进行了更改,我在git中进行了更改。
如何挑选相同的更改aqu.c
唯一的区别是API。
vvn.c
包含API vvn_function_names()
而aqu.c
包含API为unions_function_names()
我不知道该怎么做。 我知道樱桃采摘到同一个文件。 有没有办法做到这一点?
答案 0 :(得分:6)
不完全是挑选,但您可能想要使用:
git checkout <branch or sha of commit> -- filename
这将在另一个分支中按其版本检出文件;它是最简单的解决方案,如果它满足您的需求(即,如果您不需要从两个单独的分支实际合并对文件的更改)
另一种可能性是生成diff(你可以从一系列提交中生成diff并将其限制为一个文件),然后应用diff。查看:How to diff the same file between two different commits on the same branch?
答案 1 :(得分:3)
基本上,您需要对vvn.c
更改进行区分并将其应用于aqu.c
。参见例如在这里:How to apply a Git patch to a file with a different name and path?
然而,这是非常棘手的事情。为什么你有不同的文件名无论如何相似,以便你做同样的改变?
可能最好提出另一种方法。例如。对于C,您可以使用#include并将公共部分提取到单独的文件中。
答案 2 :(得分:1)
另一个可以更轻松地保留原始提交的作者信息的选项:
git cherry-pick
通常git mv
将文件放置到位git commit --amend
修改精心挑选的提交如果原始形式的提交会修改存储库中已经存在的文件,那么您可能需要执行几个额外的步骤(我尚未测试此部分):
git checkout --orphan temp/cherry-pick
(ref)git reset
git cherry-pick temp/cherry-pick
答案 3 :(得分: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
可以为您提供帮助。