2021-04-02追記
自身の理解不足で誤解を招きやすい記事になってしまっていたため、内容を一部訂正しました。
概要
最近、個人開発でGit hubへPushを行なった後にミスが発覚し、どうしていいかわからず混乱する一幕がありました。自分への戒め 兼 今後万が一起きてしまった時の備忘録として残します。
結論
ローカル環境でrevertコマンドを使用し、変更内容をリモートへ反映する
#取り消したいCommit識別番号を確認(以下のabcde...の部分)
$git log
commit abcdefghijklmnopqrstuvwxy
Author: 有吉 貴紀 <>
Date: Wed Mar 31 12:20:05 2021 +0900
#取り消したいCommitをrevertする
$git revert <Commit識別番号(abcde...)>
#変更内容をリモート環境へpushする
$git push
git revert コマンドとは
既存のCommit履歴を取り消すためのコマンド。
私のような個人の失敗だけでなく、特定のCommitが原因で不具合が出てしまった場合の修正手段として使われるコマンドです。
Commitを取り消したという事実や変更内容を記録するため、リモートにpushしたCommitに対しても安全に使うことができます。
指定した識別番号のCommitが取消対象となり、その前後にあるCommitには影響が出ません。
複数取り消したい場合はそれぞれに対して処理を行う必要があります。
また、「既存のコミットを元に戻す」という点について、同じような機能を持つコマンドにresetがあります。
resetコマンドは、指定したCommitまで巻き戻し、過去の作業内容をなかったことにする処理です。
「Commitを取り消した」という事実や変更内容が残らないため、リモートにpush済みで公開されているCommitに使ってはいけません。理由として、他の開発者が公開されたCommitからブランチを切って開発を進めている可能性があるからです。そこでresetを実行してしまうとpush不能になってしまうため、共同開発の場合は基本的にrevertを使いましょう。
また、revertを使う上で重要なポイントがもう一点あります。
それは、機密性の高い情報(個人情報やセキュリティデータ等)を誤ってpushした場合に使用すべきでないということです。
上で説明した通り、revertはファイルの変更内容をCommitし直す性質を持っているため、すぐ気づいてリモート環境からファイルを削除しても、Commit履歴からファイルの中身を確認出来てしまいます。
それでは実例を見てみましょう。
環境変数.envファイルを作成し『ログインパスワード』を書き込んで保存
$vi .env
$cat .env
ログインパスワード
.envをpushし、リモート環境に上げてからやらかしに気づく...
$git add .env
$git commit -m "うっかりミス"
$git push
最初に書いた通り、"うっかりミス"Commitをrevert、pushする
$git revert Commit識別番号(abcde...)
(コメント編集のためviが開かれますが i→:wqで閉じる)
Revert "うっかりミス"
1 file changed, 1 deletion(-)
delete mode 100644 .env
$git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.![e035b4af6f7200bccbc417c327e2f165.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746705/55cc3a74-f45b-9943-4fdb-ffcd6f5b3351.png)
Writing objects: 100% (2/2), 267 bytes | 267.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
リモート環境上はファイルが削除されていますが
$git log -p -1 (-pは差分表示 -1は出力するログの件数を指定)
diff --git a/.env b/.env
deleted file mode 100644
index 2da2f36..0000000
--- a/.env
+++ /dev/null
@@ -1 +0,0 @@
-ログインパスワード
logでは差分として表示されてしまい、ここから情報漏洩する可能性も...
revertでのCommit取消はCommitが再度記録されるため、機密性の高い情報(個人情報やセキュリティデータ等)を上げてしまった場合、完全に取り消せないことがわかりました。
じゃあどうするの?という点については、まだまだ学習不足で正確なことがわかっていないため省きます。今後の学習でわかり次第追記していきます。
最後に
revert,resetどちらにも言えることは、開発上あまり好ましくない行為だということ。
開発メンバーやユーザーに多大なる迷惑をかけてしまわないよう
①branch、プルリクでの確認というフローを常に意識すること
②branchをリモートへpushする前の確認を徹底すること
以上2点を行なっていきます。