Git

サブモジュールの更新を別ブランチ上で実施してみた

これまではサブモジュールをmainブランチで更新してきたが、この更新は別のブランチ上でも行える。

今回は、サブモジュールにfeatureブランチを追加し、親モジュールもfeatureブランチのサブモジュールを参照した上で、サブモジュールの更新を行ってみたので、その手順を共有する。

前提条件

下記記事の内容を実施済であること。

Gitコマンドでサブモジュールの内容をローカルで更新してみたGitコマンドを利用すると、サブモジュールの内容をローカル端末で更新することもできるが、サブモジュールの更新後にGitHubにその内容を...

やってみたこと

  1. サブモジュールにfeatureブランチを追加
  2. 親モジュールにfeatureブランチを追加
  3. 親モジュールのmainブランチにfeatureブランチの内容をマージ

サブモジュールにfeatureブランチを追加

サブモジュールをローカル端末に取得し、featureブランチを追加し、そのfeatureブランチにファイルを追加する。その手順は、以下の通り。

1) サブモジュールを取得する予定のディレクトリ上で右クリックし、「Git Bash Here」メニューを選択する。
サブモジュールにfeatureブランチを追加_1

2) 以下のように、Git Bash(gitを操作する際に使うターミナル)が起動することが確認できる。
サブモジュールにfeatureブランチを追加_2

3) GitHub上でサブモジュールを開き、「Code」ボタンを押下すると、サブモジュールのURLが確認できる。ここで確認したURLは「https://github.com/purin-it/subModuleSub.git」となる。
サブモジュールにfeatureブランチを追加_3

4) 「git clone (サブモジュールのURL)」 を実行し、GitHubからリポジトリ「subModuleSub」の内容をローカルに取得する。
サブモジュールにfeatureブランチを追加_4

5) subModuleSubディレクトリに移動後、「git branch」コマンドを実行すると、以下のように、mainブランチのみが作成されていることが確認できる。
サブモジュールにfeatureブランチを追加_5

6) 「git checkout -b feature」コマンドを実行することで、featureブランチを作成し移動する。
サブモジュールにfeatureブランチを追加_6

7) featureブランチ上で、sub4,txtファイルを追加する。
サブモジュールにfeatureブランチを追加_7

8) git addコマンド、git commitコマンド、git pushコマンドを利用して、サブモジュールの更新内容をGitHubに反映する。
サブモジュールにfeatureブランチを追加_8

9) サブモジュールの内容をGitHub上で確認した結果は以下の通りで、featureブランチが作成され、sub4.txtが追加されていることが確認できる。
サブモジュールにfeatureブランチを追加_9_1

また、mainブランチの内容は以下の通りで、sub4.txtは追加されていない。
サブモジュールにfeatureブランチを追加_9_2



親モジュールにfeatureブランチを追加

親モジュールをローカル端末に取得し、featureブランチを追加し、サブモジュールもfeatureブランチを参照するよう修正する。その手順は、以下の通り。

1) 親モジュールを取得する予定のディレクトリ上で右クリックし、「Git Bash Here」メニューを選択する。
親モジュールにfeatureブランチを追加_1

2) 以下のように、Git Bash(gitを操作する際に使うターミナル)が起動することが確認できる。
親モジュールにfeatureブランチを追加_2

3) GitHub上で親モジュールを開き、「Code」ボタンを押下すると、親モジュールのURLが確認できる。ここで確認したURLは「https://github.com/purin-it/subModuleMain.git」となる。
親モジュールにfeatureブランチを追加_3

4) 「git clone –recursive (親モジュールのURL)」 を実行し、GitHubからリポジトリ「subModuleMain」の内容を、サブモジュールの内容も含め、ローカルに取得する。
親モジュールにfeatureブランチを追加_4

5) 「subModuleMain」ディレクトリ移動後に「ls -lR」や「cat (参照するファイル名)」を実行すると、以下のように、「subModuleMain」ディレクトリ下にGitHub上にあった、mainブランチの各ファイルが取得できていることが確認できる。
親モジュールにfeatureブランチを追加_5

6) 「git branch」コマンドを実行すると、以下のように、mainブランチのみが作成されていることが確認できる。
親モジュールにfeatureブランチを追加_6

7) 「git checkout -b feature」コマンドを実行することで、featureブランチを作成し移動する。
親モジュールにfeatureブランチを追加_7

8) 現状の「.gitmodules」を確認した結果は、以下の通り。
親モジュールにfeatureブランチを追加_8

9) 「git config -f .gitmodules submodule.sub/dir.branch feature」コマンドを実行し、サブモジュールの参照先ブランチをfeatureに変更する。
親モジュールにfeatureブランチを追加_9

10) 「git submodule update –remote」コマンドを実行すると、featureブランチにあるsub4,txtファイルが取得できることが確認できる。
親モジュールにfeatureブランチを追加_10

11) 「sub/dir」ディレクトリ移動後にsub5.txtを追加し、追加されたことを確認する。
親モジュールにfeatureブランチを追加_11

12) git addコマンド、git commitコマンド、git pushコマンドを利用して、サブモジュールの更新内容をGitHubに反映する。
親モジュールにfeatureブランチを追加_12

13) サブモジュールの内容をGitHub上で確認した結果は以下の通りで、featureブランチの場合にsub5.txtが追加されていて、mainブランチの場合は変更されていない。
親モジュールにfeatureブランチを追加_13_1

親モジュールにfeatureブランチを追加_13_2

14) git addコマンド、git commitコマンド、git pushコマンドを利用して、サブモジュールの更新内容を親モジュールで反映し、GitHubに反映する。
親モジュールにfeatureブランチを追加_14

15) 親モジュールのfeatureブランチの内容をGitHub上で確認した結果は以下の通りで、「sub」ディレクトリ下に遷移すると、サブモジュール内に追加したファイルも表示されていることが確認できる。
親モジュールにfeatureブランチを追加_15_1

親モジュールにfeatureブランチを追加_15_2 親モジュールにfeatureブランチを追加_15_3

16) 親モジュールのmainブランチの内容をGitHub上で確認した結果は以下の通りで、内容は変更されていない。
親モジュールにfeatureブランチを追加_16_1

親モジュールにfeatureブランチを追加_16_2 親モジュールにfeatureブランチを追加_16_3



親モジュールのmainブランチにfeatureブランチの内容をマージ

親モジュールのfeatureブランチの内容を、親モジュールのmainブランチに反映する。その手順は、以下の通り。

1) 「git checkout (変更後ブランチ名)」というコマンドで、mainブランチに変更する。
featureブランチのマージ_1

2) 「git merge (マージ元ブランチ名)」というコマンドで、featureブランチの更新内容を、元の(main)ブランチに反映する。
featureブランチのマージ_2

3) 「ls -lR」や「cat (参照するファイル名)」を実行すると、featureブランチの内容が反映されていることが確認できる。
featureブランチのマージ_3

4) 「.gitmodules」の内容を確認すると、以下のように、サブモジュールの参照先ブランチをfeatureになっていることが確認できる。
featureブランチのマージ_4

5) git pushコマンドを利用して、サブモジュールの更新内容を親モジュールで反映し、GitHubに反映する。なお、下図では実行前にgit statusコマンドにより、git pushコマンドの実行が必要であることを確認している。
featureブランチのマージ_5

6) 親モジュールのmainブランチの内容をGitHub上で確認した結果は以下の通りで、featureブランチの内容が反映されていることが確認できる。
featureブランチのマージ_6_1

featureブランチのマージ_6_2 featureブランチのマージ_6_3

要点まとめ

  • サブモジュールを更新するブランチや、親モジュールの参照するサブモジュールの参照先ブランチは、別のブランチに設定することもできる。