について誤解されている回答がいくつかありますgit reset --soft
。(デタッチされたヘッドの状態から開始して)git reset --soft
のみ変更される特定の条件がありますがHEAD
、通常(および意図された用途)、現在チェックアウトしているブランチ参照が移動します。もちろん、ブランチをチェックアウトしていない場合は、これを行うことはできません(したがって、git reset --soft
変更されるのは特定の条件のみですHEAD
)。
これがを考える最良の方法であることがわかりましたgit reset
。あなただけ動いていないHEAD
(すべてがそれを行い、あなたも移動している)分岐REFを、例えば、master
。これは、新しいコミットを作成する(そして移動する)代わりに、以前のコミットに移動することを除いgit commit
て、実行(現在のブランチがに沿って移動するHEAD
)と同じです。
これが、ブランチをreset
変更せずに、新しいコミット以外のものに変更するという点です。HEAD
これはドキュメントの例で見ることができます:
コミットを元に戻し、トピックブランチにします
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- あなたはいくつかのコミットを行いましたが、それらが「マスター」ブランチになるのは時期尚早であることに気づきました。トピックブランチでそれらを磨き続けたいので、現在のHEADから「topic / wip」ブランチを作成します。
- masterブランチを巻き戻して、これらの3つのコミットを削除します。
- 「topic / wip」ブランチに切り替えて作業を続けます。
この一連のコマンドの意味は何ですか?ここでブランチを移動したいmaster
ので、master
チェックアウトした状態で実行しgit reset
ます。
ここで投票した上位の回答は概ね良好ですが、誤解のあるいくつかの回答を修正するためにこれを追加したいと思いました。
ブランチを変更する
git reset --soft <ref>
:現在チェックアウトされているブランチのブランチポインターを、指定された参照でのコミットにリセットします<ref>
。作業ディレクトリとインデックス内のファイルは変更されません。この段階からコミットすると、git reset
コマンドの前の状態に戻ります。
インデックスも変更する
git reset --mixed <ref>
または同等に
git reset <ref>
:
何が--soft
ないと、指定の基準にコミット試合にインデックスをリセットします。一方でgit reset --soft HEAD
(それはブランチをチェックアウトしにブランチをチェックアウトした移動言うので)何もしない、git reset --mixed HEAD
または同等git reset HEAD
、それはあなたの最後のコミットの状態にインデックスをリセットするので、一般的で便利なコマンドです。
作業ディレクトリも変更します
git reset --hard <ref>
:何をし--mixed
ていとも作業ディレクトリを上書きします。このコマンドは、ブランチ参照が指しているすべての形式の移動git checkout <ref>
を除いて(そしてこれがについての重要なポイントですreset
)、に似ています。git reset
HEAD
「そのようなコマンドはHEADを移動する」に関するメモ:
コマンドがを移動すると言っても意味がありませんHEAD
。コミット履歴のどこにいるかを変更するコマンドを実行すると、が移動しHEAD
ます。それは何HEAD
で、どこにいてもへのポインタ。HEAD
あなたであり、そうするたびに移動します。