Git のリセット、元に戻す、およびチェックアウト コマンドの違い
- Git Reset、Git Revert、Git Checkout コマンドの違い
- Git リセットと Git Revert と Git チェックアウト
- コミット レベルの操作
- ファイル レベルの操作
この記事では、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
コマンドを簡単に区別できます。
John is a Git and PowerShell geek. He uses his expertise in the version control system to help businesses manage their source code. According to him, Shell scripting is the number one choice for automating the management of systems.
LinkedIn関連記事 - Git Revert
- Git リバート コミット ローカル
- Git リポジトリを以前のコミットに戻す
- Git でマージコミットを元に戻す
- Git でローカルの変更を以前の状態に戻す
- Git のリポジトリで以前のコミットに戻す