如何在master分支上重新应用所有分支的提交,但是将它保留在它自己的分支中?

时间:2015-02-20 20:56:13

标签: git version-control atlassian-sourcetree

好的,从标题中可能很难理解。基本上我有一个Wordpress插件,我想对插件的完整版和精简版使用相同的存储库。我从Stackoverflow上的a great post about this topic获得了这个好主意。

这个想法是你有一个lite版本的分支,它删除了文件/代码。每次更新主分支时,您都需要" rebase" lite分支,然后基本上接受主分支中的所有更改并将它们插入到lite分支下 - 就像lite分支再次在其上重新应用所有删除一样。

从概念上讲,我至少模糊地理解它......但我不知道如何实现它。这是一些插图。我们说我有两个分支:

enter image description here

我想把主人的所有最新更改都插入"""精简分支,就像这样(虽然我有一个预感,但我的图表错误地描述了它实际发生的方式)。

enter image description here

如果有人可以,我会喜欢它:

  1. 告诉我如何执行任务
  2. 如果我
  3. ,请纠正我在概念上误解的地方

    另外,我过去通过CLI使用git,但现在使用的是Sourcetree。我对任何CLI的答案都很好,但是如果您碰巧有Sourcetree特定的答案,那么也欢迎这些答案!

2 个答案:

答案 0 :(得分:3)

实际上,您的图表看起来很好,您可以从CLI执行此操作:

$ git checkout lite
$ git rebase

假设您告诉git将master设置为lite的“上游”。

如果您尚未完成此上游设置,您可以执行此操作,或使用rebase命令的一个额外字来指定上游:

$ git rebase master

rebase的作用是什么:

  • 找到当前分支的上游,或使用您告诉它使用的分支(以适当者为准)
  • 找到HEAD和上游之间的合并基础
  • 复制当前分支上但不在上游的每个提交 - 这是第一个图中的两个紫色提交 - 每个副本由以下内容完成:

    • 将提交与其父
    • 区分开来
    • 将这些更改应用于从上游提示增长的新(匿名,分离-HEAD)分支
    • 提交刚刚应用的更改
  • 复制完所有提交后,将分支标签从原始分支上剪下,并使其指向新的最常复制的提交。

如果我们忽略一些角落和特殊情况,这就是整个事情。具体来说,git将检测正在重新分支的分支中的变化(差异块)是否已经在上游,并且在适当时省略更改甚至整个提交;有时git将无法应用差异并将停止并需要帮助(就像git merge);在非常罕见的情况下,git将会应用diff,并将它放在错误的位置,产生一个糟糕的“副本”(也就像git merge一样 - 实际上,rebase可以完成3路如果需要,为每个提交的提交合并。

与合并一样,你应该检查结果,以防git“重新应用以前的更改”错误。

答案 1 :(得分:0)

如果我正确理解您的问题,您所描述的是标准的rebase工作流程。修改lite分支上的master分支:

  1. 更新主分支,如果它尚未更新:

    git checkout master
    git pull
    
  2. 切换回lite分支:

    git checkout lite
    
  3. 主分支上的重新启动:

    git rebase master
    
  4. 现在你完全按照你的第二张照片描述了。此时,如果您进行的更改与在主分支上所做的更改冲突,则可能需要解决某些合并冲突。 GitHub有一些关于如何解决合并冲突的好信息here