1. ホーム
  2. git

[解決済み] git reset --mixed, --soft, --hard の違いは何ですか?

2022-03-17 15:53:55

質問

コミットを分割したいのですが、どのリセットオプションを使用すればよいのかわかりません。

ページを見ていたら わかりやすく言うと、"git reset"は何をするのですか? しかし、私は git index や staging area が何であるかをよく理解していないため、説明を読んでも何の役にも立たないことに気がつきました。

また、使用例として --mixed--soft は、その回答(fix and recommitしたい時)と同じに見えるのですが。どなたかもっと噛み砕いて説明していただけませんか? 私は --mixed が選択肢に入るのでしょうが、私が知りたいのは なぜ . 最後に --hard ?

どなたか、3つの選択肢を選択する際のワークフロー例を教えてください。

どのように解決するのですか?

リポジトリ内のファイルを変更した場合、その変更は最初、ステージングされていない状態です。コミットするためには、ステージングする必要があります。 git add . コミットするとき、コミットされるのはインデックスに追加された変更点です。

git reset は、最低限、現在のブランチ( HEAD を指している。との差は --mixed--soft は、インデックスも変更されるかどうかです。ですから、もし私たちがブランチ master この一連のコミットで

- A - B - C (master)

HEAD を指します。 C とインデックスが一致する C .

を実行すると git reset --soft B , master (というように HEAD を指すようになりました。 B からの変更点がインデックスに残っています。 C ; git status は、ステージングされたものとして表示されます。ですから、もし git commit と同じ変更を含む新しいコミットを取得します。 C .


では、もう一度ここからスタートです。

- A - B - C (master)

では、次のようにしましょう。 git reset --mixed B . (注 --mixed はデフォルトのオプションです)。もう一度 masterHEAD はBを指しますが、今回はインデックスも変更して B . もし git commit にマッチするので、この時点では何も起こりません。 HEAD . 作業ディレクトリにはまだ変更が残っていますが、インデックスにはないため git status は未ステージであることを示しています。コミットするには、次のようにします。 git add を作成し、通常通りコミットしてください。


そして最後に --hard と同じです。 --mixed (を変更します)。 HEAD とインデックス)を除いて --hard は作業ディレクトリも変更します。もし私たちが C を実行し git reset --hard B で追加された変更は C とコミットされていない変更が削除され、作業コピーのファイルがコミット B . この方法では変更を永久に失う可能性があるため、常に git status ハードリセットを行う前に、作業ディレクトリがクリーンであること、あるいはコミットされていない変更を失っても問題ないことを確認してください。


そして最後に、ビジュアル化です。