git_ローカルでコミットを取り消したくなったらgit resetする #358
ローカル環境でコミットした後に巻き戻す方法をメモしておきます。
以下3つのコマンドを使いこなせば色々できます。
git reflog
git log
git reset (--hard や --soft)
git reflog
ローカルで行ったgitの操作は全てログとして残っていて、それを一覧で確認することができます。上の方が新しい操作で、下に行くほど古い操作になっています。
git reflog
c8588e816 (HEAD -> release/staging, origin/release/staging) HEAD@{0}: reset: moving to origin/release/staging
24233641c (origin/sample_branch, sample_branch) HEAD@{1}: checkout: moving from sample_branch to release/staging
24233641c (origin/sample_branch, sample_branch) HEAD@{2}: checkout: moving from release/staging to sample_branch
24233641c (origin/sample_branch, sample_branch) HEAD@{3}: commit (merge): Merge branch 'master' into release/staging
c8588e816 (HEAD -> release/staging, origin/release/staging) HEAD@{4}: reset: moving to origin/release/staging
736a8838f HEAD@{5}: commit (merge): Merge branch 'master' into release/staging
c8588e816 (HEAD -> release/staging, origin/release/staging) HEAD@{6}: reset: moving to origin/release/staging
d57dc5b88 HEAD@{7}: commit (merge): Merge branch 'master' into release/staging
c8588e816 (HEAD -> release/staging, origin/release/staging) HEAD@{8}: checkout: moving from master to release/staging
checkoutなども履歴として残っているところが驚きでした。
一番左の「c8588e816」等はコミットハッシュ値で、対応するコミットを直接指定できる値です。
真ん中らへんにある「HEAD@{0}」などの値も同様で、対応するコミットを直接指定できます。
git log
コミットの履歴を少し詳細も分かる形で確認できます。こちらも上の方が新しく、下に行くほど古い履歴です。
git log
commit c8588e8160da4375f28e75df8f16d2b54429f7f8 (HEAD -> release/staging, origin/release/staging)
Merge: 6b2356d27 8cd57c07c
Author: XXXXXXXXXXXX
Date: Wed Mar 8 12:19:36 2023 +0900
Merge pull request #2107 from sample_branch
merge comment
commit 8cd57c07c1b2032becc4a9646745640e0592071d
Author: YYYYYYYYYYYYYY
Date: Wed Mar 8 11:24:06 2023 +0900
commit comment
git reflogとの違いは、
git reflogは後述するreset操作も全て一連の履歴として表示するのに対して、
git logはreset操作したコミットは表示されません。
この性質を利用して、resetした後にgit logできちんとコミットが消えているかを確認することができます。
git reset
コミットをresetしてやり直したい時に使えるコマンドです。--hardや--soft以外にもオプションはありますが、この2つを抑えておけばOKです。
git reset (--hard や --soft)
--hardも--softも文法は同じです。
git reset --hard コミットハッシュ値 or HEAD@{xx} or リモートのブランチ名
--hardは最も強いオプションです。直前のコミット、および作業内容を全てリセットし、指定した履歴(コミットやブランチ)と全く同じ状態にまで戻します。
--softはそれより弱いオプションで、直前のコミットだけをリセットし、作業内容はそのまま残してくれます。
何をやり直したいかに応じて使い分けられれば良いと思います。
ここまでお読みいただきありがとうございました!
参考
この記事が気に入ったらサポートをしてみませんか?