gitコマンドの使い方 ~ git reset ~

git reset コマンド概要

git resetは以下の3つの処理を行うもので、指定するオプション(soft/mixed/hard)によって処理される内容が変わります。

処理内容softmixedhard
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

Gitコマンドの使い方一覧

Git設定git config ~Gitリポジトリの設定~
初期化git init ~ローカルリポジトリの構築~
ログ&設定値確認git log ~commitログの履歴確認~
git status ~作業ディレクトリとステージングエリアの更新状態確認~
git diff ~commitやファイルの差分確認~
git show ~commitの内容確認~
git remote ~リモート追跡ブランチのリモートリポジトリの設定確認~
git reflog ~HEADやブランチの移動履歴の確認と整理~
ステージングエリアの操作git add ~ステージングエリア(インデックス)にファイル追加~
git ls-files ~ステージングエリア(インデックス)のファイル一覧表示~
git rm ~ステージングエリア(インデックス)のファイル削除~
ローカルリポジトリの操作git commit ~blobやtreeなどをまとめたcommitを作成~
git merge ~指定したブランチの内容を取り込み新しいcommitを作成~
git rebase ~commitの履歴の整理~
git cherry-pic ~特定のcommitの変更内容だけを取り込む~
git cat-file ~リポジトリのオブジェクト(commit,tree,blob)の内容表示~
git revert ~指定したcommitを取り消すcommitを作成~
commitのエイリアスなどgit branch ~commitツリーの枝(ブランチ)を作成~
git tag ~リリースなどのタイミングで特定のcommitに名前を付ける~
git stash ~commitを作成する前の変更内容を一時保存~
commitの内容をステージングエリアや作業ディレクトリに反映git checkout ~commitをステージングエリアと作業ディレクトリに展開~
git reset ~HEADの位置やステージングエリアと作業ディレクトリの内容を変更~
リモートリポジトリとのやり取りgit clone ~リモートリポジトリからローカルリポジトリ作成~
git fetch ~リモートリポジトリのブランチをローカルリポジトリに反映~
git pull ~git fetchとgit mergeを同時に行う~
git push ~ローカルリポジトリのブランチをリモートリポジトリに反映~