我有两个名为vvn.c
和aqu.c
的文件我对vvn.c
进行了更改,并在git中进行了提交。如何挑选与aqu.c
相同的更改唯一的区别是API的。
vvn.c
包含API作为vvn_function_names()
而aqu.c
包含作为unions_function_names()
的API
我不知道该怎么做。我知道在同一个文件里挑选樱桃。有办法做到这一点吗?
不完全是樱桃采摘,但您可能想使用:
git checkout <branch or sha of commit> -- filename
这将按文件在另一个分支中的版本签出该文件;这是最简单的解决方案,如果它满足您的需求(即,如果您不需要实际合并来自两个独立分支的文件更改)
另一种可能性是生成diff(你可以从一系列提交中生成diff,并将其限制为一个文件),然后应用diff。看看:如何在同一分支上的两个不同提交之间对同一文件进行diff?
基本上,您需要对vvn.c
的更改进行差异处理,并将其应用于aqu.c
。例如,请参阅此处:如何将Git补丁应用于具有不同名称和路径的文件?
然而,这是一件相当棘手的事情。为什么你们有不同的文件名,这些文件名无论如何都很相似,所以你们应该做出相同的更改?
也许最好想出另一种方法。例如,对于C,您可以使用#include并将公共部分提取到一个单独的文件中。
另一个更容易保存原始提交的作者信息的选项:
git cherry-pick
正常git mv
文件到位git commit --amend
修改樱桃选择的提交
如果原始形式的提交会修改存储库中已经存在的文件,那么您可能需要几个额外的步骤(我还没有测试过这一部分):
git checkout --orphan temp/cherry-pick
(参考文献)git reset
- 按照第一组步骤应用提交
- 最后切换回原来的分支和
git cherry-pick temp/cherry-pick
我使用了一个补丁文件。通过这种方式,我可以编辑修补程序文件中的路径以匹配新位置。
您可以创建一个补丁文件:
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
,可以帮助您。