git将我们的更改合并到重要的代码升级中

时间:2015-02-09 14:15:21

标签: git merge

我正在跟踪远程仓库代码库,并在本地进行小但重要的更改,以根据我们的需求自定义代码。因此,远程代码位于分支1.3.0上,我们创建1.3.0-custom来存储我们的本地修改。然后,我可以git pull origin 1.3.0获取最新的修补程序。

现在远程仓库已升级到新分支 - 1.3.1 - 这是一个重大变化。把它拉到1.3.0是很不切实际的 - 很多合并冲突,所以最好的方法就是启动一个新的本地分支跟踪origin / 1.3.1。

我的问题是:有没有办法将1.3.0-custom中的我们更改带到这个新分支?我显然不想将他们的任何更改“还原”回1.3.0,否则我们将失去所有升级/修复。但我确实希望保持当地的变化。我是否必须这么做(例如,获取1.3.0和1.3.0之间的所有差异 - 自定义,并在新的1.3.1自定义分支中逐个应用它们)?还是有一些git-fu可以帮到这里吗?

示例:

我们从远程仓库中提取1.3.0,然后使用git checkout -b 1.3.0-custom创建自定义分支。然后,我们编辑并提交对.css文件的更改,例如。

每天,最初的1.3.0代码库都会更新修复程序和其他新功能,我们可以这样做:

git checkout -b mergetest
git pull origin 1.3.0  # at this point, resolve any merge conflicts
git checkout 1.3.0-custom
git merge mergetest
git branch -d mergetest

我确定创建一个分支只是为了进行合并/解决是没有必要的,但我经常被打断,所以如果我忘记了我在解决任何冲突的方方面面,我可以删除mergetest分支,然后轻松重新开始。

现在我们有一个完全不同的起始分支 - 1.3.1 - 并且想要某种方法来检索我们所做的编辑,例如1.3.0自定义分支中的css文件,但我们引入1.3.0自定义的所有远程更新。

我开始怀疑我们是否可以在这里提取作者的提交,但我有一种感觉,我们上面的方法将一些远程更新放在本地提交中,因为使用了临时mergetest分支。另一个复杂因素是我们在1.3.0中编辑的css文件在1.3.1分支中可能看起来非常不同,所以我猜我们还是需要一个diff来避免撤消对该文件的任何远程更改。

1 个答案:

答案 0 :(得分:0)

由于您的自定义分支包含合并提交,我建议git cherry-pick执行该任务。

cherry-pick尝试接受提交引入的所有更改,并将它们应用于当前的 HEAD 。它有效地复制了提交。


作为第一步,你应结帐一个新的分支,它指向1.3.1分支。

git checkout -b 1.3.1-custom 1.3.1

现在我们要在1.3.0-custom上应用1.3.1-custom分支的所有更改。我们如何获得这些提交的清单?
这是双点表示法的一个相当直接的用例 - 请查看相应的chapter in the pro git book以便更好地理解。

可悲的是,git cherry-pick并不擅长处理合并提交,尤其是当您尝试应用一系列提交时。因此,我们必须从范围中删除 merge commits

git rev-list --no-merges 1.3.1..1.3.0-custom将返回所有提交的 SHA-1 键列表,您可以在1.3.0-custom上找到,但不能在1.3.1上找到。

现在我们使用cherry-pick选项将此列表传递给--stdin

git rev-list --no-merges 1.3.1..1.3.0-custom | git cherry-pick --stdin

既然你说1.3.1引入了很多变化,这可能会导致一些合并冲突。如果发生冲突,git将为您提供解决问题的机会,并告诉您使用git cherry-pick --continue继续此过程。

如果您想将1.3.0-custom中的所有更改压缩到1.3.1-custom上的单个提交中,您可以使用-n的{​​{1}}(--no-commit)选项。
Git将尝试应用您工作目录中的所有更改。然后,您可以照常提交这些更改。