web-dev-qa-db-ja.com

コミットをマージするのではなく、変更を単一のファイルにマージする方法を教えてください。

2つのブランチ(AとB)があり、ブランチAからの単一ファイルをブランチBからの対応する単一ファイルとマージしたいと思います。

314
Isuru

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

すべての変更がABの両方のブランチでコミットされていると仮定すれば、単純なコマンドで既に問題が解決しています。

git checkout A

git checkout --patch B f

最初のコマンドはブランチAに切り替え、そこにBのバージョンのファイルfをマージします。 2番目のコマンドは、ファイルfに、fHEAD、およびBのパッチを適用します。あなたは、パッチの単一の部分を受け入れる/捨てることさえできます。 Bの代わりにここで任意のコミットを指定できます。HEADである必要はありません。

Community editf上のファイルBがまだA上に存在しない場合は、--patchオプションを省略してください。それ以外の場合は、「変更なし」と表示されます。メッセージ。

526
loup

これが私がこれらの状況でしていることです。それは問題だが、それは私にとってはうまくいく。

  1. 作業中のブランチから別のブランチを作成してください。
  2. git pull/gitはコピーしたいファイルを含むリビジョン(SHA1)をマージします。それでこれはあなたのすべての変更をマージするでしょう、しかし我々はただ一つのファイルをつかむためにこのブランチを使用しています。
  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 <[email protected]>
Date:   Wed Oct 3 15:13:24 2012 -0700

Merge branch 'B' into tempAB

作業ブランチをチェックアウトしてください。

git checkout A

修正したファイルをチェックアウトします。

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt

そして、あなたはそれを持っているべきです。結果を確定します。

13
eggmatters

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

    git merge-file

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

8
geralOE

これは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.
8
Mikael Kellgren

次のコマンドは(1)正しいブランチのファイルを比較し、master(2)にどの修正を適用するかを対話的に尋ねます。

git checkout - パッチマスター

2
user1854182

私はこのアプローチがシンプルで便利だと思った。 他のブランチから特定のファイルを「マージ」する方法

結局のところ、私たちは努力しすぎています。私たちの親友のgitチェックアウトはその仕事にぴったりのツールです。

git checkout source_branch <paths>...

機能ブランチAの名前と、マスターブランチに追加したい特定のファイルへのパスをgit checkoutに与えるだけです。

もっと理解するために記事全体を読んでください

2
Pawel Cioch

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

誤ったマージの後にこれをしなければならない場合は、次のようにすることができます。

# 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.
0
Soup

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

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

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

0
jbirkel

古いバージョンのファイルをチェックアウトして別の名前で保存してから、マージツールが2つのファイルに対して実行しているものをすべて実行できます。

例えば。

git show B:src/common/store.ts > /tmp/store.ts(Bはブランチ名/ commit/tag)

meld src/common/store.ts /tmp/store.ts

0
Salami

私はそれをするつもりです

git format-patch branch_old..branch_newファイル

これによりファイルのパッチが作成されます。

ターゲットbranch_oldにパッチを適用します

git am blahblah.patch

0
Noob