2012-09-19 82 views
3

假設我有一個分支case-xyz,在這裏我爲case #xyz工作,「實現Hello World」。「反向合併」分支

在開發過程中,我添加了不應該成爲最終提交的一部分的調試輸出等。

我可以這樣做以下:

  • 分行情況下-XYZ-調試和提交調試代碼只有在那裏。
  • 偶爾會將case-xyz-debug合併到case-xyz中。
  • 提交應該進入case-xyz最終補丁的東西。
  • 最後,「反向合併」case-xyz-debug,即刪除所有來自該分支的更改,與何時合併爲case-xyz無關。換句話說,這應該相當於從case-xyz-debug恢復所有合併。

我知道,當恢復合併提交時,Git不會忘記合併,即它仍然認爲您已經合併,因此您只能通過還原還原來重新合併。因此,只需要刪除case-xyz-debug中最初提交的所有更改,記錄的內容是無關緊要的。然而,這將是很好,如果我也可以做類似如下:

  • git的結帳的情況下,XYZ
  • git的結帳情況下-XYZ-做
  • 混帳 「反向合併」 的情況下,XYZ-調試

,因爲我可能要繼續開發/調試:

  • git的結帳的情況下,XYZ
  • 變化的文件
  • git的承諾-am 「哎呀,忘帶了什麼東西」
  • git的結帳情況下-XYZ-真的,做
  • 混帳 「反向合併」 案-XYZ-調試

我希望我的意圖很清楚。如果能夠實現這一目標,但採用完全不同的方式,我也會很開心。

+0

恕我直言,這不僅難以做到,而且是危險的。如果無意中在調試分支中添加了非調試代碼會怎麼樣?如果有一天你想讓你調試代碼呢?我會明確添加調試語句,並像大多數語言一樣在發佈代碼中禁用它們。 – CharlesB

+0

如果你真的設置了這個,你可以使用'rebase'從你的調試分支中刪除提交。做'分支case-xyz-before-rebase',然後'rebase case-xyz-done case-xyz -i'並移除或擠壓你的調試提交。但是CharlesB是對的,它比它的價值更麻煩。調試調用你最好'grep'並確保它們被註釋掉。 – willoller

回答

0

作爲正常工作流程的一部分,我通過交互式重新定位來做這類事情。我有提交,其中包括調試日誌記錄,臨時測試更改(Fe線程睡眠調用測試計時問題,故意拋出異常來測試錯誤處理代碼),硬編碼的值,使它更容易在我的應用程序端到端測試,而無需在UI中輸入值等等。我將這些東西保存在孤立的提交中;按照我自己的慣例,如果提交日誌消息全部大寫,它表示不應該推送到遠程的提交。

當我準備好了「反向合併」這些變化(刪除),我通過交互式的rebase這樣做:

git rebase -i <id of branch point> 

我只是刪除全部使用大寫消息的提交。(你實際上可以將其用於其他目的,例如對它們進行重新排序,使它們全部位於分支的開始處,這對於git commit --amend對你的真實工作非常有用,或者將它們重新排序爲最後一個,這對於當您想將branch-point..<id of last real commit>推送到遠程時,可能會很有用,讓您的「調試」提交完整並在當前歷史行結束時提交。)

知道<id of branch point>是多少有些痛苦;在我的工作流程中,我不想重新分配我的分支到f.e.的末尾。 master,同時刪除調試提交;出於這個原因,我保留了一個本地浮動標籤,我用它作爲參考點,我只是簡單地撥打rebase(這可能會讓人困惑,但您可以選擇任何你喜歡的名稱)。如果這看起來工作太多,那麼使用git rebase -i `git merge-base HEAD master`可能是您的一個選擇。 (我理解這是一個危險的做法,但我不覺得它們特別引人注目;有一百萬種方法可以讓你用腳踢自己,你應該考慮git rebase --abort的一些組合和git reflog是在情況下,你「逃生艙」你不小心刪除提交包含比你調試代碼等等。)

HTH