1

考虑这行提交。

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

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

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

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

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

4

1 回答 1

2

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

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

git checkout foo
git reset --hard d'

这是基于您的示例:

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

现在,在你做 rebase 之后bar,你有不同的历史:

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

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

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

这个操作是孤儿c-d他们最终会得到垃圾收集。

于 2013-06-19T21:12:31.837 回答