簡體   English   中英

如何在最新合並后僅對提交進行基礎調整?

[英]How to rebase only the commits after the latest merge?

考慮以下情形:

  1. 我從主人那里檢查了一個分店
  2. 我做了一些承諾
  3. 我合並了更新的大師
  4. 我做了更多的承諾
  5. 現在,我希望從第4點重新提交提交,以便不影響第2點的提交。

因此,如果我最初有:

     (1)         (2)
x--x--x--x--x--x--x         master
       \     \
        y--y--Y--y--y       dev
          (2)(3)   (4)

我想得到:

     (1)         (2)
x--x--x--x--x--x--x             master
       \           \
        y--y--------Y'--y'--y'  dev
          (2)      (5)     (5)

如果我只是做git rebase master ,它將從2和4都重新提交,並從3刪除合並。這不是我想要的。

還有一個選項可以做git merge master ,然后從3開始執行git rebase -i -p之前的git rebase -i -p ,然后從3開始進行合並之后的最后一個合並,並從3進行修正/壓縮到合並中。 更新 :它沒有工作這么簡單。 Git拒絕壓榨兩次合並。 問題: git rebase交互式:南瓜合並在一起提交

您從以下位置開始:

     (1)
x--x--x--x--x--x--x         master
       \     \
        y--y--Y--y--y       dev
          (2)(3)   (4)

做一個git rebase --onto

git branch dev1 Y^
git rebase --onto master Y^ dev

Y^引用合並提交Y的第一個父級:這里是y ,而不是x
請參閱“ 先輩參考 ”:

第一個父級是您合並時所在的分支,第二個父級是您合並到的分支上的提交。

您最終將得到:

     (1)
x--x--x--x--x--x--x             master
       \           \
        y--y        Y'--y'--y'  dev
          (2)      (5)
        (dev1)

這會將您的初始dev分支一分為二,並且僅將最后一個dev提交應用於master ,同時保持第一個dev提交不變,現在由分支dev1引用。

您可以嘗試:

git rebase -p --onto master `Y^` dev

看看是否保留了y (即Y^ )和新近重新確定的Y'之間的關系。 但是我懷疑那是可能的。

-p用於--preserve-merge

使用my和VonC的答案可以使解決方案更加自動化:

git checkout -b tmp Y
git merge master 
git reset --soft HEAD^^ 
git rev-parse master > .git/MERGE_HEAD 
git commit -C Y
git checkout -
git rebase --onto tmp Y
git branch -d tmp

Y-是要擴展的合並提交。

它是這樣的:

x--x--x--x--x--x--x         master
       \     \
        y--y--Y--y--y       dev

x--x--x--x--x--x--x         master
      |      \
       \      Y             tmp
        \    / \
         y--y   y--y        dev

x--x--x--x--x--x--x         master
      |      \     \
       \      Y-----Y'      tmp
        \    / \
         y--y   y--y        dev

x--x--x--x--x--x--x         master
      |            \
      |      -------Y'      tmp
       \    /
        y--y--Y--y--y       dev

x--x--x--x--x--x--x         master
      |            \
      |      -------Y'      tmp
       \    /        \
        y--y          y--y  dev

x--x--x--x--x--x--x           master
       \           \
        y--y--------Y'--y--y  dev

我最終做了以下工作:

git rebase -i -p Y^

在文件中,在合並后的行后添加以下行(大概在第一行之后):

exec sh -c "git merge master; git reset --soft HEAD^^; git rev-parse master > .git/MERGE_HEAD; git commit -C `git rev-parse HEAD`"

暫無
暫無

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

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