簡體   English   中英

我怎樣才能以易於回滾的方式進行git合並?

[英]How can I do git merges in such a way that they are easy to roll back?

有很多關於如何在git中“撤消”合並並不容易的討論。 簡短版本:如果撤消合並提交,它還會告訴git以后永遠不會將這些更改合並。

在進行合並時我能做些什么來減輕這個問題嗎? 在很多情況下,只需在軟件開發的正常過程中撤消合並就非常非常有用,更重要的是,在需要回滾更改時控制發布分支的狀態。

編輯

我已經看到了本文中的解決方案,並沒有真正認為它是一個解決方案,更多的是對問題的解釋。 這個需要

  1. 總是使用--no-ff
  2. 當你想要恢復依賴於它們的代碼時,記住你所有的撤消合並(這可能是未來幾小時,幾天,幾周或幾個月......)

我想要的是

以下是它在Subversion中的工作原理。 假設我有一個名為“release-candidate”的分支,這是我們在登台服務器上運行的,以及我們在哪里試用功能。 假設我在功能A分支中合並。 在Subversion中,它只是一個變更集,並且所有文件的所有歷史記錄都已合並。 假設我們不喜歡它,所以我們想把它拿出來。 我們只是撤消單個變更集,而不必考慮其他任何事情。 我們可以在將來的任何時候將功能分支A合並回來,而不必記住我們在某一點將其合並並將其取出。

我希望能夠盡可能接近這種流程。 我想優化“不必記住未來的東西”,即使它讓事情在某種程度上采取了更多的步驟。 (這可能是不可能的......)

更新:

這里有一個工作流程,可以更輕松地使用按功能分支: http//dymitruk.com/blog/2012/02/05/branch-per-feature/


(最后回答了問題的SVN部分)

是的,這是您重新引入未合並的功能的方法。 考慮以下歷史記錄(假設您已經“解除”合並):

x---x----x--x---x--M--U--L
     \            /
      x--x--x--x-F

F是特征分支,M是合並,當你取消合並該特征時,U是相反的,L是最新的提交。

以下是您的選擇:

  1. 還原U(沒有--force必要推):

     x---x----x--x---x--M--U--L--^U \\ / x--x--x--xF 
  2. 變基˚F到L(然后合並--ff-only F' )(沒有--force必要推):

     x---x----x--x---x--M--U--L \\ / \\ x--x--x--xx x'--x'--x'--x'--F' 
  3. 將F轉換為L(然后合並--no-ff F' - 保留新的分支點)(不需要 - 強制推送):

     x---x----x--x---x--M--U--L-------------------M2 \\ / \\ / x--x--x--xx x'--x'--x'--x'--F' 
  4. rebase -i head^^並從列表中消除U ( - --force是必要的推送)

     x---x----x--x---x--M--L \\ / x--x--x--xF 
  5. rebase --onto M^1 L^ L擺脫合並和取消合並。 現在你可以稍后重新合並。

      L' / x---x----x--x---x--M--U--L \\ / x--x--x--xF 

--squash所有功能提交,請在初始合並時使用--squash修飾符。 我會讓你的想象力在歷史上如何看待。 有理由我不建議這樣做。 知道如何使用功能以及采取了哪些步驟是很有價值的。 隨后的合並將更容易,因為Git可以檢查某個文件看起來如何的歷史記錄。 將提交壓縮在一起會丟失這些信息。

還有一些其他缺點可能影響或不影響您利用rerere歷史記錄的能力。

我建議始終標記在master中使用空白合並釋放的內容。 這是通過與--no-ff選項合並完成的。 你永遠不會在master上工作,那里完成的唯一提交是那些合並 - 沒有代碼更改提交。 在QA分支中,您標記標記您釋放點的提交。 因此,當您執行git merge --no-ff rc-12.2 ,您將自動生成提交注釋“merged rc-12.2”。

看看git-flow。

希望能為您提供更多細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM