2012-10-08 44 views
3

的rebaseif善變擴展拉動只做如果合併能夠自動與沒有衝突進行衍合的時候,自動進行的過程。 (如果存在衝突手動解決,不重訂,讓你準備做兩個分支的手動合併)。這簡化和線性化,當開發商在代碼的不同部分正在工作的歷史,儘管任何rebase纔會拋當一個開發人員在工作時,可以瞭解關於世界狀況的一些信息。我傾向於喜歡thisthis,在一般情況下,墊底是不是一個好主意爭論同意,但我覺得底墊,如果理念呼籲非衝突情況。儘管我明白在代碼的不同部分發生更改時仍然存在邏輯錯誤的風險,但我仍然處於這個問題的範圍之內(並且the author of rebaseif extension has come to feel it’s a bad idea.。)使用rebaseif工作流程時,版本控制中的對分是否受益?

我最近經歷了一個複雜而痛苦的對分,並且我認爲在我們的倉庫中大量合併短期分支機構是導致對分不能達到其暗示O(lg n)承諾的主要原因。我發現自己需要多次運行「平分 - 擴展」,才能將範圍擴展到合併範圍之外,一次執行幾個變更集,基本上實現了對分O(n)。我也發現跟蹤對分的過程非常複雜,並且瞭解到目前爲止我所獲得的信息,因爲在查看存儲庫圖形時我無法遵循分支。

是否有更好的方法來使用對開(和來看待和理解修訂歷史記錄),或者是我的權利,這一進程將是平滑的,如果我們有更多的rebaseif在開發中使用。或者,您是否可以幫助我更具體地瞭解在非衝突情況下使用rebase可能會出現哪些問題:是否可能導致應該避免的問題? git的用戶可能已經看到了陷阱:

我更普遍的(不僅僅是善變),因爲我覺得rebaseif相匹配的更典型的git的工作流程標註這一點。

+0

關於給予hg可能的最大範圍(例如'0 :: tip')[這裏](http://stackoverflow.com/a/10458399)的價值有一些很好的對話。 – Edward

+0

我明白,但是我說得對,你不能指望它在過去測試失敗的情況下工作嗎? Bisect可能會遇到一些已經修復的失敗,並稱該時期的開始是第一個已知的錯誤。 –

+1

是的。當它找到一個從好到壞變化的點時,「bisect」將停止。你可能會嘗試改進你的測試(如果可能的話),以便只捕獲新的測試。或者你可以反轉你的測試,並使用舊的壞的開始找到下一個不好的過渡並從那裏重新開始。在我看來,開始更大和更窄範圍似乎比增加範圍更容易。 – Edward

回答

5

我想答案很簡單:您必須在硬二等分或有風險的重新分配之間進行分配。

或者,介於兩者之間的事物:如果基金會不太可能以默默的方式破壞事物,那麼只會發生基調變化。如果一個rebase只涉及一些變化集,而這些變化集在語義上距離它們重新設置的變化較遠,通常可以安全地進行rebase。

下面是一個例子,其中一個沒有衝突的合併打破東西:

假設兩個分支從這個內容的文件開始:

def foo(a): 
    # do 
    # something 
    # with a (an integer) 

... 

foo(4) 

在分支A,此時更改爲:

def foo(a): 
    # now this function is 10 times faster, but only work with positive integers 
    assert a > 0 
    # do 
    # something with 
    # with a 

... 

foo(4) 

在支路B,它被改變成:

def foo(a): 
    # do 
    # something 
    # with a (an integer) 

... 

foo(4) 

... 

foo(-1) # now we have a use case where we need to call foo with -1 

語義上,兩個編輯彼此衝突。然而,水銀愉快地將它們合併沒有衝突(在這兩種情況下,重訂或做定期合併時的時候):

def foo(a): 
    # now this function is 10 times faster, but only work with positive integers 
    assert a > 0 
    # do 
    # something with 
    # with a 

... 

foo(4) 

... 

foo(-1) # now we have a use case where we need to call foo with -1 

合併的好處是,它允許以瞭解出現的問題在以後的某個點,所以你可以相應地解決問題。 rebase可能會丟棄您需要了解自動合併導致的錯誤的信息。

+1

首先,感謝您提供簡單,具體的示例來幫助討論。我認爲「在語義上遠離他們重新啓動的變化」這個概念是一個很好的折衷政策,在許多情況下都可以重新設定折扣,儘管它確實需要更多的開發者關注和判斷,而不是絕對的任何一種政策。 (我會加入類似的觀點,以便更大的工作機構應該留在分支機構上並明確合併。) –

2

反對git rebase的主要觀點似乎是圍繞「失去歷史」的哲學觀點,但如果我真的關心我會做最後的構建步驟簽入(或第一個構建步驟來跟蹤所有失敗的構建太!)。

我對Mercurial或者平分(除了它有點像git)並不是特別熟悉,但是在我一個月的時間裏,我一直堅持使用git。我也用git rebase -i --autosquashgit add -p一個很多

IME,在修復衝突時,基礎設置和合並之間也沒有太大的區別 - 您鏈接的回答暗示「rebaseif」是壞的,因爲「if」條件是否合併進行時沒有衝突,而它的應該以代碼庫構建和測試通過爲條件。或許我的想法被git的設計固有的弱點所歪曲(它沒有明確記錄分支的歷史,即它實際指向的提交的子集),或者也許這就是我的工作方式(檢查diff是否理智,並且它是構建的,雖然我承認在rebase之後不檢查中間提交構建)。

(旁白:對於個人項目,我經常會喜歡跟蹤每個構建輸出和相應的源快照,不過我還沒有發現任何東西,這是很好的這樣做。)

+1

我認爲這不是基金會的「如果」(相對於分支和合並)理想情況下應該以關於軟件的一切是否正常工作爲條件。更好的問題是,這個特定的_merge_(與任何一個分支上的新工作相對)是否存在引入新問題的風險。 –

相關問題