使用交互式变基后,通过 git branch -f bN、git checkout bN 和 git push --force 命令强制推送所有提交到 bN 分支之后。

4

假设我有以下 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

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


只是为了测试,使用最新的Git,您能否尝试使用--rebase-merges选项测试这些变基操作?(https://dev59.com/WWUo5IYBdhLWcg3wmQZN#50555740) - VonC
2个回答

0
是的。对于一次性需求,您可以将命令添加到您的选择列表中,这样您就不必手动查找重写的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'

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


也许我表达得不够清楚。我已经重新写了我的问题。 - Damia Fuentes
为了保留上游,您可以切换到例如 git update-ref refs/heads/b1 @ 而不是 git branch -f b1。这里有什么具体问题? - jthill

0

我需要经过一些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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接