我在分支B.在一堆提交之后,分支A准备/需要一些文件,但许多文件没有准备/需要。我想合并那些文件,保持适当的git历史记录。后来,当我真正合并时,我不希望任何关于这些更改的起源的误导性痕迹 - 它们应该正确引用它们来自的提交,即使这些提交中的其他文件的更改未合并(但是)。我想这意味着将提交分成几部分而不涉及这些文件。
所有提出的解决方案最终都会失去这些变化的历史,并且当我后来想要将B合并到A中时会引起一个大问题但是B的一些变化已经存在。我想要一个避免这种情况的解决方案。
在乌龟中,我可以查看单个文件的日志,并选择一些较旧的版本来恢复。因此,原则上,我可以从B创建一个新的分支C,并将我不想要合并的所有文件还原到B从A分支时的点。然后我可以合并C这似乎可以正确地跟踪git历史记录,并让我将B合并到A中,而不会感到惊讶的是已经存在一些B变化。
但是,当我只想合并时,手动识别和恢复20个文件很痛苦。为什么这不是常见的一步操作?如何使用tortoise恢复工作 - 因为它可以在单个文件上运行,它必须是子提交,这是我正在寻找的基本功能。它是否会抛弃我从较新的版本转向较旧版本的事实,并使其看起来像我刚刚进行了一些手动更改,然后与最终将B合并回A进行冲突?
答案 0 :(得分:1)
您正在寻找cherry pick
,这是一种仅从要合并的分支中选择某些提交的方法。
要仅合并某些文件(当你不想合并整个提交时),你确实有多个解决方案,我喜欢用this article中表达的那个,这是一个痛苦的屁股无论如何,我发现这种事情比较简单。
您也可以拆分一些提交并仅合并包含正确文件的提交,您可以这样做that other article says
答案 1 :(得分:0)
这不是常见的一步操作,因为Git is a content tracker, not a file tracker。
您可以轻松地将更改从特定文件从分支B应用到分支A,就像Tortoise:
# raw file, no history
git checkout A
git checkout B myfile
或
# copy a set of history from someplace else
git checkout A
git cherry-pick commit-hash-1..commit-hash-2
但这些都不会将历史记录保留为分支B的合并。如果您正在尝试这样做,取决于分支B中的提交的组织方式,这对您来说可能更好:Git: piecewise merge approach for major version changes?