簡體   English   中英

通過基於另一個分支創建新的簽入來“合並” Git

[英]Git 'merge' by creating a new checkin based on another branch

我有一個git分支dev ,這正是我想要另一個git分支master的位置。 master有一些修補程序,它們在將來都比兩者的共同祖先更遠,因此此命令鏈會產生復雜而愚蠢的合並沖突:

git checkout master
git merge dev # Complicated merge conflicts. Boo hiss.

我想做的是在具有dev HEAD狀態的master上進行新提交。 從那時起,事情可以以更加理智的方式進行

例:

dev:    A ---> B ---> C ----> D
master: A ---> Y ---> Z ----> *

A是我的共同祖先。 Y和Z是沖突的修補程序更改,因此D,A和Z之間的三向合並是一團糟。

最后我想要這個結果:

  • master的HEAD包含與dev上的HEAD完全相同的代碼
  • 由於兩個分支都已推送到遠程,因此歷史記錄不會被重寫
  • 一個不錯的提交消息,解釋了這種合並提交

您可以嘗試使用ours合並策略:

git checkout dev
git merge -s ours master
git checkout master
git merge dev

與master的合並將創建一個合並提交,但是提交的結果將忽略master所做的所有更改。 然后,您只需簡單地將master匹配dev

有關合並策略文檔中

 ours 

這樣可以解析任意數量的head,但是合並的結果樹始終是當前分支head的樹,有效地忽略了所有其他分支的所有更改。 它旨在取代側支的舊開發歷史。 請注意,這與遞歸合並策略的-Xours選項不同。

要在master上進行新提交,使其完全匹配dev上的內容,可以執行以下操作:

git checkout dev                         # Get the working directory we want.
git symbolic-ref HEAD refs/heads/master  # Move HEAD to master without changing 
                                         # index or working directory.
git commit                               # Create the new commit on master.

這將創建一個與dev分支分開的全新提交。

我的靈感來自這里: https : //stackoverflow.com/a/6070417/2348315

如果遵循此步驟,則開發人員和管理員之間的合並提交將需要解決這些單獨的歷史記錄。 在此操作之后立即創建合並提交應該沒有沖突,但是必須是合並提交而不是快速合並。

如果您正在尋找變化,並陷入了您要以描述方式解決的沖突情況,則此方法將很有意義。 如果您的工作流是要合並更改,那么@Cupcake的merge -s ours方法似乎更合適。

  1. 將marster分支到新的分支修補程序中
  2. 將主重置為您想要的祖先(A)
  3. 合並D(== head / dev)到master

有關重置很棒的書gitpro的詳細信息: http ://git-scm.com/2011/07/11/reset.html

暫無
暫無

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

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