![](/img/trans.png)
[英]How to roll back in git and start again (keeping the history and the merges in between)
[英]How can I do git merges in such a way that they are easy to roll back?
有很多關於如何在git中“撤消”合並並不容易的討論。 簡短版本:如果撤消合並提交,它還會告訴git以后永遠不會將這些更改合並。
在進行合並時我能做些什么來減輕這個問題嗎? 在很多情況下,只需在軟件開發的正常過程中撤消合並就非常非常有用,更重要的是,在需要回滾更改時控制發布分支的狀態。
編輯
我已經看到了本文中的解決方案,並沒有真正認為它是一個解決方案,更多的是對問題的解釋。 這個需要
我想要的是
以下是它在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是最新的提交。
以下是您的選擇:
還原U(沒有--force
必要推):
x---x----x--x---x--M--U--L--^U \\ / x--x--x--xF
變基˚F到L(然后合並--ff-only F'
)(沒有--force
必要推):
x---x----x--x---x--M--U--L \\ / \\ x--x--x--xx x'--x'--x'--x'--F'
將F轉換為L(然后合並--no-ff F'
- 保留新的分支點)(不需要 - 強制推送):
x---x----x--x---x--M--U--L-------------------M2 \\ / \\ / x--x--x--xx x'--x'--x'--x'--F'
rebase -i head^^
並從列表中消除U ( - --force
是必要的推送) :
x---x----x--x---x--M--L \\ / x--x--x--xF
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.