2つのブランチ(AとB)があり、ブランチAからの単一ファイルをブランチBからの対応する単一ファイルとマージしたいと思います。
私は同じ問題に出くわした。正確には、同じファイルを持つ2つのブランチA
とB
がありますが、ファイルによってはプログラミングインターフェースが異なります。 2つのブランチでのインタフェースの違いに依存しないファイルf
のメソッドがブランチB
で変更されましたが、変更は両方のブランチにとって重要です。したがって、ブランチf
のファイルB
をブランチf
のファイルA
にマージするだけです。
すべての変更がA
とB
の両方のブランチでコミットされていると仮定すれば、単純なコマンドで既に問題が解決しています。
git checkout A
git checkout --patch B f
最初のコマンドはブランチA
に切り替え、そこにB
のバージョンのファイルf
をマージします。 2番目のコマンドは、ファイルf
に、f
のHEAD
、およびB
のパッチを適用します。あなたは、パッチの単一の部分を受け入れる/捨てることさえできます。 B
の代わりにここで任意のコミットを指定できます。HEAD
である必要はありません。
Community edit:f
上のファイルB
がまだA
上に存在しない場合は、--patch
オプションを省略してください。それ以外の場合は、「変更なし」と表示されます。メッセージ。
これが私がこれらの状況でしていることです。それは問題だが、それは私にとってはうまくいく。
私はパッチを当てようとしましたが、私の状況はそれにとってあまりにも醜いものでした。つまり、要するにそれは次のようになります。
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 <[email protected]>
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
これは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.
次のコマンドは(1)正しいブランチのファイルを比較し、master(2)にどの修正を適用するかを対話的に尋ねます。
git checkout - パッチマスター
私はこのアプローチがシンプルで便利だと思った。 他のブランチから特定のファイルを「マージ」する方法
結局のところ、私たちは努力しすぎています。私たちの親友のgitチェックアウトはその仕事にぴったりのツールです。
git checkout source_branch <paths>...
機能ブランチAの名前と、マスターブランチに追加したい特定のファイルへのパスを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
これはローカルファイルへの変更のみに適用されることに注意してください。後でコミットする必要があります。
古いバージョンのファイルをチェックアウトして別の名前で保存してから、マージツールが2つのファイルに対して実行しているものをすべて実行できます。
例えば。
git show B:src/common/store.ts > /tmp/store.ts
(Bはブランチ名/ commit/tag)
meld src/common/store.ts /tmp/store.ts
git format-patch branch_old..branch_newファイル
git am blahblah.patch