簡體   English   中英

如何強制git進入“合並沖突模式”?

[英]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歷史,你會重訂Amaster ,而不是合並的......)

然后你可以做類似的事情

git branch --delete bar
git stash branch bar

結束於

x --- O --- A <--(master)
             \
              B <--(bar)

如果我猜對了,您只希望將選擇性更改從bar合並到master 在這種情況下,只要要在master分支中進行的更改都在原子提交中,就可以使用cherry-pickrebase --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.

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