web-dev-qa-db-ja.com

HEADを以前の場所に戻る方法(切り離された頭)&元に戻る

Gitでは、私はsquash commitを別のブランチにマージしてから、次のようにしてHEADを前の場所にリセットすることによって試みていました。

git reset Origin/master

しかし、私はこれから抜け出す必要があります。 HEADを前の場所に戻すにはどうすればよいですか。

SHA1のコミットの断片(23b6772)を持っているので、それを移動する必要があります。
どうすればこのコミットに戻ることができますか?

110
timpone

答える前に、このHEADとは何かを説明する背景を追加しましょう。

First of all what is HEAD?

HEADは、現在のブランチの現在のコミット(最新)への単なる参照です。
常に1つのHEADしか存在できません。 (git worktreeを除く)

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


detached HEAD

最新のコミットをしていない場合-HEADは、履歴内の前のコミットを指しているということですdetached HEAD

enter image description here

コマンドラインでは、HEADは現在のブランチの先端を指していないため、ブランチ名ではなく、SHA-1のようになります。

enter image description here

enter image description here

切り離されたHEADから回復する方法に関するいくつかのオプション:


git checkout

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>

git reflog

いつでもreflogも使用できます。
git reflogHEADを更新した変更を表示し、目的のreflogエントリをチェックアウトするとHEADをこのコミットに戻します。

HEADが変更されるたびに、reflogに新しいエントリがあります。

git reflog
git checkout HEAD@{...}

これにより、目的のコミットに戻ります

enter image description here


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 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 && checkoutHEADを変更します。

enter image description here

298
CodeWizard

これはとてもシンプルで覚えやすいアプローチです。 2つの条件をチェックして1つのコマンドで終了します。その後、軌道に乗った。

もし

あなたは「切り離された頭」にいます
(例:git statusHEAD detached at <commit_id>が表示されます)

そして

既存のブランチはあなたのニーズに合っています
(すなわち、git branch -vと入力します。続けたい作業を表す関連するコミットメッセージを含むブランチ名が表示されます)

それから

単にそのブランチをチェックアウトしてください(すなわちgit checkout <branch_name>と入力してください。Switched to branch <branch_name>が表示されます)。

結果

これまでと同じように作業を追加してコミットすることができます。変更は<branch_name>で追跡されます。

HEADが切り離されている間に作業を保存した場合、ほとんどの場合、その作業は上記のプロセスで自動的にマージされます。マージの競合についてのメッセージが表示されても、慌てないでください。競合を修正してマージを完了するための簡単な手順を含む素晴らしいチュートリアルがいくつかあります。

10
Kay V

行う

git reset 23b6772

正しい位置にいるかどうかを確認するには

git status

あなたは何かを見るでしょう

ブランチマスター上あなたのブランチは17コミットで 'Origin/master'の後ろにあり、早送りすることができます。

それからHEADを現在のコミットに修正します。

git Push --force
6
amuliar

質問は次のように読むことができます。

私は23b6772HEADとデタッチ状態にあり、git reset Origin/masterとタイプしました(スカッシュしたいので)。気が変わりました、どうやってHEADに戻って23b6772に戻るのですか?

素直な答えはgit reset 23b6772です。

しかし、前回のHEADを参照したいと思うたびに(コピー&ペースト)コミットハッシュやその省略形を入力するのにうんざりしていたので、この質問に答えました。

それがあることがわかりました!

git reset -(私の場合はgit cherry-pick -

* nixの前のカレントディレクトリに戻るためのcd -と同じことは偶然にもありました。だから万歳、一つの石で二つのことを学びました。

3
antak

コマンドgit checkout commit_idを実行すると、HEADが13ca5593d(say commit-id)から切り離され、ブランチは使用可能になります。

前の場所に戻るコマンドステップを賢明に実行します。a)git pull origin branch_name(例えばmaster)b)git checkout branch_name

リモートリポジトリからの更新されたコミットで前の場所に戻ります。

0
Deepak Kumar

今日、私は誤ってコミットをチェックアウトし、デタッチHEAD状態でいくつかのコミットを行う作業を開始します。その後、次のコマンドを使用してリモートブランチにプッシュしました

git Push Origin HEAD: <My-remote-branch>

それから

git checkout <My-remote-branch>

それから

git pull 

最後に、HEADの切り離しで行ったブランチのすべての変更を取得します

0
Zaid Mirza