HOWTO · Git
Git のリセット、元に戻す、およびチェックアウト コマンドの違い
Git の checkout、reset、および revert コマンドを区別します。
この記事では、git reset、git revert、および git checkout コマンドの違いについて説明します。 これらは、リポジトリの変更を元に戻すことができる最も便利な Git ユーティリティの一部です。
コマンドを混同するのは簡単ですが、この記事の終わりまでに、上記のコマンドを使用してリポジトリを使用およびナビゲートする自信が得られます。
Git Reset、Git Revert、Git Checkout コマンドの違い
Git リポジトリの 3つの主要コンポーネントに対する各コマンドの効果が明確であれば、これらのコマンドを理解しやすくなります。
- 作業ディレクトリ
- 段階的なスナップショット
- コミット履歴
上記のコンポーネントをThree Treesと呼ぶこともできます。
Git チェックアウト
チェックアウトとはどういう意味ですか?
この操作は、HEAD ポインターを指定されたコミットに再配置します。

上の画像は、Git リポジトリでの一連のコミットを示しています。 HEAD および main ブランチ ポインターは現在、コミット d にあります。
git checkout コマンドを使用して、HEAD 参照を任意のコミットに移動できます。
たとえば、HEAD ref をコミット b に移動するには、次のコマンドを実行します。
$ git checkout -b
git checkout コマンドをコミットおよびファイル レベルで使用できます。 ファイル レベルでチェックアウトすると、指定したコミットの内容でファイルの内容が更新されます。
Git 復帰
元に戻すときは、特定のコミットを取得し、指定されたコミットの効果を元に戻す新しいコミットを作成します。 git revert コミットはコミット レベルでのみ有効であり、ファイル レベルの機能はありません。
Git リセット
リセットするときは、特定のコミットを取得し、Three Trees をリセットして、指定されたコミットでのリポジトリの状態に一致するようにリポジトリを更新します。 three trees に対応する 3つの異なるモードでリセットできます。
通常、git reset と git checkout を使用して、ローカルまたはプライベートの変更を元に戻します。 どちらもリポジトリの履歴を変更し、リモートのパブリックまたは共有リポジトリにプッシュするときに競合を引き起こす可能性があります。
Git リセットと Git Revert と Git チェックアウト
以下の表は、3つのコマンドの一般的な使用例を示しています。
| 指図 | 範囲 | 一般的な使用例 |
|---|---|---|
gitリセット |
コミットレベル | ブランチのコミットをローカルで削除するか、コミットされていない変更を破棄します。 |
gitリセット |
ファイルレベル | インデックスからファイルをアンステージします。 |
git チェックアウト |
コミットレベル | 古いコミットを調べて、ブランチを切り替えます。 |
git チェックアウト |
ファイルレベル | 作業ディレクトリの変更を破棄します。 |
git revert |
コミットレベル | パブリック ブランチでのコミットの効果を逆にします。 |
git revert |
ファイルレベル | (該当なし) |
コミット レベルの操作
git reset および git checkout コマンドにパラメーターを渡して、さまざまなレベルの操作を呼び出します。 file パラメーターを含めなかった場合、コマンドはコミット全体に作用します。
コミットをリセットする
コミット レベルでリセットすると、HEAD ref が指定されたコミットに移動します。 このコマンドを使用して、ブランチからコミットを削除できます。
ここに例があります。
$ git reset HEAD~3
上記のコマンドは、ブランチの先端を 3つのコミット分後方に移動します。 それらをぶら下がっているまたは孤立したコミットと呼ぶことができます。
3つのコミットを破棄しました。 コマンドを使用して、リモート共有リポジトリに公開していないコミットを削除することをお勧めします。
git reset コマンドを使用して、次のフラグのいずれかを渡すことで、ステージングされたスナップショットと作業ディレクトリを変更することもできます。
--soft- ステージングされた変更または作業ディレクトリを変更しません。--mixed- 作業ディレクトリには影響しませんが、指定されたコミットに一致するようにステージングされたスナップショットを変更します。--hard- 作業ディレクトリとステージングされたスナップショットの両方を、指定されたコミットに一致するように変更します。
古いコミットのチェックアウト
git checkout コマンドを使用して、指定したコミットでのリポジトリの状態を調べることができます。 ブランチ名を渡してブランチを切り替えることもできます。
ここに例があります。
$ git checkout feature
上記のコマンドは feature ブランチに切り替わります。 ブランチを移動しません。
ブランチ名の代わりにコミット ハッシュまたは参照を渡すことで、任意のコミットを検査することもできます。 ここに例があります。
$ git checkout HEAD~1
上記のコマンドは、現在のコミットの親をチェックアウトします。 HEAD~2 を渡すと、祖父母がチェックアウトされます。
上記のコマンドは、現在の HEAD にはブランチ参照がないため、切り離された HEAD モードに切り替えます。
デタッチされたHEADモードで行われたすべての変更とコミットは、別のブランチに切り替えると到達できなくなります。 デタッチされたHEAD状態で変更をコミットしたい場合は、常に新しいブランチを作成してください。
共有コミットを元に戻す
コミットを元に戻すと、指定されたコミットの効果を元に戻す新しいコミットが作成されます。 このようにして、共有リポジトリのコミット履歴を書き直すことを回避します。
たとえば、最新のコミットを元に戻したい場合は、次を実行します。
$ git revert HEAD
ファイル レベルの操作
git checkout および git reset コマンドは、オプションのパラメーターとしてファイル パスを受け入れます。 コマンドの効果は、1つのファイルに限定されます。
ファイルをリセットする
以下に示すように、指定されたコミットのバージョンと一致するように、ファイルのステージングされたスナップショットを更新できます。
$ git reset HEAD~1 README.md
上記のコマンドは、現在のコミットの親コミットにある README.md ファイルのバージョンを取得し、次のコミットのインデックスに追加します。 git reset HEAD README.md を実行して、README.md ファイルのステージングを解除できます。
Git チェックアウト ファイル
git checkout コマンドにファイル パスを渡すと、ステージングされたスナップショットではなく作業ディレクトリが更新されます。 これにより、ブランチ間で HEAD ポインタが移動しません。
ここに例があります。
$ git checkout HEAD~1 README.md
これにより、現在のコミットの親コミットから README.md ファイルのバージョンが取得され、作業ディレクトリのみの README.md ファイルが更新されます。 これは単に、古いコミットのファイル バージョンに戻ったことを意味します。
指定されたコミットによって導入された変更を元に戻す git revert コマンドとは異なり、これは後続のすべての変更を破棄します。 以下に示すように、ステージングされていない単一のファイルへの変更を破棄するために使用できます。
$ git checkout HEAD README.md
結論として、コミット履歴、ステージングされたスナップショット、および作業ディレクトリに対する各コマンドの影響を理解することで、git reset、git revert、および git checkout コマンドを簡単に区別できます。