gitコマンドの使い方 ~ git reset ~
git reset コマンド概要
git resetは以下の3つの処理を行うもので、指定するオプション(soft/mixed/hard)によって処理される内容が変わります。
処理内容 | soft | mixed | hard |
---|---|---|---|
HEADの位置を変更 | ○ | ○ | ○ |
staging-area(ステージングエリア)の内容を変更 | ○ | ○ | |
working-directory(作業ディレクトリ)の内容を変更 | ○ |
–soft オプション
git reset --soft [commit-hash]
–softオプションが指定された場合は、HEADの位置が指定されたcommit-hashに変更されます。
commit-hashの指定方法については、色々とありますが次のいずれかで指定します。
- commit-hashを指定
- branchを指定
- HEADからの相対値を指定
HEADの1つ前のcommitを示す場合「HEAD^」と指定することができます。
また同様に2つ前の場合は「HEAD^^」と指定します。
そのほか、git reflogの結果で表示される「HEAD@{3}」のような指定方法もあります。
以下の例は、1つ前のcommitにHEADを変更した後に、元のcommitにHEADを戻しています。
(master)
$ git log --oneline
275da37 (HEAD -> master) commit-C
03d078e commit-B
5dad790 commit-A
(master)
$ git reset HEAD^
(master)
$ git log --oneline
03d078e (HEAD -> master) commit-B
5dad790 commit-A
(master)
$ git reset 275da37
(master)
$ git log --oneline
275da37 (HEAD -> master) commit-C
03d078e commit-B
5dad790 commit-A
–mixedオプション
git reset --mixed [commit-hash]
–mixedオプションが指定された場合は、HEADの位置が指定されたcommit-hashに変更されます。
また、staging-area(ステージングエリア)の内容も指定したcommitの内容に変更されます。
–mixedオプションはgit resetのデフォルトオプションですので、オプションを指定しない場合は–mixedを指定した場合と同じ動作になります。
commit-hashの指定方法については–softの場合と同じです。
以下の例は、1つ前のcommitにHEADを変更した後に、元のcommitにHEADを戻しています。
staging-area(ステージングエリア)の内容が変更されていることに注目して下さい。
(master)
$ git ls-files
file-A.txt
file-B.txt
file-C.txt
(master)
$ git log --oneline
275da37 (HEAD -> master) commit-C
03d078e commit-B
5dad790 commit-A
(master)
$ git reset HEAD^
(master)
$ git ls-files
file-A.txt
file-B.txt
(master)
$ git log --oneline
03d078e (HEAD -> master) commit-B
5dad790 commit-A
(master)
$ git reset 275da37
(master)
$ git ls-files
file-A.txt
file-B.txt
file-C.txt
(master)
$ git log --oneline
275da37 (HEAD -> master) commit-C
03d078e commit-B
5dad790 commit-A
–hardオプション
git reset --hard [commit-hash]
–hardオプションが指定された場合は、HEADの位置が指定されたcommit-hashに変更されます。
また、staging-area(ステージングエリア)とworking-directory(作業ディレクトリ)の内容も指定したcommitの内容に変更されます。
commit-hashの指定方法については–softの場合と同じです。
以下の例は、1つ前のcommitにHEADを変更した後に、元のcommitにHEADを戻しています。
staging-area(ステージングエリア)とworking-directory(作業ディレクトリ)の内容が変更されていることに注目して下さい。
(master)
$ git ls-files
file-A.txt
file-B.txt
file-C.txt
(master)
$ ls
file-A.txt file-B.txt file-C.txt
(master)
$ git log --oneline
275da37 (HEAD -> master) commit-C
03d078e commit-B
5dad790 commit-A
(master)
$ git reset --hard HEAD^
HEAD is now at 03d078e commit-B
(master)
$ git ls-files
file-A.txt
file-B.txt
(master)
$ ls
file-A.txt file-B.txt
(master)
$ git log --oneline
03d078e (HEAD -> master) commit-B
5dad790 commit-A
(master)
$ git reset --hard 275da37
HEAD is now at 275da37 commit-C
(master)
$ git ls-files
file-A.txt
file-B.txt
file-C.txt
(master)
$ ls
file-A.txt file-B.txt file-C.txt
(master)
$ git log --oneline
275da37 (HEAD -> master) commit-C
03d078e commit-B
5dad790 commit-A
git reset の全てのオプションを確認する方法
以下のコマンドを実行するとブラウザでgit resetのヘルプページが表示される
git reset --help