Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

Git小技:実例で見る、別ブランチの差分をrebaseやmerge以外で取り込む方法

ブランチを切ってから時間が経過し、大本のmasterないしdevelopブランチのコミット内容を取り込みたい時のお役立ちメモ。

使えるシーン

fast-forwardでの取り込みはこんな時に便利です。

  • 緊急リリースなどで、git-flowのお約束であるdevelopブランチを経由せずに
    masterにマージされてしまったものを、developブランチに取り込みたい
  • GitHubでフォークしてから時間が経ち、フォーク元の更新をまるっと取り込みたい

手順

作業スペースにて、リモートをoriginではなく、upstreamとして登録します。

$ git remote add upstream <リポジトリのURL>

リポジトリとブランチ名を指定して取り込みます。

$ git pull upstream master

実例

fork元のmasterブランチを、手元にあるforkリポジトリのmasterブランチに取り込みます。
大分前にforkしたmroongaのリポジトリが手元にあるので、それを使います。
それでは、ステップを追って説明します。

リモートリポジトリの登録を行う

リポジトリのディレクトリにて、git remote add upstream <repo-url>を実行します。

$ git remote add upstream https://github.com/mroonga/mroonga.git

リモートリポジトリの登録内容を確認する

リモートリポジトリを認識させる事が出来ました。

$ git remote show upstream
* remote upstream
  Fetch URL: https://github.com/mroonga/mroonga.git
  Push  URL: https://github.com/mroonga/mroonga.git
  HEAD branch: master
  Remote branch:
    master new (next fetch will store in remotes/upstream)
  Local ref configured for 'git push':
    master pushes to master (local out of date)

リモートリポジトリとの差分を取り込む

fast-forwardで差分を取り込みます。

$ git pull upstream master
remote: Counting objects: 123, done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 86 (delta 48), reused 58 (delta 21)
Unpacking objects: 100% (86/86), done.
From https://github.com/mroonga/mroonga
 * branch            master     -> FETCH_HEAD
Updating c18d77f..fd164eb
Fast-forward
 .gitignore                                                                                        |    1 +
 doc/files.am                                                                                      |    4 +
 doc/locale/en/LC_MESSAGES/reference.po                                                            | 1340 +++++++++++++++++++++++++---------------------
 doc/locale/ja/LC_MESSAGES/reference.po                                                            | 1395 ++++++++++++++++++++++++++----------------------
 doc/source/reference.rst                                                                          |    1 +
 doc/source/reference/troubleshooting.rst                                                          |   42 ++
 ha_mroonga.cpp                                                                                    |  176 ++++--
 ha_mroonga.hpp                                                                                    |    4 +
 plugin_version                                                                                    |    2 +-
 test/sql/suite/mroonga/storage/column/date/r/zero_date.result                                     |   27 +
 test/sql/suite/mroonga/storage/column/date/t/zero_date.test                                       |   38 ++
 test/sql/suite/mroonga/storage/column/datetime/r/zero_date.result                                 |   27 +
 test/sql/suite/mroonga/storage/column/datetime/t/zero_date.test                                   |   38 ++
 .../sql/suite/mroonga/storage/fulltext/boolean_mode/pragma/weight/r/three_or_more_sections.result |   21 +
 test/sql/suite/mroonga/storage/fulltext/boolean_mode/pragma/weight/t/three_or_more_sections.test  |   44 ++
 version                                                                                           |    2 +-
 version_in_hex                                                                                    |    2 +-
 version_micro                                                                                     |    2 +-
 18 files changed, 1864 insertions(+), 1302 deletions(-)
 create mode 100644 doc/source/reference/troubleshooting.rst
 create mode 100644 test/sql/suite/mroonga/storage/column/date/r/zero_date.result
 create mode 100644 test/sql/suite/mroonga/storage/column/date/t/zero_date.test
 create mode 100644 test/sql/suite/mroonga/storage/column/datetime/r/zero_date.result
 create mode 100644 test/sql/suite/mroonga/storage/column/datetime/t/zero_date.test
 create mode 100644 test/sql/suite/mroonga/storage/fulltext/boolean_mode/pragma/weight/r/three_or_more_sections.result
 create mode 100644 test/sql/suite/mroonga/storage/fulltext/boolean_mode/pragma/weight/t/three_or_more_sections.test

自分のリポジトリへpush

リモートへpushしても、rejectedとはなりません。

$ git push origin master
Counting objects: 123, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (79/79), done.
Writing objects: 100% (86/86), 27.31 KiB, done.
Total 86 (delta 51), reused 1 (delta 0)
To git@github.com:y-ken/mroonga.git
   c18d77f..fd164eb  master -> master

簡単ですね!

参考記事

GitHubでプルリクエスト用ブランチを保守するメモ
http://tanakahisateru.hatenablog.jp/entry/20120208/1328632127