驚いたことに、3種類の
git reset
について明確に書かれた投稿がハブラ全体に1つもありません。 たとえば、クエリ「git reset」の
2番目に関連性の高い記事では、著者は「このアクションには、ソフト(ソフトリセット)とハード(ハードリセット)の2種類があります」と書いています。 デフォルトで使用される
--mixed
モードは、何らかの理由で言及する
--mixed
がありませんでした。
このチームの仕事に対する誤解をしばしば目にすることは驚くことではありません。 カットの下で、残ってはならない曖昧さのトピックを読んだ後、3つの
git reset
モードすべてについて簡潔かつ明確に説明します。
リポジトリに加えられた変更は、デフォルトではステージングされていません。 それらをコミットするには、まず
git add
実行してインデックスに変更を追加する必要があります。
git commit
を実行すると、インデックスにあったもののみがリポジトリにコミットされます。
git reset --soft
ブランチを例に取ります:
- A - B - C (master)
HEADは
Cを指し、インデックスは
Cと一致します
。やった後
git reset --soft B
HEADは
Bを指し、コミット
Cからの変更は、
git add
コマンドで追加したかのようにインデックスに反映されます。
git commit
を実行すると、
Cと完全に同一のコミットを受け取ります
。git reset --mixed(デフォルト)
--mixed
デフォルトで
--mixed
モード
--mixed
使用されます。
git reset --mixed = git reset
同じ初期条件に戻りましょう。
- A - B - C (master)
完了することにより
git reset --mixed B
または
git reset B
HEADは再び
Bを指しますが、今回は
Cからの変更はインデックスに含まれません。ここで
git commit
を実行すると、何も起こりません。 インデックスには何もありません。
Cからのすべての変更がありますが、
git status
を実行すると、すべての変更がステージングされていないことがわかります。 それらをコミットするには、最初に
git add
コマンドでインデックスに追加し、次に
git commit
を追加する必要があります。
git reset --hard
同じ初期条件:
- A - B - C (master)
--hard
ような最後の
--hard
モードは、
HEADを
Bに移動してインデックスをクリアしますが、--
--mixed
とは異なり
--mixed
ハードリセット
は作業ディレクトリ内のファイルを変更します 。 実行する場合
git reset --hard B
Cからの変更とコミットされていない変更は削除され、リポジトリ内のファイルは
Bと一致します
。 このモードは変更が失われることを意味するため、ハードリセットを実行する前に、
常に git status
チェックして、コミットされていない変更がないことを確認する必要があります(またはそれらは不要です)。
git reset
モードの比較表:
| インデックスを変更します | ファイルを変更する 作業ディレクトリ内 | する必要があります 気配りのある |
---|
reset --soft | いや | いや | いや |
reset [--mixed] | はい | いや | いや |
reset --hard | はい | はい | はい |
そして最後に、写真:(thx to
VBauer )
