1. ホーム
  2. ギット

[解決済み】HEADを以前の場所に戻すにはどうしたらいいですか?(Detached head) & コミットの取り消し

2022-04-01 19:34:01

質問

Gitで、私は squash commit を別のブランチにマージして、リセットすることで HEAD を経由して前の場所に移動します。

git reset origin/master

しかし、ここから一歩踏み出す必要がある。HEADを前の場所に戻すにはどうしたらいいのでしょうか?

私はSHA-1フラグメント( 23b6772 ) のコミットに移動する必要があります。どうすればこのコミットに戻れるのでしょうか?

解決方法は?

回答する前に、背景を説明し、この HEAD です。

First of all what is HEAD?

HEAD は、単に現在のブランチの現在のコミット (最新) への参照です。

は1つだけです。 HEAD を除く)。 git worktree ).

の内容は HEAD の中に格納されます。 .git/HEAD で、現在のコミットの40バイトのSHA-1が含まれています。


detached HEAD

最新のコミットでない場合、つまり HEAD は、履歴の中の以前のコミットを指しており、そのコミットは detached HEAD .

コマンドライン上では、このようになります。 HEAD は現在のブランチの先端を指しているわけではありません。


切り離されたHEADから復旧する方法について、いくつかの選択肢を紹介します。


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits to 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>


git reflog

を常に使用することができます。 reflog もあります。

git reflog を更新したすべての変更が表示されます。 HEAD を設定し、目的の reflog エントリをチェックアウトすると HEAD をこのコミットに戻します。

HEAD が変更されるたびに、新しいエントリーが reflog

git reflog
git checkout HEAD@{...}

これで目的のコミットに戻ることができます


git reset --hard <commit_id>

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 と同様です。


git revert <sha-1>

指定されたコミットまたはコミット範囲を元に戻します。

resetコマンドは、指定されたコミットで行われたすべての変更を取り消します。

元になったコミットは履歴に残りますが、取り消しパッチが適用された新しいコミットがコミットされます。

# Add a 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 .