概要
複数のgitブランチのマージする際のベストプラクティスの投稿で紹介した他人の修正を消さないためのマージ方法を自動化するgitmumergeというシェルスクリプトを紹介する。
gitmumerge
https://github.com/cocoa-maemae/gitmumerge
cuiのgitクライアントを単純にシェルスクリプトでラップしたものである。普段手動で複数回git mergeする操作を、一回のコマンドでまとめて自動的にマージすることができる。
動作環境
今のところbashのみに対応している。bashが動けばOSは何でも構わない。
cuiのgitクライアントは必須ですのであらかじめインストールしておく。
(debian系)
sudo apt-get install git
(redhat系)
sudo yum install git
gitmumergeのインストール。
git clone https://github.com/cocoa-maemae/gitmumerge ~/.gitmumerge
echo 'export PATH="$HOME/.gitmumerge/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
//バージョン確認
gitmumerge -v
使い方
まずはマージを実行したいgitリポジトリをcloneしてclone先ディレクトリに移動する。
(例)
git clone <対象リポジトリへのパス>
cd <clone先ディレクトリ>
clone先ディレクトリに移動したら先ほどインストールしたgitmumergeの出番。
-d(--destination-branch)の後に開発に使ったブランチをマージする最終ブランチ名を、-c(--candidate-branches)の後に開発に使ったブランチ名を指定する。-cの後はスペース区切りで複数ブランチの指定が可能である。
例えば、Gitのブランチのマージ方法に対する考察で挙げた例、masterブランチに対してdev1,dev2,dev3ブランチをマージしたいときは下記のように指定する。
(例)
gitmumerge -d master -c dev1 dev2 dev3
この例を実行するとmaster->dev1, dev1->master, master->dev2, dev2->master, master->dev3, dev3->masterという順番にマージしてくれる。マージする前に必ず[Y/n]を聞くようにしています。コンフリクトが発生した場合はその時点で強制終了する。
終了メッセージの"Merging branches has done"が出てくれば完了です。あくまでgit client側でマージしているだけなので、リモートリポジトリに反映させるためには、この後-d(--destination-branch)で指定したブランチ(上述の例ではmaster)をpushする必要がある。そこは今のところ手動である。
(例)ローカルリポジトリのmasterにマージしてからpushまでの流れ
また、例ではmasterに対して開発用のdev1,dev2,dev3ブランチをマージしたが、実際の運用でmasterに直接開発ブランチをマージしている人はあまりいないと思う。マージのミスでmasterブランチを破壊してしまう可能性があるためである。masterの前にdevelopmentなどの別のブランチに一度マージする方が安全である。
gitmumergeはcuiのgitクライアントのラッパーでローカルリポジトリのマージを自動化している。リモートリポジトリはGitHub,GitLab,BitBucket,GitBucket, etc... git系のホスティングサービスであれば何でも対応できる。