簡體   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