2017-05-04 98 views
0
  1. 我創建了一個分支併發送這些更改拉入請求,我們稱之爲分支A.
  2. 然後,我創建了一個支路B,而我仍然在我的分支A.一些變化,我想送一請求這些更改並在分支B的最新提交中看到分支A(我發送了一個請求)的提交。

我該如何管理?Git從另一個分支創建分支。爲兩者發送拉請求?

  • 我可以發送分支B的拉取請求嗎?會有副作用嗎?
  • 我可以改爲在最後一次主合併時重新提交提交,並將提交重命名爲分支B上更改的名稱?這是否也會刪除我發送拉請求的分支A上的提交?
  • 如果我在接受pull請求之前需要對分支A進行其他更改,是否仍然可以在不影響分支B的情況下重新分割/壓縮分支A的提交?

我想我應該在創建另一個分支開發一個新功能之前再次確認我已經在主人身上,這樣它就不會再發生了嗎?

回答

0

最後,我找到了另一種我非常喜歡的方式,那就是櫻桃採摘

  1. 對來自master(A)的分支執行pull請求。
  2. 獲取不基於master(B)的分支的提交哈希。

    git log --pretty=format:"%h - %an, %ar : %s" 
    
  3. (可選)刪除舊的分支(B)如果你想保持相同的名字:

    git branch -D B 
    
  4. 創建從主一個新的分支:

    git checkout -b B 
    
  5. 櫻桃挑選變化(合併變化到新的分支):

    git cherry-pick HASH_OF_B (noted in step 2) 
    
  6. 合併如果有衝突,然後結束摘櫻桃:

    git cherry-pick --continue 
    
  7. 發送有關主正確基於這個新分支拉請求。

我喜歡這個的是主分支保持完美的形狀(完全乾淨),這很容易做到。我們也可以在不用擔心的情況下壓縮分支中的提交。

1

我可以發送分支B的拉取請求嗎?會有副作用嗎?

讓我們畫一個快速的畫面

X --- X --- X --- X <--(master) 
     \ 
     A1 -- A2 <--(A) 
      \ 
      B1 -- B2 -- B3 <--(B) 

我承擔A公關依然突出,所以A1masterB之間的差異。如果B中沒有任何內容依賴於A1,那麼這在概念上並不好;您不希望B的批准/合併取決於接受/潛在的A1過早發佈的變更。

現在,如果公關A獲得批准,那麼合併後A1不再是一個區別;你可以說「沒有傷害,沒有犯規」;但如果獨立分支機構獨立於master之後,仍然最好。

我可以改爲在最後一次主合併時重新提交提交,並將提交重命名爲分支B上更改的名稱?這是否也會刪除我發送拉請求的分支A上的提交?

以第一部分爲準:rebasing不會刪除回購的提交;這是一個(看似普遍的)誤解。因爲A1可從分支A到達,所以它不會受到B的重設影響。 但是,在重新綁定時應該小心,以避免創建一個重複的提交,因爲這會破壞rebase的目的。

git rebase --onto master A B 

應該給你

     B1' -- B2' -- B3' <--(B) 
        /
X --- X --- X --- X <--(master) 
     \ 
     A1 -- A2 <--(A) 
     \ 
      B1 --- B2 --- B3 

(請注意,我已經展示了B1B2,這對於圖清晰度B3加強這一基礎重建不會刪除提交點。由於沒有如果你不知道如何尋找它們,你就不會看到它們,並且它們將被排除在push之外,最終它們可能會被垃圾收集,但是在rebase之後,在你的本地回購你可以做一些像0123一樣的東西請注意,如果B曾經被推送過,這可能會給其他開發者帶來問題(因爲雖然沒有提交從repo中移除,但是這確實會提交曾經是的提交B可達不再可達來自B,這並不好。

請參閱git rebase文檔中的「從上游rebase」恢復,如果這看起來沒有問題,那麼您可以rebase。請記住,您需要重新測試已重建的B,因爲它的樹處於一個獨特的新狀態。 (IMO的最佳做法是重新測試中間提交。)

如果我在接受請求之前需要對分支A進行其他更改,我還可以重新分割/壓扁分支A的提交嗎?影響分支B?

這個問題至少有幾個變化。

如果你有重建基礎BA遠,那麼任何墊底的操作,將改寫或更換A1可能讓你在一個意想不到的狀態,因爲B仍然將指向通過A1(不A1'這是在重訂創建,或在南瓜的情況下爲A1A2,或其他)。

如果重建基礎B遠離A,那麼你可以做任何你喜歡A沒有進一步影響B。再次,只要意識到重寫已推動歷史的風險。