リモートリポジトリに含めたくないコミット履歴をgit rebaseコマンドで無に帰す方法

概要

こんな方向けの記事です。

  • ローカルでの動作確認時にコミットした情報の中に、リモートリポジトリに含めたくない情報(AWSの認証情報等)が含まれてしまったorz
  • でも、他にも大量の修正をしているからなんとか問題のコミット履歴だけ抹消したい
  • git rebase?使ってみようかな。。。(ビクビクッ)

注意

この検証はリモートにpushをする前の悪あがきですので、一度リモートにpushしてしまった場合は当てはまらないのでご注意ください。

(@Ress さん、ご指摘ありがとうございます!)

手順

前提

以下のようなコミット履歴があるとします。

command
git log --oneline
624d078 鬼のようなリファクタリング #実装④ リファクタリング時にAWS認証キーは削除
59ef873 動作確認用のコミット #実装③ ここでAWS認証キーをコミットしてしまった!!
c0c2354 物凄い実装 #実装②
aebf9c8 凄まじい実装 #実装①

このまま、

command
git push origin issues/XXX

をしてしまうと、Github上で、

screencapture- 2018-01-10 0.05.18.png

対象のコミットを見てみると・・・

screencapture--2018-01-10-0.07.07.png

丸見え!!

パブリックリポジトリでこんなことをする人はいないと思いますが、万が一やってしまうと場合によっては地獄をみることになってしまう可能性があります。。。

参考記事:
初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。

なので、今回はここの部分をリモートリポジトリに残らないようにgit rebaseで歴史改ざんしてみましょう♪

コミットログの確認

まずはローカルリポジトリのコミットログを確認します。

command
git log --oneline
624d078 鬼のようなリファクタリング #1 <- HEAD
59ef873 動作確認用のコミット #2
c0c2354 物凄い実装 #3
aebf9c8 凄まじい実装 #4

今回の事例だと、#1#2をまとめて#2の歴史を無くせばよさそう。

command
git rebase -i HEAD~2 #ヘッドから2コミットをまとめる

そうすると以下のように

screencapture- 2018-01-10 0.24.09.png

エディターが起動するので、

差分
pick 59ef873 動作確認用のコミット
- pick 624d078 鬼のようなリファクタリング
+ squash 624d078 鬼のようなリファクタリング

のように修正してください。

再度コミットメッセージの入力が求められるので、お好きに変えてください(そのままでも良いです)。

正常にrebaseが終わったら再度git log --onelineをすると、

screencapture- 2018-01-10 0.31.14.png

歴 史 改 ざ ん 完 了 ☆

これで再度プッシュすると、

screencapture- 2018-01-10 0.34.18.png

コミットログも消えています。

screencapture- 2018-01-10 0.34.34.png

ファイルとしても、途中でコミットしてしまった認証情報が入っていませんね。
これで一安心!!!

万が一リモートリポジトリにプッシュしてしまった場合

直ちにブランチを削除しましょう!!!

screencapture- 2018-01-10 0.14.16.png

ただし、冒頭でも話しましたが、リモートにpushしてしまった時はブランチを消しても見られる恐れがあるので、なんにせよ認証情報はgit管理化に入れないように日頃からセキュリティの懸念を意識しながら作業するに越したことはありません。

(@Ress さん、ご指摘ありがとうございます!)

終わりに

一般的な業務システムはプライベートリポジトリなりGHEなりを使っていると思うのでひとまずは大丈夫でしょうが、個人開発パブリックリポジトリを使っている方は今一度気をつけましょう!!

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.