Git を使っていると間違って Git push してしまうことはよくあります。
そんなときは git push を取り消す作業をするのですが、やり方が2つあります。
【 方法2 】取り消しコミットを作成する(git revert)
今回は Git でやらかしたときの対処法についてエントリーします。
Gitでやらかしたときの対処法
【 方法1 】pushしたコミットを削除する(git reset)
作業の流れとしては以下になります。
1)ブランチの先頭(HEAD)を戻す
2)置き換えたブランチを強制的にpush
1)ブランチの先頭(HEAD)を戻す
「git reset」コマンドを実行します。
# 直前のコミットを取り消し
git reset --hard HEAD^
# 該当するコミットを取り消し
$ git reset --hard [ コミットID ]
- --hard : 全て(HEAD(ブランチの先頭)、インデックス、作業ツリー)を元に戻す
- --mixed : commitとaddの取り消し。(=HEADとインデックスを元に戻す)
- --soft : commitのみ取り消し。(=HEADを元に戻す)
- HEAD^ : 1つ前のコミットの状態
2)置き換えたブランチを強制的にプッシュ
この書き換えたブランチをそのままプッシュすると、エラーが出ます。
リモートより歴史が短いブランチをプッシュしようとしているためです。(コンフリクト)
なので、強制的にプッシュさせるオプション「-f 」を付けプッシュします。
git push -f
これでOKです。
【 方法2 】取り消しコミットを作成する(git revert)
取り消しコミットを作成し、それをコミットして元の状態に戻すやり方です。
「git reset」より安全なやり方で、ログは全部残ります。
作業の流れとしては以下になります。
1)HEADでの変更を打ち消すコミットを作成
2)プッシュ(-f オプションは不要)
1)HEADでの変更を打ち消すコミットを作成
# 直前のコミットを打ち消すコミット
git revert HEAD
# 特定のコミットを元に戻す
$git revert [ commit ID ]
上記のコマンドを実行すると「過去のコミットを打ち消す」という新しいコミットが追加されます。
あとは、push するだけ。
2)プッシュ(-f オプションは不要)
「git reset」と違ってそのままプッシュしても問題ありません。
git push
これでOKです。
「git revert」は過去の歴史を書き換えない、安全な取り消し方法です。
しかしその反面、どうしても不用意なコミットが増えて、履歴が見にくくなってしまうのが難点です。
一人開発においては 「git reset」 で取り消してしまったほうが分かりやすかったりします。
チュートリアル
「git revert」を使って一つ前の状態に戻します。
ユースケース
間違ったデータをコミットデプロイしてしまった!
「ローカル環境でPUSH済み」+「プルリクエストでマージ済み」+「デプロイ環境でプル済み」
この状態で元に戻す作業をします。
例えばこんな感じで作業をしたとします。
1)間違った作業をする
「develop」ブランチで間違った作業をします。
Route::get('howdy/', function() { return 'Howdy! this is correct.'; });
これを以下のように書きかえます。
Route::get('howdy/', function() { return 'Howdy! Oops! make a mistake.'; });
2)コミット → プッシュ
変更のあったファイルすべてをコミット
※ワーキングツリーからコミットします
コミットにメッセージを添えます
このあと、「git push」コマンドを実行
3)プルリクエストでマージ
develop → master にマージ
4)デプロイ環境でプル
デプロイ環境で「git pull」を実行。
ログを確認
ブラウザにアクセス
本当はこのぐらい簡単なソースだとローカルで修正してコミットすればいいですよね。
ただ、今回は修正内容が複雑ですぐに戻したいケースを想定してrevertコマンドを使ってもとに戻してみます。
手順
1)「git revert」コマンド
2)プルリクエストでマージ
3)デプロイ環境でプル
4)動作確認
1)「git revert」コマンド
「develop」ブランチにチェックアウトし、直前のコミットを取り消します。
上記のコマンドを実行するとVimが起動します。
「git revert」コマンドは前回の打消しコミットが作成されそのままコミットされます。
「:wq」で保存するとそのままコミットされます。ためしにログを確認してます。
打ち消されたコミットがコミットされました。
そのまま「develop」ブランチ上でプッシュします。
2)プルリクエストでマージ
「develop」ブランチで打ち消したコミットを「master」ブランチにマージします。
3)デプロイ環境でプル
デプロイ環境(さくらレンタルサーバー)にSSHターミナルソフトを使ってアクセス。
「master」リモートリポジトリをダウンロード(git pull)します。
ログを確認してみます。
5)動作確認
ブラウザにアクセスして元に戻っているか確認
以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。