見出し画像

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はそれより弱いオプションで、直前のコミットだけをリセットし、作業内容はそのまま残してくれます。

何をやり直したいかに応じて使い分けられれば良いと思います。


ここまでお読みいただきありがとうございました!


参考


この記事が気に入ったらサポートをしてみませんか?