🔖

git reset の動作について

2024/01/01に公開

コミットを削除する(取り消す)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_4commit_id_3で行った変更点を取り消す内容でコミットされている!

Discussion