[英]How to force git into “merge conflict mode”?
我在分支master
有一個文件foo
。 它需要一些工作,因此我在其中創建一些工作的分支bar
。 事情看起來令人滿意,所以我准備好重新融入master
。 只是一個問題:我想保留在分支bar
所做的所有更改以供將來參考,但並非所有更改都屬於master
,現在也不是。 但是,如果我執行通常的合並,則git不會看到任何沖突-由於尚未編輯master
文件foo
只會合並。 有沒有一種方法可以強制git進行合並,就好像我需要解決沖突一樣? 還是有其他方法可以將bar
僅選定的更改放入master
?
有幾種選擇。 直接回答您的問題的人:
git merge --no-commit
將執行自動合並到索引然后停止,就像需要手動解決沖突一樣。 當然,不會有沖突標記,也沒有“未暫存” /等待解決的更改,但是您可以修改提交以在提交之前查看所需的內容。
除了“可能很麻煩”之外,最大的問題是,就git而言, bar
所有更改現在都在master
。 由於您暗示可能以后需要其余更改,所以這不是很好。
您真正想要的是
x --- O --- M <--(master)
\ /
A --- B <--(bar)
其中O
是原始分支點, A
具有您現在想要的更改,而B
具有您以后想要的更改。
(或者,如果您希望避免合並提交,則需要
x --- O --- A <--(master)
\
B <--(bar)
代替。)
如何最好地做到這一點取決於您現在擁有什么。 如果bar
僅有一次提交(或者無論如何,如果您很高興以一個“現在合並”和一個“以后保存供以后保存”而告終),並且master
節點上沒有提交在O
之后,您可以執行以下操作:
從...開始
x --- O <--(master)
\
AB <--(bar)
你做
git checkout bar
git reset --mixed HEAD^
(假設在bar
上實際上只有一個提交;否則,將HEAD^
替換為諸如O
的SHA1值或在O
上放置的標記之類的東西)。 現在你有
x --- O <--(master)(bar)
^HEAD
與所有的從原來的變化bar
在你的工作樹未被跟蹤。 因為所有更改都在一個文件中,所以我們需要使用補丁程序模式有選擇地添加更改
git add -p
# select the changes to merge
git commit
git stash
給你
x --- O <--(master)
\
A <--(bar)
\ ^HEAD
B <--{stash}
接下來
git checkout master
git merge bar
如果要進行合並提交(保留對bar
更改的拓撲),則將--no-ff
傳遞給merge
命令。 否則,由於我們假設master尚未偏離bar
,您將獲得快速前進的機會
x --- O --- A <--(master)(bar)
\ ^HEAD
B <--{stash}
(相反,如果master
還沒有分出你決定linearlize歷史,你會重訂A
到master
,而不是合並的......)
然后你可以做類似的事情
git branch --delete bar
git stash branch bar
結束於
x --- O --- A <--(master)
\
B <--(bar)
如果我猜對了,您只希望將選擇性更改從bar
合並到master
。 在這種情況下,只要要在master分支中進行的更改都在原子提交中,就可以使用cherry-pick
或rebase --onto
來實現。 (如果不是,那么您可能需要重寫歷史記錄才能做到這一點)
>>> git checkout bar
>>> git log --oneline
b00ac1e third
24097f8 second
ade3073 first
# Let's say you want to bring `third` and `second` commit into master but not first
# Use cherry-pick if you have few commits, that you want to transfer
>>> git checkout master
>>> git cherry-pick 24097f8 # sha id of `second` commit
>>> git cherry-pick b00ac1e # sha id of `third` commit
您需要保留應該合並到master
的更改,並將更改保存在單獨的提交中,而不是不合並到master
中但保留在bar
更改:
o [master]
\
A - B - C - D - E - F [bar]
^^^^^^^^^
to be merged
注意,要合並的提交必須先到。 如果不是這種情況,則需要使用git rebase -i master bar
對其重新排序。
為了創建一個真正的合並提交(而不是將master
快速提交到C
),您需要執行
$ git checkout master
$ git merge --no-ff <hash of commit C>
這應該導致
o --------- G [master]
\ /
A - B - C - D - E - F [bar]
省略--no-ff
您將得到
o - A - B - C [master]
\
D - E - F [bar]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.