我正在跟踪远程仓库代码库,并在本地进行小但重要的更改,以根据我们的需求自定义代码。因此,远程代码位于分支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来避免撤消对该文件的任何远程更改。
答案 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将尝试应用您工作目录中的所有更改。然后,您可以照常提交这些更改。