【问题标题】:A repo-wide rebase of a commit提交的回购范围内的变基
【发布时间】:2013-06-16 14:05:33
【问题描述】:

考虑这行提交。

foo: a => b => c => d
                      \bar: => e => f => g

我从分支 foo 开始,偶尔从 foo 创建新分支 bar。现在,当我在分支bar 中处理提交h 时,我意识到我在提交c 中犯了一个错误。所以,我运行git rebase 并打开提交c 进行编辑。我进行更改,暂存它们并运行git rebase --continue

现在,我的bar 分支已更新。但是,foo 分支仍然指向提交 c 的原始有缺陷版本。

有没有办法运行一个 repo 范围的 rebase,其中包含指向特定提交的指针的所有分支都被识别和 rebase,一次一个?

我知道手动方式 - 重新设置 foo 并插入/挑选新的 SHA,但它需要我知道哪些分支引用了提交。而且需要体力劳动。

【问题讨论】:

    标签: git commit rebase git-amend


    【解决方案1】:

    我认为您误解了分支在 git 中的工作方式。它们不是完整的历史,只是指向单个提交的指针。也就是说,foo 实际上只是d 的同义词,而barg 的同义词。重新定位 bar 不会以任何方式影响 foo

    如果您想将 foo 设置为新的 d(我们称之为 d'),只需执行以下操作:

    git checkout foo
    git reset --hard d'
    

    这是一个基于你的例子:

    a <- b <- c <- d <- e <- f <- g
                   ^              ^
                   |              |
                  foo            bar
    

    现在,在您对 bar 进行变基后,您的历史记录会有所不同:

              /- c <- d   
             /        ^
    a <- b <-         |
             \       foo
              \
               \- c' <- d' <- e' <- f' <- g'
                                          ^
                                          |
                                         bar
    

    您只需使用上述reset 命令将foo 指向d'

      a <- b <- c' <- d' <- e' <- f' <- g'
                      ^                 ^
                      |                 |
                     foo               bar
    

    此操作是cd 的孤儿——它们最终会被垃圾回收。

    【讨论】:

    • 我不一定想这样做,也许我同时将提交i 添加到foo。如果分支只是指向某些提交的指针,为什么两个分支可以有不同的提交字符串?考虑分支 1 a -&gt; b -&gt; c1 -&gt; d 和分支 2 a -&gt; b -&gt; c2 -&gt; d。在这种情况下,branch1 和 branch2 两个指向同一个提交,d,但在 branch1 中,先前的提交是 c1,由于变基,branch2 的先前提交是 c2
    • 如果您将i 添加到foo,则需要按照您的说明进行rebase。每个提交都有对其父提交的引用 - 你有箭头的方式是向后的。让我在我的回答中解决这个问题,它可能更有意义。不可能有a &lt;- b &lt;- c1 &lt;- da &lt;- b &lt;- c2 &lt;- d...第二种情况必须有d2dd2 可能具有相同的逻辑内容,但它们是具有不同父级和不同哈希的不同提交。
    • bar 提交 d' 与 foo 提交 d 相同 - 你是在告诉我它们成为不同的提交吗?
    • 是的。它们成为单独的提交。这就是变基所做的——编辑历史。您会注意到提交哈希发生了变化。 d' d 相同 - 它有不同的父级。
    • 我刚刚做了一个测试,你是对的。我以前从未注意到这一点。感谢您的解释。但我想这也意味着即使提交 d 和 d' 的更改相同,它们也有不同的哈希值,因此 git 无法推断编辑 d' 也可能意味着编辑 d
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多