Git Merge
最終更新
git merge は別のブランチのコミットを現在のブランチに取り込みます。現在のブランチが分岐していない場合、Git は fast-forward を行い、ポインタを前に進めるだけです。両方のブランチに新しいコミットがある場合、Git は2つの履歴を結び付けるマージコミットを作成します。rebase とは異なり、merge は両方のブランチの正確な履歴を保持します。
これらをターミナルプレイグラウンドで試してみましょう。ブラウザ内の本物のシェルで、インストールは不要です。
構文
| Command | What it does |
|---|---|
git merge feature | feature を現在のブランチにマージする |
git merge --no-ff feature | 常にマージコミットを作成する |
git merge --ff-only feature | fast-forward できる場合のみマージする |
git merge --squash feature | ブランチのコミットを1つにまとめる |
git merge --abort | 競合したマージを取り消す |
Fast-forward vs マージコミット
| Scenario | Fast-forward | Merge commit (--no-ff) |
|---|---|---|
| 新しいコミットを作成する | いいえ | はい |
| ブランチの記録を残す | いいえ | はい |
| 発生する条件 | 現在のブランチが分岐していない | 両方のブランチに新しいコミットがある |
マージ競合の解決
両方のブランチが同じ行を変更した場合、Git は一時停止します。
| Step | Command | Result |
|---|---|---|
| 1 | 競合したファイルを編集する | 正しい行を選び、マーカーを削除する |
| 2 | git add <file> | 競合を解決済みとしてマークする |
| 3 | git commit | マージを完了する |
git merge のよくある質問
Git であるブランチを別のブランチにマージするには?
マージ先のブランチに切り替え(例:
git switch main)、次に git merge feature を実行します。Git は feature のコミットを main に統合し、fast-forward するか、両方のブランチが分岐している場合はマージコミットを作成します。fast-forward とマージコミットの違いは何ですか?
fast-forward は、他のブランチが分岐して以降、現在のブランチが動いていない場合に発生します。Git はポインタを前にスライドさせるだけで、新しいコミットは作成しません。マージコミットは両方のブランチに新しいコミットがある場合に作成され、それぞれの履歴を結び付けます。常にマージコミットを作成するには
--no-ff を、fast-forward を必須にするには --ff-only を使います。マージ競合を解決するには?
マージで競合が起きると、Git は該当ファイル内の衝突している部分を
<<<<<<<、=======、>>>>>>> のマーカーで示します。各ファイルを編集して正しい内容を残しマーカーを削除し、解決したファイルを git add してから git commit でマージを完了します。マージを取り消す、または中止するには?
マージがまだ進行中の場合(競合が未解決の場合)、
git merge --abort を実行してマージを取り消し、マージ前の状態に戻します。マージがすでにローカルで完了している場合は、git reset --hard ORIG_HEAD がブランチをマージ前の位置に戻します(HEAD~1 と違い fast-forward の後でも正しく機能しますが、コミットしていない作業は破棄されます)。マージがプッシュ済みなら git revert -m 1 <merge-hash> を使います。これをオンラインで練習できますか?
はい。ターミナルプレイグラウンドを開けば、ブラウザ内の本物のシェルで
git merge を実行できます。インストールは不要です。Coddy の無料のインタラクティブな Git コースでも、マージと競合の解決を段階的に扱っています。