假设我有这个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