Gitでは、私はsquash commit
を別のブランチにマージしてから、次のようにしてHEAD
を前の場所にリセットすることによって試みていました。
git reset Origin/master
しかし、私はこれから抜け出す必要があります。 HEADを前の場所に戻すにはどうすればよいですか。
SHA1のコミットの断片(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
は現在のブランチの先端を指していないため、ブランチ名ではなく、SHA-1のようになります。
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 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 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 && checkout
はHEAD
を変更します。
これはとてもシンプルで覚えやすいアプローチです。 2つの条件をチェックして1つのコマンドで終了します。その後、軌道に乗った。
あなたは「切り離された頭」にいます
(例:git status
、HEAD detached at <commit_id>
が表示されます)
既存のブランチはあなたのニーズに合っています
(すなわち、git branch -v
と入力します。続けたい作業を表す関連するコミットメッセージを含むブランチ名が表示されます)
単にそのブランチをチェックアウトしてください(すなわちgit checkout <branch_name>
と入力してください。Switched to branch <branch_name>
が表示されます)。
これまでと同じように作業を追加してコミットすることができます。変更は<branch_name>
で追跡されます。
HEADが切り離されている間に作業を保存した場合、ほとんどの場合、その作業は上記のプロセスで自動的にマージされます。マージの競合についてのメッセージが表示されても、慌てないでください。競合を修正してマージを完了するための簡単な手順を含む素晴らしいチュートリアルがいくつかあります。
行う
git reset 23b6772
正しい位置にいるかどうかを確認するには
git status
あなたは何かを見るでしょう
ブランチマスター上あなたのブランチは17コミットで 'Origin/master'の後ろにあり、早送りすることができます。
それからHEADを現在のコミットに修正します。
git Push --force
質問は次のように読むことができます。
私は23b6772
にHEAD
とデタッチ状態にあり、git reset Origin/master
とタイプしました(スカッシュしたいので)。気が変わりました、どうやってHEAD
に戻って23b6772
に戻るのですか?
素直な答えはgit reset 23b6772
です。
しかし、前回のHEAD
を参照したいと思うたびに(コピー&ペースト)コミットハッシュやその省略形を入力するのにうんざりしていたので、この質問に答えました。
git reset -
(私の場合はgit cherry-pick -
)
* nixの前のカレントディレクトリに戻るためのcd -
と同じことは偶然にもありました。だから万歳、一つの石で二つのことを学びました。
コマンドgit checkout commit_id
を実行すると、HEADが13ca5593d(say commit-id)
から切り離され、ブランチは使用可能になります。
前の場所に戻るコマンドステップを賢明に実行します。a)git pull origin branch_name(例えばmaster)b)git checkout branch_name
リモートリポジトリからの更新されたコミットで前の場所に戻ります。
今日、私は誤ってコミットをチェックアウトし、デタッチHEAD状態でいくつかのコミットを行う作業を開始します。その後、次のコマンドを使用してリモートブランチにプッシュしました
git Push Origin HEAD: <My-remote-branch>
それから
git checkout <My-remote-branch>
それから
git pull
最後に、HEADの切り離しで行ったブランチのすべての変更を取得します