457

2 つのブランチ (A と B) があり、ブランチ A の 1 つのファイルをブランチ B の対応する 1 つのファイルとマージしたいと考えています。

4

11 に答える 11

754

私は同じ問題に遭遇しました。正確には、2 つのブランチがAありB、ファイルは同じですが、一部のファイルではプログラミング インターフェイスが異なります。2 つのブランチのインターフェイスの違いに依存しないfile のメソッドがf、ブランチで変更されましBたが、この変更は両方のブランチにとって重要です。したがって、ブランチのファイルだけをfブランチのファイルにマージする必要があります。BfA

Aすべての変更がブランチとブランチの両方でコミットされていると仮定すると、簡単なコマンドで問題は解決しましたB

git checkout A

git checkout --patch B f

最初のコマンドは、ファイルのバージョンAをマージしたいブランチに切り替わります。2 番目のコマンドは、 of of でファイルにパッチを適用します。パッチの一部を受け入れる/破棄することもできます。ここで任意のコミットを指定できますが、そうである必要はありません。BfffHEADBBHEAD

コミュニティ編集f:上のファイルがまだB存在しない場合は、オプションAを省略し--patchます。それ以外の場合は、「変更なし」が表示されます。メッセージ。

于 2012-07-21T15:11:42.987 に答える
19

これらの状況で私が行うことは次のとおりです。それはクラッジですが、私にとってはうまく機能します。

  1. 作業ブランチに基づいて別のブランチを作成します。
  2. コピーするファイルを含むリビジョン (SHA1) を git pull/git merge します。したがって、これによりすべての変更がマージされますが、このブランチを使用して 1 つのファイルを取得するだけです。
  3. 競合などを修正し、ファイルを調査します。
  4. 作業ブランチをチェックアウトします
  5. マージからコミットされたファイルをチェックアウトします。
  6. コミットします。

私はパッチを当ててみましたが、私の状況はあまりにも醜いものでした。要するに、次のようになります。

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

そして、そこにあるはずです。結果をコミットします。

于 2012-10-03T22:18:02.733 に答える
9

あなたが使用することができます:

    git merge-file

ヒント: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html

于 2013-07-03T18:49:33.943 に答える
0

編集が拒否されたので、リモート ブランチからの変更のマージを処理する方法をここに添付します。

間違ったマージの後にこれを行う必要がある場合は、次のようにすることができます。

# 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.
于 2012-11-21T02:50:19.503 に答える
0

B が現在のブランチであると仮定します。

$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R

これは、変更をローカル ファイルにのみ適用することに注意してください。後でコミットする必要があります。

于 2016-01-22T15:29:57.497 に答える