脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

[Git] masterにpull requestされていない他人のCommitを自分のレポジトリに取り込む方法

同じmasterリポジトリをForkしている他メンバーの更新を取り込む方法。
チームで開発をする時など、masterへpull requestされていない他メンバーの更新を自分の環境に取り込みたいと思う時があるので、その手順。

手順

はじめにコマンドだけ紹介してしまうと、

$ git remote add ${取り込みたいブランチのユーザー名} ${取り込みたいリポジトリのURL} # 参照の作成
$ git fetch ${取り込みたいブランチのユーザー名} # 参照先から情報の取得
$ git branch -av # 他ユーザのブランチ情報の確認
$ git merge --no-ff ${fetchで追加されたブランチ名}

以上です。

説明

現在の参照元の確認
$ git remote -v
master  https://github.com/master/hogehoge.git (fetch)
master  https://github.com/master/hogehoge.git (push)
origin  https://github.com/portaltan/hogehge.git (fetch)
origin  https://github.com/portaltan/hogehoge.git (push)

何もしていない場合はmasterのリポジトリと、Forkしてきた自分のリポジトリが表示されます。

ここから太郎さん(https://github.com/taro/hogehge.git)の更新を取り込んでみたいと思います

まずは参照先を追加します
#git remote add ${取り込みたいブランチのユーザー名} ${取り込みたいリポジトリのURL}
$ git remote add taro https://github.com/taro/hogehoge.git

$ git remote -v
master  https://github.com/master/hogehoge.git (fetch)
master  https://github.com/master/hogehoge.git (push)
origin  https://github.com/portaltan/hogehge.git (fetch)
origin  https://github.com/portaltan/hogehoge.git (push)
taro https://github.com/taro/hogehoge.git (fetch)
taro https://github.com/taro/hogehoge.git (push)

見事参照先にtaroさんのリポジトリが追加されました。
ここで注意して欲しいことが、この時点ではまだ参照先を追加しただけで、実際に参照はしていません。
(シムリンク貼っただけで実際のファイル内容はまだ見てないみたいな)
なので、この参照先からfetchコマンドでデータを取得します。

データの取得
#git fetch ${user名}
$ git fetch taro

$ git branch -a
* master                      3f8775f Update Version
  remotes/taro/develop        6b7fcfc bug fix
  remotes/master/master       9b41a3c Update version
  remotes/origin/HEAD         -> origin/master
  remotes/origin/master       32fc118 Update version

これで参照先から情報の取得が出来ました。
次はいよいよmergeです。

merge
#git merge --no-ff ${fetchで追加されたブランチ名}
$ git merge --no-ff remotes/taro/develop

これでmergeの完了です。

--no-ffオプション

ちなみにこの--no-ffオプションですが、fast forwardというオプションを外す設定になります。

fast forward
  • mergeする時に片方が全く更新されてなかった場合、めんどいからブランチまとめちゃおーぜって機能です。
  • 新しいコミットは作成されずに指し示す位置が統一されるだけ(枝分かれ状態が解除され、一本に戻る)


Gitのデフォルトの設定なのですが、ネットワークグラフもまとめられて逆に見にくくなるので、基本的に私はmergeの時は--no-ffをつけることを推奨しています。

--no-ffオプション
  • no fast forward(no-ff)を選択した場合、master側にmergeしたというコミットができて、枝分かれ状態が維持される
  • 枝分かれの状態もmasterの一部となるので、developブランチを削除しても枝分かれ状態は維持される
  • (当然ですが、つけてもつけなくてもmergeされたコードに変更はありません。念の為。。)