[英]how to merge two branches where 1st has one commit A and 2nd has commit A amended to B and 3 commits over top of B? Without a merge commit
[英]How to merge amended commit in branches without conflict?
我的工作項目使用Gerrit進行每次審查,並使用修訂的提交模型,在該模型中,您不斷進行修改並推送一次提交,直到獲得團隊批准為止,然后將其拉入遠程主服務器。 這很有效,直到我推送變更列表並且在等待審閱者的同時,我分支並開始從事其他工作。 不可避免地,審閱者會要求進行某些更改,並且原始提交會被修改。 當我想將其合並到分支中時,會發生合並沖突。
這是一個例子:
dd2e86 - 946992 [master]
\
76cada [branch]
一旦我修改了提交946992,它就會得到另一個哈希值。 我相信git會執行以下操作:
dd2e86 - c2ba32 [amended master]
\
946992 - 76cada [branch]
無論如何,我都嘗試過在分支機構重新部署master或選擇修改后的提交。 任一種都會引起合並沖突的頭痛,每次我重新設定基准時都必須解決,因此要進行多次修改會使事情變得非常困難。
我有一個解決方法,在這里我重置分支〜1並存儲更改,然后在修改后的提交之前重置另一個〜1提交以獲取,然后重新設置master並重播我的存儲,但是我覺得有更好的方法。 有什么辦法嗎?
每次您“修改”提交時,您實際上都會得到一個新的提交,就像您相信的那樣:git將從索引中git add
任何內容( git add
ed)並從中進行新的提交,復制先前的HEAD
提交的消息,但使新提交的父級成為先前HEAD
提交的父級,然后使新提交成為新HEAD
。 因此,您對后續提交圖的繪制是正確的。
如果您要處理的“其他事項”與另一個修訂無關,那么處理此問題的簡單方法是在等待批准的提交之前根據提交進行修訂:
946992 <-- proposed-fix-A # waiting for approval
/
... - dd2e86 <-- origin/master (or whatever)
\
xxxxxx <-- proposed-fix-B
代替:
xxxxxx <-- proposed-fix-B
/
946992 <-- proposed-fix-A # waiting for approval
/
... - dd2e86 <-- origin/master (or whatever)
這樣, xxxxxx
的父提交將是dd2e86
,它將不會改變,而不是946992
(或可能會)。 一旦proposed-fix-A
被批准並推送,您便可以將proposed-fix-B
基於最終版本,無論其SHA-1是什么。
(如果“其他”確實需要首先解決,則您將陷入解決沖突的困境。)
使“提議的修訂B”基於(即,作為其父提交)除當前分支的尖端以外的其他提交的方法是告訴git branch
或git checkout -b
哪里開始:
... work work work ...
git commit -m "proposed fix A"
# and submit it for review
# at this point, HEAD is proposed fix A, but
# now you want to create a new branch based
# on its parent commit, i.e., HEAD^, so:
git checkout -b fix-B HEAD^
... work work work ...
git commit -m "proposed fix B"
根據需要重復其他分支。 請注意,您可以使用gitrevisions中列出的任何方法而不是HEAD^
拼寫起點的SHA-1。 例如, origin/master
或origin/branch
可能是合適的起點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.