簡體   English   中英

拉動后 Git rebase

[英]Git rebase after pulling

目前我在使用 rebase 時遇到了麻煩。

feat           E(PR1) ---------> H(merge commit)
              /                /              \ (on trouble!)
master A-B - C  - - - - - - -> F
          \ /(merged)        /(merged)
tmp   ...  G - - - - - - - -K


所以情況是,我在 C 期做了一個“壯舉”分支,做了一些開發,並在 E 期(我的第一個 PR)提出了拉取請求。

然后從我的主管那里,我收到了 master 分支當前接受另一個 PR 的請求,因此請同步分支並進行 rebase 以丟棄合並提交並重新發送 PR。

所以,我所做的是,

  1. git 獲取來源

  2. git 拉大師

  3. 修復沖突

  4. 混帳添加。

  5. git commit -m "merge commit" ----問題發生的地方----

  6. git log(找到要變基的時期:時期'C'的散列(別名0x05)(ps日志順序是:H-F(來自分支tmp的合並拉取請求)-E-K,....)

  7. git rebase -i 0x05: 回到 C 壓縮 E, H

  8. 然后我得到比我預期的結果更奇怪的結果,即沒有提交 'H',只顯示 E..

(例如)選擇 E(我也需要日志選擇 H)

對此有什么想法嗎?

你試圖做的事情沒有多大意義,而 git 假設你實際上是指別的東西。

合並提交的主要目的是記錄您已合並某些內容的事實 作為解決沖突的副作用,提交可能會引入新的變化,但 git 不存儲變化,它存儲結果,所以它實際上不知道“代碼看起來像這樣因為合並沖突”和“由於干凈的合並,代碼看起來像這樣”。

另一方面,rebase 的目的是重放更改 同樣,這些更改實際上並未存儲,而是通過將提交與其父母進行比較來重建 在大多數情況下,合並提交沒有您想要以這種方式重播的更改,因此git rebase 默認情況下會簡單地忽略合並提交

您的實際問題是您重新定位到錯誤的 base

作為一個好習慣,讓我們把歷史畫得更像 git 的視圖——分支指向最近的提交,提交指向父母:

            E <------------- H <-(feat)
           /                /             
A <- B <- C <- - - - - - - F <-(master)
      \  /(merged)        /
        G <- - - - - - - K <-(tmp)

變基到 C,即使你可以保留合並的結果,也會給你這個:

          /<- E2 <-(feat)
          |
          | E <------------- H (unreachable from any branch)
          |/                /             
A <- B <- C <- - - - - - - F <-(master)
      \  /(merged)        /
        G <- - - - - - - K <-(tmp)

請注意,E2,無論它包含什么代碼,都不會以任何方式聲稱與提交 F 相關。

你真正想要的是檢查 branch feat ,然后:

git rebase master

這意味着“找到當前分支上的所有提交,但不是master ;然后重置為master ,並重播這些更改”。 結果是這樣的:

                               /<- E2 <-(feat)
                              /
            E <------------H / (H is unreachable)
           /               |/             
A <- B <- C <- - - - - - - F <-(master)
      \  /(merged)        /
        G <- - - - - - - K <-(tmp)

刪除無法訪問的提交(git 將在后台“垃圾收集”它們):

                             /<- E2 <-(feat)
                            /        
A <- B <- C <- - - - - - - F <-(master)
      \  /(merged)        /
        G <- - - - - - - K <-(tmp)

現在E2不僅有原來E的變化加上master到F的變化 它還記錄了它與 F 的關系

暫無
暫無

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

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