如何挑选从一个文件到另一个文件的更改?
How to cherry-pick changes from one file to another file?
我有两个文件 vvn.c
和 aqu.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
可以帮助您。
我有两个文件 vvn.c
和 aqu.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
可以帮助您。