2013-03-21 27 views
8

我真的相信,在一個問題上做出一個承諾是一個很好的做法。我確信我在「最佳實踐」這樣的文章中的某個地方閱讀過它。git commit的做法更好嗎?

因此,我的工作流程一直是以下幾點:

  • 對於一個新的問題,我創建git checkout -b new-issue新的本地分支。
  • 將所有更改提交給它。有時這涉及提交的批次
  • 完成後,我將squash的提交和rebase它們轉換爲當前的專題分支。
  • 如果出現問題,我可以git revert提交,找到bug,修復它,然後在專題分支中提交新補丁。我不會更改遠程存儲庫的歷史記錄。今天

不過,我很驚訝地聽到下面的工作流程:

  • 新問題,創建新的分支。
  • 承諾一切。
  • 使用merge --no-ff合併問題分支與專題分支(所以我們將有「合併承諾」,我們可以revert)。
  • 如果出現問題,我們可以使用git bisect來查找錯誤。

如第一的方針,我們將有一個乾淨的git的歷史,並沒有關於開發過程中使用開銷分支機構的想法。

根據第二種方法,我們將有一個非常混亂的歷史,有很多醜陋的,不必要的合併和提交只是一個問題。但是,我們可以使用git bisect來查找錯誤。 (也許這是重構更好?)


  • 你看到這兩種方法有什麼利弊?

  • 您使用哪種方法,爲什麼?

  • 實際上,您是否真的使用過git bisect來查找錯誤? (我沒有...)

+0

您可以使用'git log'的' - first-parent'選項隱藏合併分支上的單個提交。一點都不麻煩。 – Zaz 2014-07-09 15:58:39

回答

5

最後,它在很大程度上是一種個人品位的問題......只能說明我的口味(並給出一個有點理由吧)。

我傾向於保持個人承諾,即使他們只是「修復愚蠢的錯別字」。任何「歷史重寫」都會創建前所未有的提交,因此保證永遠不會被測試。此外,稍後的提交使得git bisect非常有用。最好能夠將其縮小到幾個變化的線條,而不是一個星期的工作,並壓扁在一起。

如果開發分支弄亂了歷史,我會清理它(最低限度地,回覆的提交只是從未發生過,一般修復如空白或可變更新可能會早些時候應用,一些重新排序以將相關更改放在一起)。承諾仍然很小,很少被壓扁。這個清理我主要是增量式的。然後,我將清理過的分支與「官方」分支合併(或重新分配)。

+0

你曾經使用過'git bisect'嗎?另外,假設我正在爲其中一個項目開發新模塊,我做了很多提交併將其保存在歷史記錄中。當我在其他項目上需要該模塊時,我將複製它並僅創建一個提交。 – 2013-03-21 20:35:11

+1

@viakondratiuk,不經常。但是當我需要找出什麼打破了完美的構建時,它讓我能夠在幾次嘗試中找到罪魁禍首。我甚至不會嘗試用手尋找。 – vonbrand 2013-03-21 20:38:31

5

第二種方法不必進行大量醜陋和不必要的合併和提交。這是我喜歡做的事:

  1. 創建一個新的話題分支
  2. 剛剛合併回父分支之前做了一堆提交
  3. ,清理提交:
    • 底墊到父分支的最新版本
    • 壁球錯字修復承諾
    • 拆分的提交一次到單獨提交
    • 做多件事情
    • 重新排序提交,使其更容易的評論者瞭解變化
  4. 合併與--no-ff到父分支的序列

上述步驟導致的歷史,看起來像這樣:

* 354b644 Merge branch 'topic3' 
|\ 
| * 54527e0 remove foo now that it is no longer used 
| * 1ef3dad stop linking against foo 
| * 7dfc7e5 wrap lines longer than 80 characters, no other changes 
| * b45fbcf delete end-of-line whitespace, fix indendataion 
|/ 
* db13612 Merge branch 'topic2' 
|\ 
| * 961eebf unbreak build by adding a missing semicolon 
|/ 
* a5b6b16 Merge branch 'topic1' 
|\ 
... (more history not shown) 

上述圖具有的方法#1中的所有相同的優點:

  • 可以使用--first-parent參數git log得到一個簡明的總結,類似於你會用的方法#1得到什麼:

    * 354b644 Merge branch 'topic3' 
    * db13612 Merge branch 'topic2' 
    * a5b6b16 Merge branch 'topic1' 
    ... (more history not shown) 
    
  • ,您仍然可以輕鬆地檢查主題中所做的更改的整體科。例如,git diff 354b644^..354b644將向您顯示針對主題#3更改的內容。

但你得到接近#1的好處不能給你:

  • 歷史是容易審查:犯下b45fbcf7dfc7e5(用於topic3分支)引進了很多噪音,但沒有實際的邏輯變化。有人試圖回答這個問題,「專題#3做了什麼邏輯改變?」如果所有這些提交都被壓縮爲一個,可能很難挖掘噪音。
  • 合併提交可以很好地標識合併分支上的一系列提交的上下文(例如,這組提交用於解決主題#3)。
  • 提交的更精細的粒度使得更容易找出爲什麼進行了特定的更改,這可以幫助區分意外但非常細微的意外更改。
  • 如果多個人在分支機構合作,您可以看到他們是誰,每個人貢獻了多少。
  • 合併主題分支上的提交數量可以讓您大致瞭解已更改了多少。
  • 提交的時間範圍可以提供有用的上下文。
  • 您可以輕鬆地選擇在不同分支上進行的特定更改(例如,選擇修復發佈分支所需的最小更改)。

我可以想到一個缺點:可能很難將軟件開發工具配置爲僅遵循第一條父路徑並忽略所有這些中間提交。例如,there is no --first-parent argument to git bisect。另外,我對Jenkins並不熟悉,知道如何配置它以優先構建和測試所有其他提交的第一條父路徑的優先順序。