将最新更改合并到一个分支到另一个分支的文件集

时间:2014-03-10 21:49:02

标签: git

现在可以在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的文件的任何更改。什么是有效的工作流程?

3 个答案:

答案 0 :(得分:1)

如果您有不相关的提交,也许您应该从分支点开始为每个单独的真实主题设置新的分支。然后浏览乱搞分支的历史记录,git cherry-pick每个都提交到正确的位置。一旦你确认没有丢失任何变化,摆脱混乱。

答案 1 :(得分:0)

我期待这个问题有一些神奇的解决办法,但不幸的是没有一个。最简单的解决方法是对每个修改过的文件执行git checkout -- <file>。然后,您在另一个分支上进行了新的更改。您已经丢失了历史记录,但如果需要,您可以输入一个新的历史记录(想象它就像做壁球一样)。

This article回顾了尝试的解决方案并认识到git checkout在这种情况下最终是最实用的解决方案。

步骤如下:

git checkout master
git checkout topic1 -- *.vcproj *.mk Subdir/SomeFile.txt
git commit -m 'Merging latest changes to these files from topic1'

我从git add查看特定文件后,我认为topic1是必要的,因为我发现它们会自动添加到索引中。

答案 2 :(得分:-1)

问题不在于选择性合并的必要性,事实上你在同一个分支上开始有不同的东西。清理这个工作流程的真正答案是停止这样的工作并经常建立新的分支。事情发生了,但你不应该经常做这种事情,需要一个特殊的工作流程。

分支的重点是它可以合并它的一组离散变化。如果您正在处理不同的事情,请创建一个新分支,即使它只是基于当前分支的分支。

除此之外,我认为你的修复是关于一件简单的事情。我能想到的唯一另一种方法是:

git checkout master
git merge topic1
git reset --soft master
git add -i .

这实际上是比你的步骤更多的步骤,但是使用交互式添加可能会使它更容易一些,因为你可以像在同一个文件中分割单个帅哥一样细化。但是,您将丢失与其他分支的所有连接历史记录。

我不能强调,真正的答案是调整你的工作流程,这样这种混合目的分支永远不会发生。唯一可能的例外是如果你可以将你的不同目的分隔到不同的目录 - 那么你可以使用git-subtree-split,但这不是你的情况,所以我不会进入那个。