簡體   English   中英

在 Git 中,我如何重新設置 + 壓縮一個在其歷史中具有多個合並提交的分支,而無需挑選到一個全新的分支

[英]In Git, How can I rebase + squash a branch that has multiple merge commits in it's history without cherry-picking onto a totally new branch

問題

我希望能夠采用最初從 master 分支出來的分支,並從 master 進行多次合並,因此它在 master 上顯示為單個提交。 我們這樣做是為了獲取開發人員的分支並在主服務器中生成干凈的歷史記錄(一旦經過測試)。

我知道如何通過在 master 的尖端創建一個新分支(即“master”指針)並對其進行挑選(根據需要解決沖突,但應該可以只使用 rebase 命令(應該'不是嗎?)這里的假設是master本身沒有被rebase。

作為一個例子,我想以下面的歷史記錄為例,下面是分支大師和分支塗鴉:

原始歷史

  *  commit K, branch doodle, merge commit (conflicts)
 /|
* |  commit J, branch master, 
| |
| *  commit I, branch doodle
* |  commit H, branch master
| |
| *  commit G, branch doodle,merge commit (conflicts)
|/|
| *  commit F, branch doodle
* |  commit E, branch master
| |
| *  commit D, branch doodle,merge commit (no conflicts)
|/|
* |  commit C, branch master
| *  commit B, Branch doodle 
|/
*    commit A, Branch master

並將其轉換為 master 上的以下歷史記錄,其中 doodle 上的整個提交鏈被壓縮並重新定位到 master 的 HEAD 上,如下所示。 由於分支 doodle 的負責人已提交 K,並且 master 和 doodle 之間的所有沖突都已解決,因此執行以下操作應該像單個命令一樣簡單。 它也不會混淆已出版的大師的歷史。

期望的歷史

*    commit L, branch master,(squash commit B,D,F,G,I,K)
|
*    commit J, branch master
|
*    commit H, branch master
|
*    commit E, branch master
|
*    commit C, branch master
|
*    commit A, branch master

另一種方法是生成下面顯示的歷史記錄,然后在合並回 master 之前 squash 提交 B'、F'、G'I'、J'、K'。 然而,下面的這種方法似乎增加了一個 rebase 應該能夠處理的額外步驟(盡管有沖突解決)。

替代歷史

| *  commit K', branch doodle (possible conflict resolution)
| |
| *  commit I', branch doodle (possible conflict resolution)
| |
| *  commit G', branch doodle (possible conflict resolution)
| |
| *  commit F', branch doodle (possible conflict resolution)
| | 
| *  commit B', branch doodle (possible conflict resolution)
|/
*    commit K, branch master
|
*    commit H, branch master
| 
*    commit E, branch master
|
*    commit C, branch master
| 
*    commit A, Branch master

我試過的

目前,我正在創建一個新的分支,從主提示和櫻桃采摘 B、F 和我到它上面。 這可行,但比我認為必要的要復雜,因為我必須重新解決合並沖突。 現在,我知道rebase--rebase-merges標志。 但是,由於某種原因,我無法讓--rebase-merges產生“欲望歷史”甚至替代歷史。 我可能會錯誤地選擇帶有rebase -i HEAD~N --rebase-merges的提交。

問題

怎樣才能輕松地從原始歷史到想要的歷史?

此外,如果原始歷史中的 master 在最后一次合並到 doodle 后有一些額外的提交,這種方法是否允許在拉入 master 之前解決沖突?

這可以通過reset --soft輕松完成

git checkout doodle
git reset --soft master
git commit -m "doodle, as a single commit"

沒有麻煩。 如果有更多屬於 doodle 的提交到 master,則在執行此操作之前合並。

暫無
暫無

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

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