我如何 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" 精简版分支,就像这样(尽管我有预感我的图表错误地描述了它实际发生的方式)。
如果有人可以,我会很高兴:
- 告诉我如何完成任务
- 纠正我在概念上的误解,如果我是
此外,我过去曾通过 CLI 使用 git,但现在使用的是 Sourcetree。我对任何 CLI 答案都满意,但如果您碰巧有 Sourcetree-specific 个答案,也欢迎您!
如果我正确理解你的问题,你所描述的就是标准的变基工作流程。要将 lite
分支重新定位到 master
分支:
更新 master 分支,如果它还不是最新的:
git checkout master
git pull
切换回您的 lite
分支:
git checkout lite
在 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"。
好吧,从标题看可能很难理解。基本上我有一个 Wordpress 插件,我想对插件的完整版和精简版使用相同的存储库。我从 Whosebug 上的 a great post about this topic 其他地方得到了这个好主意。
想法是你有一个精简版的分支,它已经删除了 files/code。每次更新 master 分支时,你 "rebase" lite 分支,然后它基本上将 master 分支中的所有更改插入到 lite 分支下——就像 lite 分支是 re-applying 所有再次删除它。
从概念上来说,我至少隐约明白了...但我不知道如何执行。这里有一些插图。假设我有两个分支:
我想获取 master 中的所有最新更改并将它们插入 "under" 精简版分支,就像这样(尽管我有预感我的图表错误地描述了它实际发生的方式)。
如果有人可以,我会很高兴:
- 告诉我如何完成任务
- 纠正我在概念上的误解,如果我是
此外,我过去曾通过 CLI 使用 git,但现在使用的是 Sourcetree。我对任何 CLI 答案都满意,但如果您碰巧有 Sourcetree-specific 个答案,也欢迎您!
如果我正确理解你的问题,你所描述的就是标准的变基工作流程。要将 lite
分支重新定位到 master
分支:
更新 master 分支,如果它还不是最新的:
git checkout master git pull
切换回您的
lite
分支:git checkout lite
在 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"。