我如何 re-apply 一个分支的所有提交都在 master 分支之上,但将其保留在它自己的分支中?

How do I re-apply all of a branch's commits on top of master branch, but keep it in it's own branch?

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

想法是你有一个精简版的分支,它已经删除了 files/code。每次更新 master 分支时,你 "rebase" lite 分支,然后它基本上将 master 分支中的所有更改插入到 lite 分支下——就像 lite 分支是 re-applying 所有再次删除它。

从概念上来说,我至少隐约明白了...但我不知道如何执行。这里有一些插图。假设我有两个分支:

我想获取 master 中的所有最新更改并将它们插入 "under" 精简版分支,就像这样(尽管我有预感我的图表错误地描述了它实际发生的方式)。

如果有人可以,我会很高兴:

  1. 告诉我如何完成任务
  2. 纠正我在概念上的误解,如果我是

此外,我过去曾通过 CLI 使用 git,但现在使用的是 Sourcetree。我对任何 CLI 答案都满意,但如果您碰巧有 Sourcetree-specific 个答案,也欢迎您!

如果我正确理解你的问题,你所描述的就是标准的变基工作流程。要将 lite 分支重新定位到 master 分支:

  1. 更新 master 分支,如果它还不是最新的:

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

    git checkout lite
    
  3. 在 master 分支上变基:

    git rebase master
    

现在您已经完全了解您在第二张图片中所描述的内容了。如果您所做的更改与在 master 分支上所做的更改发生冲突,此时您可能需要解决一些合并冲突。 GitHub 有一些关于如何解决合并冲突的有用信息 here

实际上,您的图表看起来不错,从 CLI 中您只需执行以下操作:

$ git checkout lite
$ git rebase

假设您已告诉 git 将 master 设置为 lite 的 "upstream"。

如果你没有做过这个上游设置,你可以做,或者在rebase命令中使用一个额外的词来指定上游:

$ git rebase master

rebase 做的是:

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

    • 将提交与其父项进行比较
    • 将这些更改应用到从上游顶端生长的新(匿名、分离头)分支
    • 提交刚刚应用的更改
  • 一旦所有提交都被复制,从原始分支上剪下分支标签并使其指向新的 tip-most 复制提交。

如果我们忽略一些角落和特殊情况,这就是全部内容。具体来说,git 将检测在被重新定位的分支中所做的更改(diff hunk)是否也已经在上游中,并酌情忽略更改甚至整个提交;有时 git 无法应用 diff 并且会停止并需要帮助(就像 git merge);在极少数情况下,git 会去应用差异,并将其放在错误的位置,产生错误的 "copy"(也就像 git merge——事实上,rebase 可以如有必要,对其复制的每个提交进行完整的三向合并。

与合并一样,您应该检查结果,以防 git 弄错了 "re-apply previous change"。