2012-01-16 92 views
15

明白了對Master分支的興趣兩次提交,既是一個文件,都只有修改一個文件foo:以前提交AA,而當前版本中HEAD。我想合併文件的兩個版本,將這兩個版本的位合併到HEADMaster混帳:合併老提交到當前的頭型

我這樣做,我認爲會工作的最簡單的事情:

git checkout -b merge-purgatory AA 
git commit -m "pulled foo back from previous commit for merging into HEAD." 
git checkout master 
git merge merge-purgatory 

它只是覆蓋當前版本HEADfooAA版本。 也嘗試了更詳細的git checkout -m,結果相同:啞覆蓋。

如何強制git將AA版本foo作爲與當前HEAD版本的衝突合併?

回答

14

如果Git的合併是不是做你想要什麼,你可以做,而不是執行以下操作:

  1. 確保有文件foo,例如在未提交的更改通過確保git status是乾淨的。
  2. 使用與版本覆蓋fooAAgit add -p foo
  3. 放棄所有與git checkout -- foo
  4. 提交階段性變化的其他變化foogit show AA:foo > foo
  5. 選擇性階段僅適用於從foo要與變化git commit

或者,如果您寧願使用圖形比較工具(如meld ),你可以這樣做:

git show AA:foo > old-foo 
meld old-foo foo 
+2

所以基本上,只是繞過git的前一個提交的知識,並使用手動合併/ mergetool。希望從git中獲得更加強烈的行爲,但這很簡單,我成功地使用了它,並在之後做了一些清理。謝謝! – Noel 2012-01-17 18:52:22

1
git merge --no-commit merge-purgatory 

將至少給你機會審查:在提交之前更改了合併。
參見「How do you merge selective files with git-merge?」中提出的基於櫻桃採摘或結賬的技術。


關於強制手動合併,你可以聲明在.gitatributes file,對於特定的文件,設置爲未設置一個合併策略。

執行三路合併

合併

The attribute merge affects how three versions of a file is merged when a file-level merge is necessary during git merge, and other commands such as git revert and git cherry-pick. 
Unset 

採取從當前分支作爲暫定合併結果的版本,並宣佈合併有衝突。這適用於沒有明確定義的合併語義的二進制文件。

+0

是「review:change」命令還是選項開關? – Noel 2012-01-16 08:27:56

+0

而且,在任何情況下,「自動合併進行得順利;在提交請求前停止」並不完全回答我的問題:如何防止「自動合併」發生,而是將兩個版本視爲衝突(它們是,覆蓋彼此的線)並需要手動合併? – Noel 2012-01-16 08:31:05

+0

@Noel:對不起,我刪除了手動合併部分。我編輯了我的答案。 – VonC 2012-01-16 08:35:16

3

以前的答案沒有保留更改的故事,所以事實上你使用了前一個提交來產生新的提交。 以下過程將保留此故事。

git checkout -b merge-purgatory AA 

在這裏你需要稍微修改您的文件,例如,你可以添加一個空行。然後

git commit "pulled foo back from previous commit for merging into HEAD." 
git checkout master 
git merge --no-commit merge-purgatory 

這樣的合併會失敗,那麼所有你需要做的是解決衝突。這對我有效。