回答する前に、背景を追加し、これが何であるかを説明しましょうHEAD
。以下のオプションの一部は分離したヘッドになるため
First of all what is HEAD?
HEAD
現在のブランチの現在のコミット(最新)への参照です。
常に1つしか存在できませんHEAD
。(除くgit worktree
)
の内容HEAD
は内部に格納され.git/HEAD
、現在のコミットの40バイトのSHA-1が含まれています。
detached HEAD
あなたが最新のコミットをしていない場合-これHEAD
は、履歴内の以前のコミットを指していることを意味しdetached HEAD
ます。
コマンドラインでHEAD
は、は現在のブランチの先端を指していないため、ブランチ名ではなく、SHA-1のようになります。
切り離されたヘッドから回復する方法に関するいくつかのオプション:
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
これにより、目的のコミットを指す新しいブランチがチェックアウトされます。
このコマンドは、特定のコミットにチェックアウトします。
この時点で、ブランチを作成して、この時点から作業を開始できます。
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# create a new branch forked to the given commit
git checkout -b <branch name>
いつでも使用できreflog
ます。
git reflog
更新された変更が表示さHEAD
れ、目的のreflogエントリをチェックアウトすると、HEAD
このコミットに戻ります。
HEADが変更されるたびに、新しいエントリが reflog
git reflog
git checkout HEAD@{...}
これにより、目的のコミットに戻ります
HEADを目的のコミットに「移動」します。
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
- 注:(Git 2.7以降)
も使用できgit rebase --no-autostash
ます。
指定されたコミットまたはコミット範囲を「元に戻す」。
リセットコマンドは、指定されたコミットで行われた変更を「取り消し」ます。
元に戻すコミットを含む新しいコミットはコミットされますが、元のコミットも履歴に残ります。
# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>
このスキーマは、どのコマンドが何を実行するかを示しています。
ご覧のとおり、をreset && checkout
変更しHEAD
ます。