やりたいこと
稼働中の現行リポジトリと、リニューアル中のリポジトリが並行稼動しているシーンを想定している。 ビジネスロジックはそのまま引き継ぎ、フレームワークをすげ替えたい。
リニューアル作業は全く別の新しいリポジトリで実施していたが、現行リポジトリの改修も背後で続いていた。 共通であるビジネスロジックの同期をとるために、お互いのリポジトリの変更分をパッチ化し、一連のコミット群を取り込みたい。
実現方法
以下のやり方は コミット日時が維持される。 つまり、コミットは通常通り並ぶが日時が時系列で並ばない。 (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コミットずつコメント編集画面に切り替わりながら変更作業を繰り返す。 最後まで編集し終わるとリベースが完了する。