考虑这一行提交。
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,但它需要我知道哪些分支引用了提交。它需要体力劳动。
答案 0 :(得分: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
现在,在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
- 他们最终会收集垃圾。