あるブランチから別のブランチにファイルを選択的にマージするには、次のコマンドを実行します。
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がファイルを自動的にマージできない場合、ファイルは「マージされていない」と報告され、競合を手動で解決する必要があるコピーが生成されます。
例を使ってさらに説明するため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が正常に自動マージしたファイルです。
これが意味するのは、これら3つのファイルすべての変更が、master
競合branchX
することなく結合されているということです。
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によるマージの失敗です。これは、同じ行で発生する両方のブランチに変更があることを意味します。ここで、競合を手動で解決する必要があります。ファイルを直接編集するか、目的のブランチのバージョンのcheckoutコマンドを実行することで、マージされたものを破棄できますfile4
。
最後に、忘れないでくださいgit commit
。