草庐IT

Git rebase递归分支

coder 2023-06-25 原文

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

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

现在问题出现了:我必须重新设置每个分支。所以:

git checkout lesson2
git rebase lesson1

之后 lesson3lesson4 也是如此。

我每门类(class)大约有 20 节课,所以每一个错误都非常痛苦。有没有办法让它自动化或至少让我更轻松?

顺便说一句。我用来创建图像的工具可用 here .

最佳答案

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

我之前建议使用一个简单的 filter-branch 命令,但这有一个重大缺陷。 (tl;dr - 我不再建议将此作为 filter-branch --parent-filter 的用例;除非您关心原因,否则您可以跳至下一段。) 当您使用 git filter-branch 重新设置父级时,它不会重新应用更改以进行有效 merge ,而是将树保留在重新设置的提交中(创建新的差异,本质上)。 filter-branch 仍然是可能的,但它需要 tree-filterindex-filter 并且这会开始变得相当复杂. (如果您可以在脚本中自动修复,那么使用该脚本作为 tree-filter 应该可以工作 - 可能在 rev-list 参数中有一点技巧 - 但让我们假设一般情况这不会那么容易。我考虑编写一种方法来将“修复”提交中的更改 merge 到嫁接中的每个提交中,但这可能会导致每次发生冲突,而且也不是那么容易.. .)

那么该怎么办呢?好吧,如果没有冲突,并且假设您可以以合理的方式遍历引用名称,那么像 Libin Varghese 这样的脚本化方法建议是可以的。但是假设可能存在冲突,还有另一种方法......

如果你有

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

本质上你想做的是

1) 在 Bfix 上重新应用 CDE 作为 C' D'E'(单个 rebase 操作)

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

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

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

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

只是这样一个映射在 rebase 结束时通过 stdin 传递到 .git/hooks/post-rewrite(如果存在)。因此,您可以编写一个脚本,使用 git show-ref 将 ref(分支)名称映射到“旧”SHA1 值,然后使用 stdin 上的映射找到相应的"new"SHA1 值,并且调用 git update-ref

(我打算提供一个示例脚本,但我在测试 repo 中遇到了一些钩子(Hook)问题;所以如果我稍后有时间,我会回到这里。但是如果你觉得舒服的话通过脚本和 Hook ,以上概述了需要完成的工作。)

关于Git rebase递归分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42997654/

有关Git rebase递归分支的更多相关文章

  1. ruby - 递归地将所有数字字符串转换为 Ruby 哈希中的整数 - 2

    我有一个随机大小的散列,它可能有类似"100"的值,我想将其转换为整数。我知道我可以使用value.to_iifvalue.to_i.to_s==value来做到这一点,但我不确定我将如何在我的散列中递归地做到这一点,考虑到一个值可以是一个字符串,或一个数组(哈希或字符串),或另一个哈希。 最佳答案 这是一个非常简单的递归实现(尽管必须同时处理数组和散列会增加一些技巧)。deffixnumifyobjifobj.respond_to?:to_i#IfwecancastittoaFixnum,doit.obj.to_ielsifobj

  2. Ruby:标准递归模式 - 2

    我经常迷上ruby​​的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情

  3. ruby - 为什么我用递归得到 "stack level too deep"? - 2

    我有这个ruby代码:defget_sumnreturn0ifn似乎正在为999之前的值工作。当我尝试9999时,它给了我这个:stackleveltoodeep(SystemStackError)所以,我添加了这个:RubyVM::InstructionSequence.compile_option={:tailcall_optimization=>true,:trace_instruction=>false}但什么也没发生。我的ruby版本是:ruby1.9.3p392(2013-02-22revision39386)[x86_64-darwin12.2.1]我还增加了机器的堆栈大

  4. ruby - 如何让 GitHub 页面使用 master 分支? - 2

    我有一个使用Jekyll托管在GitHub上的静态网站。问题是,我真的不需要master分支,因为存储库唯一包含的是网站。这样我就必须gitcheckoutgh-pages,然后gitmergemaster,然后gitpushorigingh-pages。有什么简单的方法可以摆脱gh-pages分支并直接从master推送? 最佳答案 Theproblemis,Idon'treallyneedthemasterbranch,astheonlythingtherepositorycontainsisthewebsite.Isthere

  5. ruby - 构建网络蜘蛛时,应该使用递归吗? - 2

    构建一个深度优先的网络蜘蛛,这意味着它将访问第一页上的所有链接,然后转到每个链接,并访问所有第二页上的链接...你应该使用递归吗?我发现这是CPU密集型的。defrecursion()linkz_on_first_page.eachdo|link|recursion(link)endendrecursion(firstpage) 最佳答案 绝对不是,由于万维网的实际性质,您很快就会遇到问题。当您访问带有主导航部分的网站时,每个页面都链接到其他页面,您就进入了一个无限循环。您可以跟踪您处理了哪些链接,但即便如此,递归循环并不真正适合万

  6. ruby-on-rails - 如何以递归方式将 YAML 文件扁平化为 JSON 对象,其中键是点分隔的字符串? - 2

    例如,如果我有YAML文件en:questions:new:'NewQuestion'other:recent:'Recent'old:'Old'这最终会变成一个json对象,例如{'questions.new':'NewQuestion','questions.other.recent':'Recent','questions.other.old':'Old'} 最佳答案 由于问题是关于在Rails应用程序上使用YAML文件进行i18n,因此值得注意i18ngem提供了一个辅助模块I18n::Backend::Flatten完全像

  7. ruby - 为什么尾递归 gcd 比 rubinius 的 while 循环更快 - 2

    我有这两个gcd函数的实现:defgcd1(a,b)ifa==baelsifa>bif(a%b)==0belsegcd1(a%b,b)endelseif(b%a)==0aelsegcd1(a,b%a)endendenddefgcd2(a,b)if(a==b)returnaelsifb>amin,max=a,belsemin,max=b,aendwhile(max%min)!=0min,max=max%min,minendminend函数gcd1是尾递归的,而gcd2使用while循环。我已经验证rubinius通过对阶乘函数进行基准测试来执行TCO,只有阶乘函数基准测试显示递归版本和迭

  8. ruby-on-rails - 为什么我的 helper 递归方法不返回每个值? - 2

    我想显示一个由gem祖先管理的类别树。我想使用一个助手,它会递归地遍历树并一个一个地返回类别,暂时没有html标签或内容。moduleCategoriesHelperdefdisplay_tree(category)ifcategory.has_children?category.children.eachdo|sub_category|display_tree(sub_category)puts(sub_category.name)#tocheckifitgoeshereendendcategory.nameendendcategory参数是根类别之一。它应该返回什么?在网页中:它仅

  9. ruby - 如何处理树顶左递归 - 2

    我有一个grammarfile对于我正在尝试构建的一种新的通用编程语言。我正在努力使该语言健壮且易于使用(它深受Ruby等启发),为此我引入了一些左递归规则。我看到一些例子似乎表明了以下左递归规则:rulel_recursel_recurse/'somethingelse'end可以通过将其更改为非左递归:ruler_recurse'somethingelse'/r_recurseend对我来说,这看起来会有不同的问题并且仍然会失败。我是对的,还是这会“奏效”?我试图(查找和)消除的特定左递归可以在这个grammarfile中找到.我不确定哪些规则受到影响,但至少somewerepoi

  10. ruby - 如何递归 rake ? -- 或合适的替代品 - 2

    我希望我的项目的顶级Rakefile使用树中更深的rakefile来构建东西;即顶层rakefile说明如何构建项目(大图),而较低层的rakefile说明如何构建特定模块(本map片)。当然有一组共享的配置,用于在任务之间共享时执行的详细信息:所以它主要是关于保持对需要构建的内容的描述,尽可能接近正在构建的源。例如。/Source/Module/code.foo和cie应该使用/Source/Module/Rakefile中的指令构建;并且/Rakefile了解模块之间的依赖关系。我不关心它是否使用多个rake进程(ala递归make),或者只是创建单独的构建环境。无论哪种方式,它都

随机推荐