git reset の動作について
コミットを削除する(取り消す)git resetの使い方と動作原理
使い方
削除したいコミットの一つ手前のコミットハッシュを指定してgit reset --hard [コミットハッシュ]
を実行することで、そのコミット以降のコミットを削除することができる。
例えば、最新のコミットcommit_id_4
を取り消す場合、取り消すコミットの1つ前のコミットIDを指定する。
git reset --hard commit_id_3
原理
コマンドを実行するとHEADポインタとブランチポインタが一緒に指定したコミットに移動。
(git checkout [コミットハッシュ]
の場合、HEADポインタだけが移動し、ブランチは動かない)
HEADとブランチポインタが同時に移動するとブランチの履歴が変更され、移動したコミット以降のコミットへのアクセスができなくなる。これによりコミットは孤立し、時間経過で削除される(ガベージコレクション)。
コマンド実行後
各ポインタの役割
HEADポインタ
現在チェックアウトされているコミットを指し示すもの。作業中のコミットを指す。
ブランチポインタ
特定のブランチ(mainとかdevelopなど)の最新のコミットを指し示し、ブランチの履歴を表す。
まとめ
git reset
は不要なコミットを削除できるが、「削除した」という履歴すら残らないため危険!
個人開発ならgit reset
でもよさそうだけど、チームでの開発となるとgit revert
のほうが安全な気がしました😊
git revert
は特定のコミットで行った変更を取り消すための新しいコミットを追加する
おまけ git revert使い方
HEADが指す最新のコミットの変更を取り消す場合git revert HEAD
コマンド実行前
コマンド実行後
commit_id_4
はcommit_id_3
で行った変更点を取り消す内容でコミットされている!
Discussion