Git 现在合并一些文件,以后合并一些文件

Git 现在合并一些文件,以后合并一些文件,git,merge,tortoisegit,Git,Merge,Tortoisegit,我在分支B。在一系列提交之后,分支a准备好了/需要了一些文件,但许多文件还没有准备好/需要。我只想合并这些文件,保留正确的git历史记录。后来,当我真正合并时,我不想对这些更改的来源有任何误导性的线索——它们应该正确地引用它们来自的提交,即使这些提交中的其他文件中的更改尚未合并(尚未合并)。我想这意味着将提交分成与这些文件相关的部分和不相关的部分 所有提出的解决方案最终都会丢失这些更改的历史记录,当我稍后想将B合并到a中时,会导致一个大问题,但B的一些更改已经存在。我想要一个避免这种情况的解决方

我在分支B。在一系列提交之后,分支a准备好了/需要了一些文件,但许多文件还没有准备好/需要。我只想合并这些文件,保留正确的git历史记录。后来,当我真正合并时,我不想对这些更改的来源有任何误导性的线索——它们应该正确地引用它们来自的提交,即使这些提交中的其他文件中的更改尚未合并(尚未合并)。我想这意味着将提交分成与这些文件相关的部分和不相关的部分

所有提出的解决方案最终都会丢失这些更改的历史记录,当我稍后想将B合并到a中时,会导致一个大问题,但B的一些更改已经存在。我想要一个避免这种情况的解决方案

在Ortoise中,我可以查看单个文件的日志,然后选择一些旧版本进行恢复。因此,原则上,我可以从B创建一个新的分支C,并将所有我不想合并的文件恢复到B从a分支时的位置。然后我可以将C合并到a。这似乎可以正确地跟踪git历史,并让我将B合并到a中,而不必惊讶B中已经存在一些更改

但是当我只想合并2个文件时,手动识别并还原20个文件是很痛苦的。为什么这不是一个普通的一步操作?tortoise的revert是如何工作的——因为它可以在单个文件上操作,所以它必须是sub-commit,这是我正在寻找的基本特性。这是不是抛弃了我将从一个较新的版本改为一个较旧的版本的事实,让它看起来像我只是做了一些手动更改,然后将与B最终合并回a相冲突?

您正在寻找的一种方法,只从要合并的分支中选择某些提交

要只合并某些文件(当您不想合并整个提交时),您有多种解决方案。事实上,我喜欢使用中表达得很好的解决方案,不管怎样,这是一种痛苦,但这是我发现的最简单的解决方案


您还可以拆分一些提交并仅合并包含正确文件的提交,您可以像这样做,因为这不是常见的一步操作

您可以轻松地将更改应用于从分支B到分支A的特定文件,就像乌龟一样:

# raw file, no history
git checkout A
git checkout B myfile


但这两种方法都不能将历史保存为分支B的合并。如果您正试图这样做,这取决于分支B中的提交是如何组织的,这可能对您更有利:

cherry pick是错误的——它作用于整个提交,我希望提交的一部分。签出错误,因为它不维护合并/提交历史记录。我不想要令人痛苦的东西,而“无痛分裂”这篇文章绝对不是,尤其是当涉及大量提交时。拆分提交将是解决方案的一部分,但我希望有一种自动化的方法来确定哪些提交以及如何拆分它们(即,仅与我选择的文件相关的更改)。对,我希望提交/合并的历史能够准确地反映出这项工作来自B。因为从技术上讲,在Ortoise中使用许多步骤或像M.Ang那样进行提交拆分是可能的。引用,我不接受git不是一个文件跟踪器会妨碍它支持这种常见的使用需求(其他一些SO问题要求这样做,但它们满足于丢失历史记录)。它不会妨碍您进行您想要的特定于文件的合并,但因为它是一个内容跟踪器,而不是一个文件跟踪器,提交的设置必须考虑到这一点(参见M.Ang的提交拆分,或我链接的分段合并)。如果你把Git当作一个文件跟踪器,你就不会得到你想要的行为。好吧,linus在你链接的帖子中说,它可以做成瓷器。我不明白他为什么坚持内容/文件的二分法。Git可以按现在的方式工作,但是考虑提交是由子提交组成的,每一个文件只更改一个文件,然后支持像我想做的基于文件的操作。很明显,人们在分支/提交时不知道他们将来想要合并什么,这将解决这个问题。git可以是一个内容和文件跟踪器。您的陈述很明显,在分支/提交时,人们不知道他们将来想要合并什么,这表明您描述的是工作流问题,而不是工具问题。更多讨论:如果我可以添加我的两分钱,从概念上讲,提交不是“对添加到跟踪系统中的一堆文件的一系列修改”,而是更多的“在这些文件中实现的特性/错误修复/东西”:在/right/git工作流中,您应该对源(通常)上的功能/操作进行原子提交,因此,当合并时间到来时,您永远不希望也不需要为文件拆分提交。如果你错了,你必须用我们讨论过的方法来修复它。您不想考虑基于文件的提交,因为您知道,依赖关系是存在的。这样说有道理吗?
# copy a set of history from someplace else
git checkout A
git cherry-pick commit-hash-1..commit-hash-2