我有一個關于 git rebase 的問題。那里有很多執行緒,我不確定哪個適用于我的用例,而且我不想弄亂遠程分支,因為我是初學者。
據我所知,我可以使用以下命令:
- git branch 創建或更改分支
- git rebase -i 以互動方式變基
- git rebase <branch_name>
- git checkout 切換到分支
這是我的情況:
我有一個遠程分支 branch_A: branch_A
然后,分支_A發散到分支branch_B和分支branch_C(多次提交)
分支_A - 分支_B
分支_A - 分支_C
然后,我在分支 B 上做了 3 次提交(D1、D2 和 D3),我稱之為分支 branch_D:
分支_A - 分支_B - D1 - D2 - D3(分支_D)
分支_A - 分支_C
我把這些推到了遠程,所以這個狀態是遠程的。
現在我想將所有 3 個提交從 B - D 移動到 C - D 以獲得:
分支_A - 分支_B
分支_A - 分支_C - D1 - D2 - D3 - 分支_D
注意:更改很小(不會發生沖突),所以我可以打一個補丁并應用它,但我想提高我的 git 水平。
我擔心的是我不小心洗掉了 A、B、C 或 D(雖然我認為洗掉 branch_D 是可能的,但我知道我可以推力)。我知道我可以使用 gitk --all 而不用去阻止事情變得更糟。
我用 git rebase 和 git rebase -i 嘗試了幾件事,但似乎沒有用。我也知道我可以 git merge,但這不是我在這個用例中想要的。
uj5u.com熱心網友回復:
幾個關鍵概念:
- 承諾指向他們的父母。
- 分支一次指向一個提交。當我們說某物“在一個分支上”時,我們實際上的意思是“通過從那個分支指標跟隨父節點可以到達”。
- 提交是不可變的。當我們談論“移動”或“修改”提交時,我們實際上是指“創建新的、類似的提交”。
- 分支是獨立的 - 更改分支 A 不會立即影響分支 B,甚至不會對服務器上名為 A 的分支產生影響。
因此,據我了解,您的提交圖如下所示:
A B D
| v v
| <-x <-x <-x <-x
v /
... <-x
\
<-x <-x
^
C
您要創建的是:
A B
| v
| <-x <-x
v /
... <-x
\
<-x <-x <-x <-x
^ ^
C D
D 指向的兩個新提交是用 C 的父級而不是 B 重新創建的。您不需要接觸分支 A、B 和 C;你只需要 rebase 分支 D。
在您確信之前,您可能想要創建當前分支 D 的備份,以防出現問題:
git branch D_backup D
然后,git rebase我覺得最容易理解的命令版本是“git rebase old_parent up_to_old_commit --onto new_parent”,所以:
git rebase B D --onto C
這應該給你留下:
A B D_backup
| v v
| <-x <-x <-x <-x
v /
... <-x
\
<-x <-x <-x <-x
^ ^
C D
如果出錯,可以用D_backup替換D:
git branch -D D
git branch D D_backup
如果一切正常,洗掉備份,并覆寫分支 D 的遠程副本:
git branch -D D_backup
git push --force-with-lease origin D
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/368846.html
標籤:混帐
