[英]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。
所以,我所做的是,
git 獲取來源
git 拉大師
修復沖突
混帳添加。
git commit -m "merge commit" ----問題發生的地方----
git log(找到要變基的時期:時期'C'的散列(別名0x05)(ps日志順序是:H-F(來自分支tmp的合並拉取請求)-E-K,....)
git rebase -i 0x05: 回到 C 壓縮 E, H
然后我得到比我預期的結果更奇怪的結果,即沒有提交 '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.