git branch -f bN、git checkout bN 和 git push --force 在交互式变基后强



假设我有这个git结构:

* hash3 (HEAD -> origin/bN, bN) Message N
|
* ...
|
* hash2 (origin/b2, b2) Message 2
|
* hash1 (origin/b1, b1) Message 1
|
* hash0 (origin/master, master) Message 0

如果我想修改b1的东西,我会做git rebase -i hash0并使用消息Message 1编辑提交。变基后,我将有:

* hash6 (HEAD -> bN) Message N
|
* ...
|
* hash5 Message 2
|
* hash4 Message 1
|
| * hash3 (origin/bN) Message N
| |
| * ...
| |
| * hash2 (origin/b2, b2) Message 2
| |
| * hash1 (origin/b1, b1) Message 1
|/
* hash0 (origin/master, master) Message 0

然后,我将每个新哈希与其相应的分支链接起来,并将其推送到原点,以便得到这个:

* hash6 (HEAD -> origin/bN, bN) Message N
|
* ...
|
* hash5 (origin/b2, b2) Message 2
|
* hash4 (origin/b1, b1) Message 1
|
* hash0 (origin/master, master) Message 0

我为每个<b1, hash4><b2, hash5>...<bN, hash6>(这是一个痛苦的屁股(使用以下命令来做到这一点:

git branch -f b1 hash4
git push origin b1 --force

问题: 有没有办法自动化这个逻辑?

是的。对于一次性命令,您可以将命令添加到您的选择列表中,这样您就不必手动查找重写的 id。

pick hash2
exec git branch -f b2
pick hash1
exec git branch -f b1

如果有很多参考,为了加快速度,您可以通过类似的东西来管道选择列表

awk '/^pick/{print $2}'|git log --stdin --no-walk --pretty='pick %h %s%x0a%-D'

这将注释列表,所有引用都指向每个选择的提交。

我必须进行几轮 bash 测试才能一次性检测分支的顺序......但这是这个想法:

git checkout --detach master # so we don't move master
# this is the part that should be turned into a repetitive cycle, 2 steps per branch
git cherry-pick master..b1
git branch -f b1
git cherry-pick b1..b2
git branch -f b2
git cherry-pick b2..b3
git branch -f b3
.
.
.
git cherry-pick bn-1..bn
git branch -f bn
# and you finally push all the branches
git push origin -f b1 b2 b3... bn

最新更新