git resetでコミットを取り消す方法
【開発環境】
OS:Win11(64ビット)
git version 2.37.3.windows.1
VSCode1.72.2
【git resetとは】
git resetは現在のブランチの最新のコミットから、指定したコミットの上までをごっそり削除するコマンド。すなわち、指定したコミットまでコミット履歴を遡るということです。
【Git のシステムのおさらい】
・初期状態
・ワーキングツリー(作業ディレクトリ)にあるファイルを更新する
・addを実行し、インデックス(コミットするためのファイルの状態)に移動させる
・commitを実行し、ローカルリポジトリに移動させる
・最後はpushで、Githubのリモートリポジットへ移動させるが、git resetは、push前の状態でしか使うことだできない!
【git resetのオプション】
1.直前のコミットを取り消したい(コミットのみ取り消し)
git reset --soft HEAD^
HEAD^:直前のコミットを意味する。
HEAD~{n} :n個前のコミットを意味する。
--softなので、インデックス・ワーキングツリーはそのまま
2.直前のコミットを取り消したい(マルっと消したい)
git reset --hard HEAD^
--hardなので、「インデックス・ワーキングツリー」も1つ前のコミットの状態に戻る。
3.コミット後の変更を全部消したい
git reset --hard HEAD
--hardなので、「HEADの位置・インデックス・ワーキングツリー」を全てHEADの位置に動かす。
HEADの位置はそのまま。
「インデックス・ワーキングツリー」の変更が消せる。
4.addを取り消したい
git reset --mixed HEAD
または
git reset HEAD
--mixed(or オプション無し)なので、「HEADの位置・インデックス」をHEADの位置に動かす
従って、インデックスの変更(addした内容)のみ元に戻す。
5.間違えてgit resetしちゃったら・・・
git reset --hard ORIG_HEAD
直前のリセットを取り消したいなら
【サンプル】
1.新たにフォルダー「reset_test」を作り、リポジットする
PS D:\Git\reset_test> git init
Initialized empty Git repository in D:/Git/reset_test/.git/
2、「R_test.txt」ファイルをインデックスに加える
PS D:\Git\reset_test> git add .
3.コミットして、headに移す
PS D:\Git\reset_test> git commit -m 'first commit'
[main (root-commit) e61b146] first commit
1 file changed, 1 insertion(+)
create mode 100644 R_test.txt
PS D:\Git\reset_test>
PS D:\Git\reset_test> git log
commit e61b146e0dc76488dbd11a11d177baf06c5ffc12 (HEAD -> main)
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 11:19:14 2022 +0900
first commit
・2つ目のファイル「R_test2.txt」を作る
PS D:\Git\reset_test> git add .
PS D:\Git\reset_test> git commit -m 'second commit'
[main 39c36b8] second commit
1 file changed, 1 insertion(+)
create mode 100644 R_test2.txt
PS D:\Git\reset_test> git log
commit 39c36b87463c9a26b509defb3fad40f74c569c6b (HEAD -> main)
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 15:17:15 2022 +0900
second commit
commit e61b146e0dc76488dbd11a11d177baf06c5ffc12
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 11:19:14 2022 +0900
first commit
・三番目のファイル「R_test3.txt」を作る
PS D:\Git\reset_test> git add .
PS D:\Git\reset_test> git commit -m 'third commit'
[main 25a076c] third commit
1 file changed, 1 insertion(+)
create mode 100644 R_test3.txt
PS D:\Git\reset_test>
PS D:\Git\reset_test> git log
commit 39c36b87463c9a26b509defb3fad40f74c569c6b (HEAD -> main)
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 15:17:15 2022 +0900
second commit
commit e61b146e0dc76488dbd11a11d177baf06c5ffc12
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 11:19:14 2022 +0900
first commit
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 16:08:39 2022 +0900
third commit
commit 39c36b87463c9a26b509defb3fad40f74c569c6b
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 15:17:15 2022 +0900
second commit
commit e61b146e0dc76488dbd11a11d177baf06c5ffc12
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 11:19:14 2022 +0900
first commit
■三番目のファイル「R_test3.txt」を元に戻す
1.--hard HEAD^の場合
PS D:\Git\reset_test> git reset --hard HEAD^
HEAD is now at 39c36b8 second commit
PS D:\Git\reset_test>
2.--soft HEAD^の場合
PS D:\Git\reset_test> git reset --soft HEAD^
PS D:\Git\reset_test> git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: R_test2.txt
コミットの前目で戻る
VSCodeで同じことをやってみる
ます、R_test2.txtを「変更」で、コミットする。
R_test1.txtのsoftを押す
同じ様になる