繁体   English   中英

git branch -f bN, git checkout bN 和 git push --force 到交互式变基后的所有提交

[英]git branch -f bN, git checkout bN and git push --force to all commits after an interactive rebase

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

然后,我将每个新的 hash 与其相应的分支链接起来,并将其推送到原点,以便获得以下信息:

* 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

如果有很多裁判,你可以通过 pipe 选择列表来加快速度

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

这将使用指向每个选择提交的所有参考来注释列表。

我将不得不 go 通过几轮 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM