Git でのリセットとリストア
Git には、個々のファイルを処理するコマンドがいくつかありますが、それらは非常にまれです。これらのコマンドは、git add
、git rm
、git mv
、git checkout
、git reset
、git restore
、およびそれぞれの反対です。
ただし、Git は賢いです。フェッチした作業がどこにあるかを記憶しているので、後で次のフェッチマーカーから再びフェッチできます。これは、ローカルで作成したコミットのみを含む Git リポジトリを持つことができることを意味します。同じコミットを別のリポジトリからすでにフェッチしている場合、Git はそれらを再度フェッチすることを回避できます。
ここで、この記事では、Git の 2つの重要なコマンドについて説明します。
git restore
git reset
Git restore
コマンド
Git restore
コマンドは、作業ツリー内のファイルをインデックスまたは別のコミットから復元するために使用されます。このコマンドは、現在のブランチを更新しません。また、別のコミットからインデックス内のファイルを復元することもできます。現在のブランチのコミットとは異なるコミットのコードを使用する場合に非常に便利です。restore
コマンドは、ローカルブランチでコミットされていないローカル変更を破棄するのに役立ちます。
Git restore
は、現在の状況に応じて、作業コピーまたはインデックス、あるいはその両方で作業を元に戻すかどうかに応じて、3つの異なる状況で使用できます。
git restore [--worktree] <file>
上記のコマンドは、作業コピーの <file>
をインデックスファイルの内容とともに上書きします。または、作業コピーの変更を元に戻すと言うこともできます。特に指定しない場合は提案されるので、指定するかどうかは関係ありません。
git restore --staged <file>
上記のコマンドは、インデックスファイルの <file>
をローカルリポジトリの現在の HEAD で上書きします。または、コミットされていない変更が最近ステージングされたコンテンツであると言えます。確かに古い git reset HEAD <file>
と同じであると言えば間違いではありません。
git restore --staged --worktree --source HEAD <file>
上記のように、作業コピーとインデックスの両方を現在の HEAD で上書きするには、上記のコマンドを使用します。このバージョンでは、作業コピーを HEAD に戻すことと、現在のローカルブランチから最近ステージングされた作業をステージングされていないことの両方を実行できます。
Git リセット
コマンド
Git reset
は、ブランチを更新し、チップを移動してブランチにコミットを追加または削除することです。この操作により、コミット履歴が変更されます。Git reset
は、Git の復元と重複して、インデックスを復元するために使用されます。手動編集または gitadd メソッドを使用してファイルが変更された場合、git reset
はそのファイルを適切に処理しません。
ファイルは新しいコミットにコピーされ、古いコミットで削除済みとしてマークされます。ファイルが作業コピーから削除されたように見えるという警告が表示されます。Git リセットも名前変更をうまく処理しません。ファイルを削除して同じ名前のファイルを追加することを意味するのではありませんが、そうします。
reset
コマンドを使用して、作業コピー内のファイルを移動することはできません。ファイルは別のコミットにコピーされるだけではありません。それらは作業コピーから削除され、ターゲットコミットで新しいファイルとして復元されます。ファイルに不要な変更を加えた場合、ファイルを削除する必要はありません。ファイルへのすべての変更を元に戻すことはできますが、ファイル自体を元に戻すことはできません。
git reset
と git restore
の違い
restore
コマンドは、コミットされていないローカル変更をステージング解除または破棄するのに役立ちます。インデックスまたは別のコミットから作業ツリー内のファイルを復元するために使用できます。このコマンドはブランチを更新しません。別のコミットからインデックス内のファイルを復元することも役立ちます。
Git reset
は、現在のブランチを更新するために使用されます。git restore
と交差して、インデックスを復元することも役立ちます。Git reset
は、作業ツリーの変更を破棄するためにインデックスをリセットするために使用されます。このコマンドはブランチを更新しません。これは主に --soft
オプションとともに使用されます。このオプションは、インデックスをリセットし、作業ツリーを変更しないままにします。破棄したくない変更をステージングした場合に役立ちます。
作業ディレクトリがクリーンな場合(変更をコミットしない場合)、Git reset
は正常に完了しますが、作業ディレクトリがクリーンな場合、git restore
は失敗します。どちらも HEAD に影響を与える可能性があります。ただし、Git の restore
は、ステージング領域を介して間接的に HEAD にのみ影響します。Git reset
は、インデックスと HEAD を直接操作できます。どちらも HEAD に影響を与える可能性があります。Git restore
は、ステージング領域を介して間接的にインデックスと HEAD にのみ影響します。
Git reset
は、まだ何もプッシュしていない場合にのみ、ローカルリポジトリを変更するために使用できます。リモートサーバーにプッシュした場合、git-reset はステージング領域と作業コピーを変更しますが、リポジトリは変更しません。ローカルの変更を元に戻したいが、それらを再度導入したくない場合に便利です。
Git restore
は、ステージング領域やローカル作業コピーではなく、リポジトリの変更にのみ使用できるため、反対です。プッシュしたコミットには影響しません。
Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.
LinkedIn関連記事 - Git Reset
- Git RM -- キャッシュと Git リセット ファイルの違い
- Git のリセット、元に戻す、およびチェックアウト コマンドの違い
- ローカル Git の変更を削除するために使用されるさまざまな方法
- 開発ブランチをマスター ブランチと同一にする
- 競合のある Git マージを元に戻す
- Git の変更を元に戻す