あっさりと

ソフトウェアや技術話など諸々

Gitでの一括切り戻し方法

目的

プロダクション環境への適用後に障害が発生した場合に備えて速やかに切り戻しを行える方法を確保したい。
Gitでデプロイ直前の状態に戻す方法の備忘録。

前提

・commit, pushした後に本番デプロイする手順を採用している。
・commit量が多い。(数百コミットとか)
・master が本番環境のブランチ、 featureが追加機能ブランチ
・featureにmasterはマージ済み

今回使用出来なかった解決方法

以下の様にsquashでまとめる方法を採用しようとしたが上手くいかなかった。

$ git checkout feature

$ git rebase master

$ git checkout master

$ git merge --squash feature

数十commitくらいの規模で行ったときは問題無かったが今回は変更量が多すぎるのかrebaseの段階で大量のconflictが発生。。
詳細にcommitログ残したかったらそもそもsquashしない方が良いかも^^;

解決方法

単純に--no-ffで解決可能。

$ git checkout master

$ git merge --no-ff feature

--no-ffオプションでマージしておけば変更内容の一括打ち消しが出来る。
問題が発生して切り戻す時はmasterブランチで以下を実行。

$ git revert -m 1 マージした時のコミットハッシュ

mオプションはmainlineの意味で
1:マージする側(master)に戻る 2:マージされる側(feature)に戻る。

切り戻し内容を再マージしたい時

問題特定出来たら以下コマンドで切り戻し分を再マージしてから修正する。

$ git revert リバートした時のコミットハッシュ