一个repo-wide rebase of commit

时间:2013-06-19 21:09:51

标签: git commit rebase amend

考虑这一行提交。

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

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

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

有没有办法运行repo-wide rebase,其中包含指向特定提交的指针的所有分支都被识别并重新定位,一次一个?

我知道手动方式 - rebase foo和insert / cherry-选择新的SHA,但它需要我知道哪些分支引用了提交。它需要体力劳动。

1 个答案:

答案 0 :(得分:2)

我认为你误解了分支在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

您要做的只是使用上述foo命令在d'指向reset

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

此操作孤儿cd - 他们最终会收集垃圾。