![](/img/trans.png)
[英]Git. Merging changes from one file to another files WITHIN the same branch
[英]Merging latest changes to sets of files from one branch to another
现在,要在Git中可靠地完成一项更困难的事情是将最新的更改从一组分支合并到一组文件。 有问题的更改文件已在分支中的多个不同提交中进行了修改,每个包含这些更改的提交也可能会更改与该合并无关的其他文件。
我可以看到的最快方法是:
$ git checkout master
$ git checkout topic1 -- *.vcproj *.mk Subdir/SomeFile.txt
$ git add .
$ git commit -m 'Merging latest changes to these files from topic1'
第二步是以某种方式rebase / squash / etc topic1
清理它并删除对我移至master
的文件的任何更改。 什么是有效的工作流程?
如果您有不相关的提交,也许应该从分支点开始为每个单独的真实主题设置新的分支。 然后遍历您混乱的分支的历史,然后git cherry-pick
每个提交提交到正确的位置。 一旦确认没有丢失任何更改,就摆脱混乱。
我期待对这个问题进行一些神奇的修复,但是不幸的是没有一个。 最简单的解决方法是简单地对所有修改过的git checkout -- <file>
执行git checkout -- <file>
。 然后,您将在另一个分支上进行新更改。 您已经丢失了历史记录,但是可以根据需要键入一个新的历史记录(将其视为壁球)。
本文介绍了尝试的解决方案,并意识到在这种情况下git checkout
最终是最实用的解决方案。
这些步骤是:
git checkout master
git checkout topic1 -- *.vcproj *.mk Subdir/SomeFile.txt
git commit -m 'Merging latest changes to these files from topic1'
从主题topic1
检出特定文件后,我认为git add
并不是必需的,因为我注意到它们已自动添加到索引中。
问题不是选择性合并的需要,而是您在同一分支上开始拥有不同事物的事实。 清理此工作流程的真正答案是停止这样的工作,并经常创建新分支。 事情发生了,但是您不需要经常进行此类事情以需要特殊的工作流程。
分支的全部要点是它的一组离散更改可以合并。 如果您正在从事其他工作,请创建一个新分支,即使该分支只是基于当前分支的分支。
除此之外,我认为您将要解决的问题很简单。 我想到的唯一其他方法是以下方法。
git checkout master
git merge topic1
git reset --soft master
git add -i .
实际上,这比您要执行的步骤更多,但是使用交互式添加可能会使操作起来更容易一些,因为您可以像在单个文件中拆分单个大块一样细化。 但是,您将失去所有连接到另一个分支的历史记录。
我的压力还不够,真正的答案是调整您的工作流程,以使这种混合用途的分支永远不会发生。 唯一可能的例外是,如果您可以将不同的用途隔离到不同的目录中,则可以使用git-subtree-split
,但这似乎不是您的情况,因此我不再赘述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.