Git rebase递归分支

我正在编写一门编程课程,其中我想展示如何逐步编写程序。 我以为我可能会为此使用git。 这个想法是将每节课作为一个单独的分支,并随着课程的进行创建新的分支。 正常状态

直到我发现我在lesson1 1中犯了一个错误,这一切都很好。 所以我去那里修复它。 修复第1课

现在问题发生了:我必须重新分配每个分支。 所以:

git checkout lesson2
git rebase lesson1

在这里输入图像描述

之后对于lesson3lesson4在这里输入图像描述

每门课我有20节课,所以每个错误都非常痛苦。 有没有办法让它自动化,或者至少让我更容易?

顺便说一句。 我用来创建图像的工具可以在这里找到。


所以不得不回到绘图板...

我以前曾提出过一个简单的filter-branch命令,但这有一个重大缺陷。 ( tl; dr - 我不再建议将它作为filter-branch --parent-filter的用例;除非你关心为什么,你可以跳到下一段。 )当你用git filter-branch时重新使用它不会重新应用更改以进行有效合并,而是将树保留在重新提交的提交中(实质上创建新的差异)。 一个filter-branch仍然是可能的,但它需要一个tree-filter或一个index-filter ,这会变得相当复杂。 (如果您可以在脚本中自动执行修复,那么将该脚本用作tree-filter应该可行 - 可能在rev-list参数中使用一点技巧 - 但是让我们假设一般情况下这不会那么容易。我想过使用脚本将“修复”提交的更改合并到移植中的每个提交中,但这可能会导致每次都发生冲突,也不是那么容易......)

那么做什么呢? 那么,像Libin Varghese这样的脚本化方法表明,如果没有冲突,并且假设您可以以合理的方式遍历ref名称,则可以。 但假设可能会有冲突,还有另一种方式......

所以,如果你有

        Bfix <--(lesson1)
       /
A --- B --- C --- D --- E <--(lesson3)(HEAD)
            |
        (lesson2)

你想要做的实质上是

1)将CDE重新应用于Bfix作为C'D'E' (单个重设操作)

2)将被替换的提交( X )的所有引用移动到其替换( X'

使用单个数据库可以最大限度地减少冲突解决的数量。 如果你只是lesson3那么你就会拥有

      (lesson1)
          |
        Bfix --- C' --- D' --- E' <--(lesson3)(HEAD)
       /
A --- B --- C <--(lesson2)

然后你只需要重写第一节和最后一节课以外的分支的参考。 这意味着您需要从“旧提交X ”到“替换提交X'的映射。

在rebase结束时,只需将这样的映射传递给.git / hooks / post-rewrite(如果存在)即可。 所以你可以编写一个脚本,它使用git show-ref将ref(分支)名称映射到“旧”SHA1值,然后使用stdin上的映射找到相应的“新”SHA1值,并调用git update-ref

(我打算提供一个示例脚本,但我在测试回购中遇到了钩子问题;因此,如果稍后有一段时间,我会回到这里,但如果您对脚本和钩,上面概述了需要做什么。)


start=2
end=10
for i in {$start..$end}
do
        git checkout lesson$i
        git rebase lesson$(($i-1)) || break
done
start=$i

假设你没有冲突,这个循环通过lesson2到循环10,执行rebase。

如果rebase失败,则开始设置为失败点。 但请确保您解决冲突并执行rebase --continue在继续之前继续


这是我解决问题的尝试。 你将不得不修复我的语法错误,并完成自动化问题,但这可能是一个开始。

单线

git rebase lesson1 lesson2

与...有相同的效果

git checkout lesson2
git rebase lesson1

你应该重写最后一课,以便所有的中间提交同时被传送到新的分支。 您将不得不修复发生的任何冲突。

git rebase lesson1 lesson4

然后将分支转移到新的提交(如果课程是连续的),看起来像是类似的命令。

git branch lesson2a lesson4^2
git branch lesson3a lesson4^1

如果分支是连续的。 'git help revisions'显示如何使用来自给定分支的提交消息来查找提交。

git branch lesson2a  lesson4^"{/Partial lesson2 commit message}"
git branch lesson3a  lesson4^"{/Partial Lesson3 commit message}"

一旦这看起来正确删除旧的提交

git branch -f lesson2 lesson2a
git branch -D lesson2a

请参阅rebase语法的'git help rebase'

和'git help revisions'以不同的方式来指定提交。

链接地址: http://www.djcxy.com/p/38825.html

上一篇: Git rebase recursive branches

下一篇: MongoDB: Find all documents except those where a date range condition matches