2 つのブランチ (A と B) があり、ブランチ A の 1 つのファイルをブランチ B の対応する 1 つのファイルとマージしたいと考えています。
11 に答える
私は同じ問題に遭遇しました。正確には、2 つのブランチがA
ありB
、ファイルは同じですが、一部のファイルではプログラミング インターフェイスが異なります。2 つのブランチのインターフェイスの違いに依存しないfile のメソッドがf
、ブランチで変更されましB
たが、この変更は両方のブランチにとって重要です。したがって、ブランチのファイルだけをf
ブランチのファイルにマージする必要があります。B
f
A
A
すべての変更がブランチとブランチの両方でコミットされていると仮定すると、簡単なコマンドで問題は解決しましたB
。
git checkout A
git checkout --patch B f
最初のコマンドは、ファイルのバージョンA
をマージしたいブランチに切り替わります。2 番目のコマンドは、 of of でファイルにパッチを適用します。パッチの一部を受け入れる/破棄することもできます。ここで任意のコミットを指定できますが、そうである必要はありません。B
f
f
f
HEAD
B
B
HEAD
コミュニティ編集f
:上のファイルがまだB
存在しない場合は、オプションA
を省略し--patch
ます。それ以外の場合は、「変更なし」が表示されます。メッセージ。
これらの状況で私が行うことは次のとおりです。それはクラッジですが、私にとってはうまく機能します。
- 作業ブランチに基づいて別のブランチを作成します。
- コピーするファイルを含むリビジョン (SHA1) を git pull/git merge します。したがって、これによりすべての変更がマージされますが、このブランチを使用して 1 つのファイルを取得するだけです。
- 競合などを修正し、ファイルを調査します。
- 作業ブランチをチェックアウトします
- マージからコミットされたファイルをチェックアウトします。
- コミットします。
私はパッチを当ててみましたが、私の状況はあまりにも醜いものでした。要するに、次のようになります。
Working Branch: A Experimental Branch: B (折り込みたい変更を含む file.txt が含まれています。)
git checkout A
A に基づいて新しいブランチを作成します。
git checkout -b tempAB
B を tempAB にマージします
git merge B
マージの sha1 ハッシュをコピーします。
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
作業ブランチをチェックアウトします。
git checkout A
修正したファイルをチェックアウトします。
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
そして、そこにあるはずです。結果をコミットします。
あなたが使用することができます:
git merge-file
ヒント: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
編集が拒否されたので、リモート ブランチからの変更のマージを処理する方法をここに添付します。
間違ったマージの後にこれを行う必要がある場合は、次のようにすることができます。
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
B が現在のブランチであると仮定します。
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
これは、変更をローカル ファイルにのみ適用することに注意してください。後でコミットする必要があります。