2013-05-30 40 views
111

我正處於git pull --rebase之後重新綁定的中間位置。我有幾個合併衝突的文件。我怎樣才能接受「他們的」更改或「我的」對特定文件的更改?爲特定文件(「我們的」,「我的」,「他們的」)選擇Git合併策略

$ git status 
# Not currently on any branch. 
# You are currently rebasing. 
# (fix conflicts and then run "git rebase --continue") 
# (use "git rebase --skip" to skip this patch) 
# (use "git rebase --abort" to check out the original branch) 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: CorrectlyMergedFile 
# 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add <file>..." to mark resolution) 
# 
#  both modified: FileWhereIWantToAcceptTheirChanges 
#  both modified: FileWhereIWantToAcceptMyChanges 

通常我只是打開文件或合併工具並手動接受所有「他們的」或「我的」更改。但是,我懷疑我錯過了一個方便的git命令。

此外,請注意,我將只能爲每個文件選擇一個合併策略,當我看到哪些文件遇到衝突時可能會發生什麼衝突。

+0

@AbeVoelker我不認爲這解決了我的問題。我想爲特定文件選擇合併策略。另外,請注意,我只會知道在我進行重新綁定時要使用哪些合併策略,並查看哪些文件遇到衝突以及衝突是什麼。 –

+0

我編輯這個問題是更通用的:http://stackoverflow.com/questions/278081/resolving-a-git-conflict-with-binary-files。也許我們可以把這個問題作爲一個重複來解決?這是否合適? – 2013-05-30 00:39:30

+0

@TheShadow這對我來說似乎很合理。 –

回答

147

你所得到的每個衝突的文件,你可以指定

git checkout --ours -- <paths> 
# or 
git checkout --theirs -- <paths> 

git checkout docs

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
從索引檢出路徑時,請查看未合併路徑的階段#2(ours)或#3(theirs)。

由於先前失敗的合併,索引可能包含未合併的條目。默認情況下,如果您試圖從索引中檢出這樣的條目,則檢出操作將失敗並且不會檢出任何內容。使用-f將忽略這些未合併的條目。通過使用--ours--theirs,可以從索引中檢出合併的特定方的內容。通過-m,可以放棄對工作樹文件所做的更改,以重新創建原始衝突的合併結果。

+5

是否有可能接受所有留下的文件? – aslakjo

+17

@aslakjo'git rebase -s遞歸-X '或'git merge -s遞歸-X '。請記住,對於rebase,「我們」和「他們的」在合併過程中與他們的情況相反。你也可以只使用一個文件/ shell的glob,比如'git checkout - 他們 - * .txt'。 – 2014-04-12 02:52:07

+0

當看起來是一個子模塊時,此命令不起作用。 – user239558

7

注意git checkout --ours|--theirs通過選擇任一theirsours版本,這可能是也可能不是你想要做什麼(覆蓋文件完全,如果你從另一個插任何非衝突的變化他們將會失去)。

相反,如果要執行三路上的文件合併,只有解決使用--ours|--theirs衝突的帥哥,而保持不相抵觸的帥哥沒有到位兩側,你可能要訴諸git merge-file;詳見this answer

+0

關於將會丟失的「非衝突性變化」 - 這隻涉及特定行中非衝突性更改的文件,否則在同一文件中的所有文件或對齊歷史記錄中所有文件的所有更改? – ktamlyn

25

即使回答了這個問題,在git rebase vs merge的情況下,提供一個關於「他們」和「我們的」意味着什麼的示例。見this link

衍合的Git
theirs實際上是在的情況下,當前分支衍合。所以下面的一組命令實際上是通過遠程分支接受你當前的分支改變。

# see current branch 
$ git branch 
... 
* branch-a 
# rebase preferring current branch changes during conflicts 
$ git rebase -X theirs branch-b 

Git的合併
對於合併theirsours意思是相反的。因此,爲了在合併期間獲得相同效果,即保持當前分支更改(ours)在合併的遠程分支上(theirs)。

# assuming branch-a is our current version 
$ git merge -X ours branch-b # <- ours: branch-a, theirs: branch-b 
+0

好吧,這是一個相當重要的區別!謝謝澄清。 – verboze

相關問題