ブランチで作業したコミット(成果)を取り込んで統合する処理です
マージは現在のブランチに対して行われ、どのブランチのコミットを統合するか指定します
ブランチまでは、すんなり頭に入ってきましたが、マージ、リベースあたりから何かモヤモヤしてきます このあたりが Git の難しさでしょうか?
ここでは3つのブランチ(master, develop1, develop2)に枝分かれしたものをマージしてみます

マージボタンをクリックすると統合するコミットの選択ダイアログが表示されます

現在のブランチ(develop1)に develop2 のコミットをマージしてみます
ちなみに同じ位置にメッセージを追加したのでコンフリクトが発生するはずです

予想通りコンフリクト発生です

コンフリクトした部分が、コミットされていない変更 となっています
コンフリクトは、マージするブランチ間で同じ場所を修正していた場合に発生します
<<<<<<< HEAD から ======== という行までが現在のブランチの情報で、
======== から >>>>>>> XXXXXXXXXX までがマージするブランチの情報です
修正してコミットすればマージが終了します
今回は単純な同一箇所のメッセージ追加のコンフリクトなので、エディターで修正しますが、外部のマージツール等で修正してコミットしてもOKです

マージ後の状態
develop1ブランチにマージコミット(develop2コミットの取り込み)が行われますが、develop2ブランチは、閉じるわけではなく何も変わりません。このまま develop2 へコミットすれば develop1 とは別のブランチとして管理されていきます
樹形図(コミットグラフ)はゴチャゴチャした表示となりますが、コミット履歴がブランチを含めて残っていく基本的な統合方法です
リベース
マージと同じようにブランチを統合するのにリベースというコマンドもあります
先ほどのマージコミットを削除して同じ状態に戻してから、現在のブランチ(develop1)に develop2 のコミットをリベースしてみます
マージボタンをクリックしてダイアログを表示させます
リベースで統合する develop2 のコミットを選択します
オプションの マージの代わりにリベースする をチェックしておきます

今回も同じ位置にメーッセージの変更があるのでコンフリクトが発生です


コンフリクト部分をエディターで修正してコミットします

継続します

樹形図(コミットグラフ)は再構築されてスッキリしました
但し、ブランチされていたという履歴が改変されてしまいます
リベース後の状態
Develop1 ブランチに develop2 のコミットが挿入されます
develop2ブランチは、ブランチ上にあったコミットが develop1 ブランチに取り込まれ、基点が変わりブランチ名だけが残っている状態です。
よく見ないと何が起こったのかわかりません (^_^;)
基本的にはリモートブランチと統合する場合はマージを使用するのが鉄則です
リベースは、まだプッシュしていないローカルブランチの範囲で使用しましょう
※複数人でバージョン管理を利用している場合は、リベースでリモートリポジトリに統合すると思わぬトラブルの元となるので注意
マージは現在のブランチに対して行われ、どのブランチのコミットを統合するか指定します
ブランチまでは、すんなり頭に入ってきましたが、マージ、リベースあたりから何かモヤモヤしてきます このあたりが Git の難しさでしょうか?
ここでは3つのブランチ(master, develop1, develop2)に枝分かれしたものをマージしてみます

マージボタンをクリックすると統合するコミットの選択ダイアログが表示されます

現在のブランチ(develop1)に develop2 のコミットをマージしてみます
ちなみに同じ位置にメッセージを追加したのでコンフリクトが発生するはずです

予想通りコンフリクト発生です

コンフリクトした部分が、コミットされていない変更 となっています
コンフリクトは、マージするブランチ間で同じ場所を修正していた場合に発生します
<<<<<<< HEAD から ======== という行までが現在のブランチの情報で、
======== から >>>>>>> XXXXXXXXXX までがマージするブランチの情報です
修正してコミットすればマージが終了します
今回は単純な同一箇所のメッセージ追加のコンフリクトなので、エディターで修正しますが、外部のマージツール等で修正してコミットしてもOKです

マージ後の状態
develop1ブランチにマージコミット(develop2コミットの取り込み)が行われますが、develop2ブランチは、閉じるわけではなく何も変わりません。このまま develop2 へコミットすれば develop1 とは別のブランチとして管理されていきます
樹形図(コミットグラフ)はゴチャゴチャした表示となりますが、コミット履歴がブランチを含めて残っていく基本的な統合方法です
リベース
マージと同じようにブランチを統合するのにリベースというコマンドもあります
先ほどのマージコミットを削除して同じ状態に戻してから、現在のブランチ(develop1)に develop2 のコミットをリベースしてみます
マージボタンをクリックしてダイアログを表示させます
リベースで統合する develop2 のコミットを選択します
オプションの マージの代わりにリベースする をチェックしておきます

今回も同じ位置にメーッセージの変更があるのでコンフリクトが発生です


コンフリクト部分をエディターで修正してコミットします

継続します

樹形図(コミットグラフ)は再構築されてスッキリしました
但し、ブランチされていたという履歴が改変されてしまいます
リベース後の状態
Develop1 ブランチに develop2 のコミットが挿入されます
develop2ブランチは、ブランチ上にあったコミットが develop1 ブランチに取り込まれ、基点が変わりブランチ名だけが残っている状態です。
よく見ないと何が起こったのかわかりません (^_^;)
基本的にはリモートブランチと統合する場合はマージを使用するのが鉄則です
リベースは、まだプッシュしていないローカルブランチの範囲で使用しましょう
※複数人でバージョン管理を利用している場合は、リベースでリモートリポジトリに統合すると思わぬトラブルの元となるので注意

コメントをかく