2つのブランチ(AおよびB)があり、ブランチAからの単一のファイルをブランチBからの対応する単一のファイルとマージしたい。
2つのブランチ(AおよびB)があり、ブランチAからの単一のファイルをブランチBからの対応する単一のファイルとマージしたい。
回答:
私は同じ問題に出くわしました。正確には、2つのブランチがA
ありB
、ファイルは同じですが、一部のファイルではプログラミングインターフェイスが異なります。これf
で、2つのブランチのインターフェースの違いに依存しないfileのメソッドが、branch B
で変更されましたが、変更は両方のブランチで重要です。したがって、私は、ファイルマージする必要がf
枝のをB
ファイルにf
ブランチのA
。
私はすべての変更が両方のブランチにコミットしていることを前提とした場合、単純なコマンドは、すでに私のために問題を解決しA
とB
:
git checkout A
git checkout --patch B f
最初のコマンドはブランチA
に切り替わり、そこでB
ファイルのバージョンをマージしたいところに行きますf
。2番目のコマンドはf
、f
of HEAD
ofを使用してファイルにパッチを適用しますB
。パッチの単一の部分を受け入れる/破棄することもできます。B
ここでコミットを指定する代わりに、である必要はありませんHEAD
。
コミュニティ編集:f
上のファイルB
がまだ存在しA
ない場合は、--patch
オプションを省略します。それ以外の場合は、「変更なし」になります。メッセージ。
git checkout --patch B -- f
これを機能させるために使用する必要がありました。
a
、y
毎回押すのではなく、インタラクティブフェーズ中にを押すことができることを追加するだけです。または、git checkout B -- f
代わりにコマンドを使用してください。
これが私がこれらの状況で行うことです。それはkludgeですが、私にとってはうまくいきます。
私はパッチを当ててみましたが、私の状況はそれにとって醜いものでした。つまり、次のようになります。
作業ブランチ:A実験ブランチ: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
そして、あなたはそれを持っているべきです。結果をコミットします。
A
はB
他の方法でそもそもから転用しています。コピーはそれらの違いを上書きします。
これはgitの内部difftoolを使用します。たぶん少しの作業が必要ですが、単純明快です。
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(空の引数ラベル)の使用を明確にするために、git checkout docs:ARGUMENT DISAMBIGUATION say: "use git checkout -- <pathspec>
if you want the checkout these path from the index。これは、同じ名前でブランチとファイル/パスの両方を持つことができるためです。このような場合、ブランチまたはパスの両方が存在する場合にチェックアウトする必要があるかどうかを明確にするように求めるのではなく、gitはデフォルトでブランチをチェックアウトすることを選択します。ただし、--
前にある場合、gitは代わりにファイル/パスをチェックアウトします。
このアプローチはシンプルで便利であると思いました。別のブランチから特定のファイルを「マージ」する方法
結局のところ、私たちは懸命に努力しています。私たちの親友のgit checkoutは、この仕事に適したツールです。
git checkout source_branch <paths>...
git checkoutに機能ブランチAの名前とマスターブランチに追加する特定のファイルへのパスを指定するだけです。
詳細については記事全体をお読みください
-p
そのコマンドでオプションを使用するつもりだったと思います。その後、残念ながら、パッチを変更する前に、チェックアウト元のブランチから迂回したワークツリーファイルの部分を上書きします。
あなたは使うことができます:
git merge-file
ヒント:https : //www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
git merge-file
次のコマンドは、(1)正しいブランチのファイルをマスターと比較し、(2)適用する変更をインタラクティブに尋ねます。
git checkout-パッチマスター
編集が拒否されたため、リモートブランチからのマージ変更の処理方法をここに添付します。
間違ったマージの後にこれを行う必要がある場合は、次のようにすることができます。
# 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
これはローカルファイルへの変更のみを適用することに注意してください。後でコミットする必要があります。
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
私はそれをします
git format-patch branch_old..branch_new file
これにより、ファイルのパッチが作成されます。
ターゲットのbranch_oldにパッチを適用します
git am blahblah.patch