簡體   English   中英

將提交從一個分支變基到另一個分支

[英]Rebasing a commit from a branch to another branch

我有一個關於 git 變基的問題。 那里有很多線程,我不確定哪一個適用於我的用例,而且我不想弄亂遠程分支,因為我是初學者。

據我所見,我可以使用以下命令:

  • git 分支創建或更改分支
  • git rebase -i 以交互方式變基
  • git 變基 <branch_name>
  • git結賬切換到分店

這是我的情況:

我有一個遠程分支 branch_A:branch_A

然后,branch_A 分叉到一個分支 branch_B 和一個分支 branch_C(多次提交)

分支_A - 分支_B

分支_A - 分支_C

然后,我在分支 B 上做了 3 次提交(D1、D2 和 D3),我稱之為分支 branch_D:

分支_A - 分支_B - D1 - D2 - D3(分支_D)

分支_A - 分支_C

我將這些推到遠程,所以這個 state 在遠程。

現在我想將所有 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 合並,但這不是我在這個用例中想要的。

幾個關鍵概念:

  • 提交指向他們的父母。
  • 分支一次指向一個提交。 當我們說某事“在一個分支上”時,我們實際上的意思是“通過從那個分支指針跟隨父級可以到達”。
  • 提交是不可變的。 當我們談論“移動”或“修改”提交時,我們實際上是指“創建新的、類似的提交”。
  • 分支是獨立的 - 更改分支 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; 你只需要重新設置分支 D。

在您有信心之前,您可能需要創建當前分支 D 的備份,以防 go 錯誤:

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 替換為 D_backup:

git branch -D D
git branch D D_backup

如果一切正常,刪除備份,並覆蓋分支 D 的遠程副本:

git branch -D D_backup
git push --force-with-lease origin D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM