頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?というスタンスで最強のナレッジベースを目指すブログ

【Git】フォーク元のリポジトリに追加された新規ブランチを自分のリモートリポジトリに反映する。

今回は、次のような場合を考えます。

リポジトリ masterブランチ developブランチ develop2ブランチ
フォーク元
フォークしたリモートリポジトリ
(自分のリモートリポジトリ)
×
ローカルリポジトリ ×

上記のような感じです。
つまり、一度フォークした後に、フォーク元にdevelop2ブランチが作成されたとき、
これを自分のリモートリポジトリにも反映させたいなぁ。 というときの手順です。

1.ブランチの状態を確認する。

まずはブランチの状態を確認するため以下のコマンドを実行します。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (develop)
$ git branch -a
* develop
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

実行結果を見るとローカル側とリモート側にdevelopブランチ、masterブランチがあることが確認できました。
ちなみにこの場合のoriginとは以下のとおりフォークしたリポジトリを指します。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (develop)
$ git remote -v
origin  http://localhost:8888/user01/prj3.git (fetch)
origin  http://localhost:8888/user01/prj3.git (push)

つまり、git branch -aの結果ではdevelop2ブランチの存在を確認できない状態になっています。
なぜかというと、フォークしたリモートリポジトリにもdevelop2ブランチが存在しないためです。

2.フォーク元のリポジトリをローカルへ追加する。

カレントディレクトリとフォーク元のリポジトリを関連付けるには以下のコマンドを実行します。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (develop)
$ git remote add fork_moto http://localhost:8888/group1/prj3.git

実行したコマンドの形式は次のとおりです。
git remote add ブランチ名 フォーク元ブランチのURL
上のコマンドを実行したらgit remoteで再度確認します。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (develop)
$ git remote -v
fork_moto       http://localhost:8888/group1/prj3.git (fetch)
fork_moto       http://localhost:8888/group1/prj3.git (push)
origin  http://localhost:8888/user01/prj3.git (fetch)
origin  http://localhost:8888/user01/prj3.git (push)

これでフォーク元のリポジトリを追加することが出来ました。
次に、フォーク元リポジトリの履歴情報を取得します。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (develop)
$ git fetch fork_moto
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From http://localhost:8888/group1/prj3
 * [new branch]      develop    -> fork_moto/develop
 * [new branch]      develop2   -> fork_moto/develop2
 * [new branch]      master     -> fork_moto/master

これで以下のとおりフォーク元のブランチが確認できようになりました。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (develop)
$ git branch -a
* develop
  master
  remotes/fork_moto/develop
  remotes/fork_moto/develop2
  remotes/fork_moto/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

3.フォーク元のリポジトリをローカルリポジトリのブランチとして反映する。

以下のコマンドでフォーク元のdevelop2ブランチをローカルリポジトリ内で作成します。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (develop)
$ git checkout -b moto_develop2 fork_moto/develop2
Switched to a new branch 'moto_develop2'
Branch 'moto_develop2' set up to track remote branch 'develop2' from 'fork_moto'.

実行したコマンドの形式は次のとおりです。
git checkout -b ローカルブランチ名 フォーク元リポジトリ名/フォーク元ブランチ名

次のコマンドで作成されたかを確認します。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (moto_develop2)
$ git branch -a
  develop
  master
* moto_develop2
  remotes/fork_moto/develop
  remotes/fork_moto/develop2
  remotes/fork_moto/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

はい、これで作成されました。

4.自分のリモートリポジトリへ反映する。

手順1~3で自分のリモートリポジトリには存在せず、フォーク元のみに存在したブランチをローカルへ持ってくることに成功しました。 表でいうと以下のとおりです。

リポジトリ masterブランチ developブランチ develop2ブランチ
フォーク元
フォークしたリモートリポジトリ
(自分のリモートリポジトリ)
×
ローカルリポジトリ

後はこれを自分のリモートリポジトリに反映するだけです。

shoya@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj3 (moto_develop2)
$ git push origin moto_develop2
Counting objects: 3, done.
Writing objects: 100% (3/3), 270 bytes | 270.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for moto_develop2, visit:
remote:   http://localhost/user01/prj3/merge_requests/new?merge_request%5Bsource_branch%5D=moto_develop2
remote:
To http://localhost:8888/user01/prj3.git
 * [new branch]      moto_develop2 -> moto_develop2

これで完了です。