まず、「ブランチがオリジン/マスターより3コミット進んでいる」というメッセージが表示された後、私のアプリは以前の変更で以前の時間に戻りました。
過去11時間に費やしたものを元に戻すにはどうすればよいですか?
まず、「ブランチがオリジン/マスターより3コミット進んでいる」というメッセージが表示された後、私のアプリは以前の変更で以前の時間に戻りました。
過去11時間に費やしたものを元に戻すにはどうすればよいですか?
git reflog
あなたの友だちです。そのリストで参加したいコミットを見つけて、それにリセットすることができます(例:) git reset --hard e870e41
。
(変更をコミットしなかった場合...問題が発生する可能性があります-早期にコミットし、頻繁にコミットしてください!)
答える前に、これが何であるかを説明するいくつかの背景を追加しましょう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 fsck
コマンドを使用することです。
git fsck --lost-found
これにより、最後の行のようなものが出力されます。
dangling commit xyz
reflog
他の回答で提案されているのと同じコミットを使用して確認できます。今、私たちはすることができますgit merge
git merge xyz
注:ぶら下がっているコミットへの参照を削除するコマンドをすでに実行している場合
、コミットを元に戻すことはできません。fsck
git gc
これを試してください、これは一定期間gitに記録されたすべてのコミットを表示します
git reflog
必要なコミットを見つける
git log HEAD@{3}
また
git log -p HEAD@{3}
次に、それが正しいかどうかを確認します。
git checkout HEAD@{3}
これにより、そのコミット用の切り離されたヘッドが作成されます。必要に応じて変更を追加してコミットします
git status
git add
git commit -m "temp_work"
ここで、コミットをブランチに戻したい場合は、マスターと言うことができます。このブランチスイッチにマスターという名前を付けてから、マスターにマージする必要があります。
git branch temp
git checkout master
git merge temp
Gitチュートリアルサイトのreflog専用のリンクもあります: Atlassian Git Tutorial
これは今日私に起こったので、私は私にとって命の恩人として出てきたものを書いています。私の答えは@Amberの答えと非常に似ています。
最初に、をgit reflog
実行してその特定のコミットのハッシュを検索し、次にそのハッシュをコピーしてgit cherry-pick <hash>
そのブランチから実行しました。これにより、失われたコミットから現在のブランチへのすべての変更がもたらされ、GITへの信頼が回復しました。
良い1日を!
でコミットが見つからず、IntelliJ IDEgit reflog
を使用していた場合は、そこから変更を元に戻すことができます。right click on your project root folder -> Local History -> Show History
ローカルとリモートのリポジトリからコミットが削除されたので、私はそれを台無しにしましたgit rebase
、そしてこれは本当に私を救いました。git push -f
それが誰かの日を救うことを願っています
乾杯
悲しいことに、gitはとても信頼できません:(私はちょうど2日間の仕事を失いました:(
コミットを実行する前に、何かを手動でバックアップすることをお勧めします。私は「gitcommit」を実行し、gitは何も言わずにすべての変更を破棄しました。
私は自分のレッスンを学びました-次回は最初にバックアップし、次にコミットします。gitを信用しないでください。