syon

A fashion developer. Interested in life engineering.

別リポジトリのコミットをパッチとして当てる (git format-patch & git am)

14 Jan 2019 » Git

やりたいこと

稼働中の現行リポジトリと、リニューアル中のリポジトリが並行稼動しているシーンを想定している。 ビジネスロジックはそのまま引き継ぎ、フレームワークをすげ替えたい。

リニューアル作業は全く別の新しいリポジトリで実施していたが、現行リポジトリの改修も背後で続いていた。 共通であるビジネスロジックの同期をとるために、お互いのリポジトリの変更分をパッチ化し、一連のコミット群を取り込みたい。

実現方法

以下のやり方は コミット日時が維持される。 つまり、コミットは通常通り並ぶが日時が時系列で並ばない。 (Git的にはコミットが過去から未来へキレイに並ばなくてもよい模様)

パッチを作成する

取り込みたい内容がコミットされているリポジトリのブランチで以下を実行。abcd123は開始コミットのSHA-1。-oオプションは出力先ディレクトリ指定。

git format-patch abcd123 -o ~/downloads/patches

コミットごとのパッチファイルが生成される。

  • 0001-message-of-commit.patch
  • 0002-message-of-commit.patch
  • 0003-message-of-commit.patch

パッチを適用する

取り込み先のメインリポジトリで以下を実行。

git am --3way ~/downloads/patches/*.patch

絵文字コミットコメントがうまくいかない場合

GitHub向けにコミットコメントの先頭に絵文字変換されるコロン囲みの記述をしていたところ git am にコマンドのおせっかいによって先頭のコロンが取り除かれてしまった。

:tada: Initial commit
tada: Initial commit

この問題に対応するには、リベースでコメントだけを修正する。abcd456は基点となるコミットのSHA-1で、それより後のコミットが編集対象となる。

git rebase -i abcd456

リベースの取り込みコマンド reword を使ってコメントのみ修正する。 コミットがたくさんあると大変なので Vim のコマンドで置換する。 なお、この画面ではコメントを編集しても意味がないので注意。

:%s/^pick/reword/g

この後、1コミットずつコメント編集画面に切り替わりながら変更作業を繰り返す。 最後まで編集し終わるとリベースが完了する。