あるブランチから別のブランチにファイルを選択的にマージするには、次を実行します。
git merge --no-ff --no-commit branchX
どこ branchX
あなたは現在のブランチにマージしたいからブランチです。
の --no-commit
オプションは、Gitによってマージされたファイルを実際にコミットせずにステージングします。これにより、マージしたファイルを必要に応じて変更し、自分でコミットする機会が与えられます。
ファイルをマージする方法に応じて、4つのケースがあります。
1)真のマージが必要です。
この場合、Gitが自動的にマージした方法でマージされたファイルを受け入れ、それらをコミットします。
2)マージしたくないファイルがいくつかあります。
たとえば、現在のブランチのバージョンを保持し、マージ元のブランチのバージョンを無視したいとします。
現在のブランチのバージョンを選択するには、次を実行:
git checkout HEAD file1
これによりfile1
、現在のブランチにあるのバージョンが取得file1
され、Gitによって自動マージされたものが上書きされます。
3)BranchXのバージョンが必要な場合(真のマージではない場合)。
実行:
git checkout branchX file1
これによりfile1
、in のバージョンが取得され、Gitによって自動マージされたものがbranchX
上書きfile1
されます。
4)最後のケースは、で特定のマージのみを選択する場合ですfile1
。
この場合、変更されたファイルをfile1
直接編集して、必要なバージョンに更新できます。file1
コミットできます。
Gitがファイルを自動的にマージできない場合、Gitはファイルを「unmerged」として報告し、競合を手動で解決する必要があるコピーを生成します。
例でさらに説明するためbranchX
に、現在のブランチにマージしたいとしましょう:
git merge --no-ff --no-commit branchX
次に、git status
コマンドを実行して、変更されたファイルのステータスを表示します。
例えば:
git status
# On branch master
# Changes to be committed:
#
# modified: file1
# modified: file2
# modified: file3
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: file4
#
どこでfile1
、file2
とfile3
、、、は、gitが正常に自動マージしたファイルです。
これが意味することはmaster
、branchX
、すべてのこれら3つのファイルが競合することなく、一緒に組み合わされているため。
を実行すると、マージがどのように行われたかを確認できgit diff --cached
ます。
git diff --cached file1
git diff --cached file2
git diff --cached file3
マージが望ましくない場合は、次のことができます。
- ファイルを直接編集する
- セーブ
git commit
マージせずfile1
、現在のブランチのバージョンを保持したい場合
走る
git checkout HEAD file1
マージfile2
したくなくて、バージョンを入れたいだけの場合branchX
走る
git checkout branchX file2
file3
自動的にマージしたい場合は、何もしないでください。
この時点で、Gitはすでにそれをマージしています。
file4
上記はGitによるマージの失敗です。これは、同じ行で発生する両方の分岐に変更があることを意味します。ここで競合を手動で解決する必要があります。マージしたファイルは、ファイルを直接編集するか、ブランチにしたいバージョンのチェックアウトコマンドを実行して破棄できますfile4
。
最後に、を忘れないでくださいgit commit
。