2017-10-13 3 views
1

Mがマスタの場合、A1A2は、新しいブランチのコミットですAオフMです。将来のバージョンから過去のバージョンにgitパッチを適用するにはどうすればよいですか?

A2A1

A1に依存A2の変更はありませんで何が起こったのかを考慮せずに、私はBへの適用に興味の変化は、(意味論的に言えば、私は気にしないでA1は限りBとして懸念している。

A1 - A2 
/
M 
\ 
    B 

私は、私の目には、右に見えるパッチを作ることができます。それが唯一のA2の変更を保持しているように見えます。

3方向で適用すると、A1のものにマージしようとします。

私が3つの方法なしで適用すると、正常に見えるマージ競合でさえ修正することさえできません。

チェリーピッキングもお手伝いしません。 M

# The Setup 
mkdir git-problem && cd git-problem 
git init 
echo Original > a.txt 
git add a.txt 
git commit -am "initial" 

# Branch A 
git checkout -b branch-A 
echo A1 >> a.txt 
git commit -am "A1 Changes" 

echo A2 >> a.txt 
git commit -am "A2 Changes, the one's I want in branch-B" 

git format-patch HEAD~ 

# Branch B 
git checkout master 
git checkout -b branch-B 

# Tries to bring in both commits 
# git cherry-pick d012465 # the latest commit on branch-A 
# git am --3way -- 0001-A2-Changes-the-one-s-I-want-in-branch-B.patch 
# git am -- 0001-A2-Changes-the-one-s-I-want-in-branch-B.patch 

a.txta.txtB

Original 
A1 
A2 

で、A2

Original 

ですが、私はそれをしたいと思い:

Original 
A2 
+0

手順を正確に実行すると、チェリーピックでマージ競合が発生します。珍しい設定がありますか?ギタリストでは、例えば? 'git check-attr -a a.txt'とは何ですか? cherrypickの出力はどうですか? – max630

答えて

1

変更の適用については、の変更内容がと一致しないため、gitは生成したファイルから取得したものであっても、またはcherry-pickを使用しているリポジトリ自体から取得したものであっても不平を言います。すなわち、A2行を挿入するファイル内のどこを知るために、A1の直後にA2があることがわかっているので、マージアルゴリズムはA1行を見つける必要があります。しかし、ファイルのbranch-Bバージョンでは、A1行はありません。アルゴリズムが混乱し、手動マージのためにあなたに戻ってきます。

これは通常の状況であり、状況が一致しない変更のセットを適用しようとするといつも遭遇するものです(この場合はリビジョンA1 )とあなたが置いている場所(この場合は改訂版B)。

私がこれを解決する方法は、git mergetoolです。これは、コンテキストが一致しない場所を表示したり、手動で対処する方法を選択するのに役立つエディタのようなプログラムを呼び出します。この例では、あなた自身がA2行を追加するためにファイルの小さな部分を編集する必要があるでしょう。

完全性のために、UNIX patchツールには、コンテキストの一部を無視して不完全な一致を検索するように指示する--fuzzオプションがあります。このオプションを使用すると、patchを使用していた場合はおそらくあなたの状況が解決されますが、gitに伝える方法があるかどうかはわかりません。

1

対話型リベースを使用して、A2からブランチBへの変更のみを手動で適用することもできます。以下のように詳細手順:リベースインタラクティブウィンドウで

git checkout -B B <commit id for A2> 
git rebase -i HEAD~3 

dropとしてA1のコミット変更:

<<<<<<< HEAD 
Original 
======= 
Original 
A1 
A2 
>>>>>>> ebd0940... A2 

ます:リベース中に

pick <commit id for M> 
drop <commit id for A1> 
pick <commit id for A2> 

を、a.txt意志のような競合を持っていますコミットA1のバージョンで何が変更されたのかを手動で確認し、手動で競合を解決する必要があります。それはあなたが必要とするものになります。

関連する問題