[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されたコードに変更はありません。念の為。。)