Git Cherry-Pick

3
我是git的新手,我了解git cherry-pick的工作原理,但这是我的问题:
最近,我的团队中有人在主分支中更改了目录结构,但未更改另一个分支的目录结构。
现在,当我在分支中更改代码时,我想将它们(cherry-pick)带入主分支。在主分支和分支中的目录结构相同时,这很好处理。
topDir/some/subdir/file -- 主分支 topDir/some/other/subdir/file -- 分支
文件(其更改应带入主分支)相同,但不是包含它的目录结构。当我尝试按照平常的方式进行cherry-pick时,会出现以下错误:
git checkout master git cherry-pick commit error: pathspec topDir/some/other/subdir/file does not exist
那么,在这种情况下进行cherry-pick的最佳方法是什么?非常感谢您提供任何指针。
好的。我刚刚注意到,在相同的情况下,当我进行cherry-pick时,Git实际上足够聪明,可以从提交中正确选择其中一个文件,但不会识别另一个文件。
使用我在原始帖子中提到的相同示例: 在同一次提交中, topDir/some/subdir/file1, topDir/some/subdir1/file2。
我进入拥有“file1”和“file2”的主分支,只是在不同的目录结构中: topDir/src/some/subdir/file1 topDir/src/some/subdir1/file2。
现在,如果我进行cherry-pick,Git足够聪明,可以选择文件1的更改,即使这个文件在不同的目录结构中,但不会选择文件2的更改。有任何指针吗?如果有人想让我更清楚,我将很高兴地做到。
所以,我为了解决问题而做的事情是进行cherry-pick,手动更改Git没有捕捉到的那个文件,然后“git commit -C”。

嗯,这个有点棘手,你的目录结构改变有什么原因吗?新的目录结构是你想要保留在主分支中的吗,还是最终你想要的是主分支的目录结构? - Will Buck
谢谢你的快速回复,威尔。不确定原因,也不确定如果我再问一次是否会得到更好的答复。是的,主分支上的那一份将是永久的。 - Krishna Kumar
你尝试过挑选更改文件位置的提交,然后再挑选你想要的更改吗? - Carl
没有,我还没有尝试过。我会去试一下并告诉你结果的。感谢你的回复。 - Krishna Kumar
元提案:将问题标题更改为“在不同目录结构之间使用Git Cherry-Pick” - U. Windl
2个回答

5

非常乐意帮忙 :) 如果主分支中的更改是永久性的,我会在主题分支中修复文件结构以匹配主分支,提交更改到分支中,然后将更改合并到主分支,而不是挑选。就像这样

git checkout branch
mv other/subdir/file subdir/file
git status
// git add and git rm to get the commit proper
git commit -m "fixing file struct"
git checkout master
git merge branch

实际上,这取决于文件的使用情况以及您想要包含在主分支中的内容。这更多地涉及到您公司的具体问题,而不是任何人都能为您回答的技术问题。


谢谢Will。我想我应该尝试一下carleeto建议的方法,如果那行不通,你在这里推荐的方法就是正确的选择。我会标记这个问题已解决,但如果其他人有任何其他有用的建议,请提出,因为这似乎是不多见的情况。 - Krishna Kumar
Carleeto的建议确实是一个不错的选择,但只有在您想要将主题分支中的文件目录结构移动到主分支中时才适用。如果您希望文件真正替换主分支中的文件(这是我在看到想要挑选的愿望时所想到的),我建议不要这样做。只是出于好奇,我们正在谈论什么类型的文件?这是一个代码项目吗?静态文档文件? - Will Buck
是的,这是一个代码项目。涉及到的文件是C++文件。 - Krishna Kumar
对于C++来说,这可能取决于您的makeFile或构建工具对目录结构的期望,以及是否觉得同时拥有该文件的两个实现会有价值。如果答案是肯定的,那么Carleeto的策略将是最佳选择。但是,如果您想要此实现替换其他实现,则需要正确合并它。无论如何,不用担心失去旧实现,这就是git的作用 :) - Will Buck
没问题,克里希纳!别忘了点赞答案并采纳它们 ;) - Will Buck
我也是新来的StackOverflow用户,好的,我会的。 - Krishna Kumar

0
假设我们有节点A,B,C,D,E和F。用户当前在F节点上,并希望使用类型git命令像Git Cherry-Pick C一样选择性地挑选C节点,然后此命令将C节点应用于F节点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接