Gitではsquash commit
、別のブランチにマージしてHEAD
から、次の方法で前の場所にリセットすることで、
git reset origin/master
しかし、私はこれから抜け出す必要があります。HEADを前の場所に戻すにはどうすればよいですか?
23b6772
移動する必要があるコミットのSHA-1フラグメント()があります。このコミットに戻すにはどうすればよいですか?
Gitではsquash commit
、別のブランチにマージしてHEAD
から、次の方法で前の場所にリセットすることで、
git reset origin/master
しかし、私はこれから抜け出す必要があります。HEADを前の場所に戻すにはどうすればよいですか?
23b6772
移動する必要があるコミットのSHA-1フラグメント()があります。このコミットに戻すにはどうすればよいですか?
回答:
答える前に、背景を追加して、これ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>
指定されたコミットまたはコミット範囲を「元に戻す」。
リセットコマンドは、指定されたコミットで行われた変更を「取り消し」ます。
元に戻すコミットを含む新しいコミットはコミットされますが、元のコミットも履歴に残ります。
# 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
ます。
行う
git reset 23b6772
あなたが正しい位置にいるかどうかを確認するには:
git status
あなたは何かを見ます
ブランチマスター上ブランチは17回のコミットで 'origin / master'の背後にあり、早送りすることができます。
次に、リモートの履歴を書き換えて変更を反映します。
git push --force-with-lease // a useful command @oktober mentions in comments
git push --force
。多くの状況では、それはあなたしばらくのためのチームの少なくとも人気者....になります
git push --force-with-lease
(Thoughtbot記事:thoughtbot.com/blog/git-push-force-with-lease)
revert
コミットと同じように反応しないので、信じられないほど難しい状況に陥っていました。force-with-lease
他の人の作業に影響を与えずにブランチのgit履歴を書き直す自信がありました。ブラボー!
使用する git checkout -
あなたが表示されますSwitched to branch <branch_name>
。目的のブランチであることを確認します。
簡単な説明:このコマンドはHEADを最後の位置に戻します。この回答の最後にある結果に関する注記を参照してください。
記憶法:このアプローチは、cd -
以前にアクセスしたディレクトリに戻るために使用する方法とよく似ています。構文と適用可能なケースはかなり一致しています(たとえば、HEADを実際に元の場所に戻したい場合に便利です)。
迅速なアプローチがOPの問題を解決します。しかし、状況が少し異なる場合はどうなりますか?Bashを再起動してから、HEADが切り離されていることに気付いたとします。その場合、2つの簡単で覚えやすい手順を次に示します。
使用する git branch -v
既存のローカルブランチのリストが表示されます。ニーズに合ったブランチ名を取得します。
使用する git checkout <branch_name>
あなたが表示されますSwitched to branch <branch_name>
。成功!
どちらの方法でも、今までどおり作業の追加とコミットを続行できます。次の変更はで追跡され<branch_name>
ます。
HEADがデタッチされている間に変更をコミットした場合は、git checkout -
との両方にgit checkout <branch_name>
追加の指示が表示されることに注意してください。
git checkout 8acc968
、その後git branch -v
持ってMyBranch
下のリストに...しかし、その後、git checkout MyBranch
私のコメントを削除します。
git checkout 8acc968
ブランチではなくコミットをチェックアウトします。MyBranch
必要なコミットがある場合は、を試してくださいgit checkout MyBranch
。コミット8acc968の変更が含まれていない場合は、ブランチをチェックアウトした後でそれらの変更をマージする必要があります。
git checkout
以前のコミットを見に行き、最新のコミットに戻りたいと思っていました。しかし、最新のコミットハッシュがないと、私はかなり迷っていました。このソリューションは私の状況に最適です!
質問は次のように読むことができます:
私はHEAD
at でdetached状態で23b6772
、入力しましたgit reset origin/master
(スカッシュしたかったため)。気が変わったのですが、どうすれば元の場所に戻ることHEAD
ができ23b6772
ますか?
簡単な答えは次のとおりです。 git reset 23b6772
しかし、この質問HEAD
に出くわしたのは、以前の参照を参照したいと思ったり、何らかの略記がないかどうかをグーグルで調べたりするたびに、タイプ入力(コピーと貼り付け)のコミットハッシュまたはその省略形にうんざりしたからです。
git reset -
(または私の場合git cherry-pick -
)
ちなみにどちらが* nixのcd -
前の現在のディレクトリに戻るのと同じでした!ですから、私は1つの石で2つのことを学びました。
これは技術的な解決策ではないかもしれませんが、機能します。(チームメイトの誰かがローカルに同じブランチを持っている場合)
ブランチ名をbranch-xxxと仮定します。
解決する手順:
注:これも技術的な解決策ではありませんが、確実に役立ちます。
git checkout 23b6772
すべきです