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と一致します。
やった後
HEADはBを指し、コミットCからの変更は、git reset --soft B
git add
コマンドで追加したかのようにインデックスに反映されます。
git commit
を実行すると、 Cと完全に同一のコミットを受け取ります。
git reset --mixed(デフォルト)
--mixed
デフォルトで
--mixed
モード
--mixed
使用されます。
git reset --mixed = git reset
同じ初期条件に戻りましょう。
- A - B - C (master)
完了することにより
またはgit reset --mixed B
HEADは再びBを指しますが、今回はCからの変更はインデックスに含まれません。ここでgit reset B
git commit
を実行すると、何も起こりません。 インデックスには何もありません。 Cからのすべての変更がありますが、
git status
を実行すると、すべての変更がステージングされていないことがわかります。 それらをコミットするには、最初に
git add
コマンドでインデックスに追加し、次に
git commit
を追加する必要があります。
git reset --hard
同じ初期条件:
- A - B - C (master)
--hard
ような最後の
--hard
モードは、 HEADをBに移動してインデックスをクリアしますが、--
--mixed
とは異なり
--mixed
ハードリセットは作業ディレクトリ内のファイルを変更します 。 実行する場合
Cからの変更とコミットされていない変更は削除され、リポジトリ内のファイルはBと一致します。 このモードは変更が失われることを意味するため、ハードリセットを実行する前に、 常にgit reset --hard B
git status
チェックして、コミットされていない変更がないことを確認する必要があります(またはそれらは不要です)。
git reset
モードの比較表:
インデックスを変更します | ファイルを変更する
作業ディレクトリ内 | する必要があります
気配りのある | |
---|---|---|---|
reset --soft
| いや | いや | いや |
reset [--mixed]
| はい | いや | いや |
reset --hard
| はい | はい | はい |
そして最後に、写真:(thx to VBauer )