git reset コマンド
現在のHEADを指定した状態にリセットします。
概要
git resetは、HEADと現在のブランチを別のコミットに移動させることで変更を元に戻すために使用されます。また、ステージングエリア(インデックス)を変更し、オプションで作業ディレクトリも変更できるため、コミットの取り消し、ファイルのアンステージ、または変更の完全な破棄が可能です。
オプション
--soft
HEADを指定したコミットにリセットしますが、ステージングエリアと作業ディレクトリは変更しません。
$ git reset --soft HEAD~1
--mixed
デフォルトモード。HEADとステージングエリアをリセットしますが、作業ディレクトリは変更しません。
$ git reset HEAD~1
--hard
HEAD、ステージングエリア、作業ディレクトリを指定したコミットに一致するようにリセットします。
$ git reset --hard HEAD~1
-p, --patch
リセットする変更の塊を対話的に選択します。
$ git reset -p
<commit>
リセット先のコミット。コミットハッシュ、ブランチ名、タグ、または相対参照が使用できます。
$ git reset abc123f
使用例
ファイルのアンステージ
$ git add file.txt
$ git reset file.txt
Unstaged changes after reset:
M file.txt
最後のコミットを取り消すが、変更はステージングされたままにする
$ git reset --soft HEAD~1
最後の3つのコミットを完全に破棄する
$ git reset --hard HEAD~3
HEAD is now at 1a2b3c4 Previous commit message
特定のコミットにリセットする
$ git reset --mixed 1a2b3c4
Unstaged changes after reset:
M file1.txt
M file2.txt
ヒント:
コミットの修正には --soft を使用する
最後のコミットにさらに変更を追加したり、コミットメッセージを変更したりしたい場合は、git reset --soft HEAD~1を使用してコミットを取り消しつつ、すべての変更をステージングされたままにします。
ハードリセットからの復旧
誤って--hardでリセットした場合、git reflogを使用してリセット元のコミットを見つけ、そのコミットハッシュにgit reset --hardすることで復旧できることが多いです。
3つのリセットモードを理解する
3つのリセットモードは影響レベルとして考えてください:
--soft:HEADのみを移動(最も安全)--mixed:HEADを移動し、ステージングエリアを更新--hard:HEAD、ステージングエリア、作業ディレクトリを更新(最も破壊的)
ブランチの切り替えには git reset ではなく git checkout を使用する
別のブランチに切り替える場合は、git resetよりもgit switchまたはgit checkoutを使用してください。リセットを使用してブランチを切り替えると、予期しない結果になる可能性があります。
よくある質問
Q1. git resetとgit revertの違いは何ですか?
A. git resetはHEADを以前のコミットに移動させて履歴を変更しますが、git revertは以前のコミットの変更を元に戻す新しいコミットを作成し、履歴を保持します。
Q2. git reset --hardを元に戻すにはどうすればよいですか?
A. git reflogを使用してリセット前のコミットハッシュを見つけ、git reset --hard <commit-hash>を使用してその状態に戻ります。
Q3. すべてのファイルをアンステージするにはどうすればよいですか?
A. 引数なしでgit resetを使用すると、すべてのファイルがアンステージされます。
Q4. 特定のファイルだけをリセットできますか?
A. はい、git reset <filename>を使用して特定のファイルをアンステージしたり、git reset -pを使用してアンステージするファイルの一部を対話的に選択したりできます。
参考資料
https://git-scm.com/docs/git-reset
改訂履歴
- 2025/05/05 初版