401

まず、「ブランチがオリジン/マスターより3コミット進んでいる」というメッセージが表示された後、私のアプリは以前の変更で以前の時間に戻りました。

過去11時間に費やしたものを元に戻すにはどうすればよいですか?

4

7 に答える 7

909

git reflogあなたの友だちです。そのリストで参加したいコミットを見つけて、それにリセットすることができます(例:) git reset --hard e870e41

(変更をコミットしなかった場合...問題が発生する可能性があります-早期にコミットし、頻繁にコミットしてください!)

于 2012-04-11T03:08:59.943 に答える
173

答える前に、これが何であるかを説明するいくつかの背景を追加しましょう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になります。

ここに画像の説明を入力してください

ここに画像の説明を入力してください


切り離された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 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.
  • 注:( Git2.7以降)も使用できます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ます。

ここに画像の説明を入力してください

于 2016-01-13T21:20:00.967 に答える
50

削除されたコミットに到達する別の方法は、git fsckコマンドを使用することです。

git fsck --lost-found

これにより、最後の行のようなものが出力されます。

dangling commit xyz

reflog他の回答で提案されているのと同じコミットを使用して確認できます。今、私たちはすることができますgit merge

git merge xyz

注:ぶら下がっているコミットへの参照を削除するコマンドをすでに実行している場合
、コミットを元に戻すことはできません。fsckgit gc

于 2016-01-12T19:38:36.210 に答える
12

これを試してください、これは一定期間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

于 2020-08-04T14:57:55.040 に答える
9

これは今日私に起こったので、私は私にとって命の恩人として出てきたものを書いています。私の答えは@Amberの答えと非常に似ています。

最初に、をgit reflog実行してその特定のコミットのハッシュを検索し、次にそのハッシュをコピーしてgit cherry-pick <hash>そのブランチから実行しました。これにより、失われたコミットから現在のブランチへのすべての変更がもたらされ、GITへの信頼が回復しました。

良い1日を!

于 2021-02-13T16:03:05.597 に答える
2

でコミットが見つからず、IntelliJ IDEgit reflogを使用していた場合は、そこから変更を元に戻すことができます。right click on your project root folder -> Local History -> Show History

ローカルとリモートのリポジトリからコミットが削除されたので、私はそれを台無しにしましたgit rebase、そしてこれは本当に私を救いました。git push -f

それが誰かの日を救うことを願っています

乾杯

于 2021-10-01T14:44:17.017 に答える
-17

悲しいことに、gitはとても信頼できません:(私はちょうど2日間の仕事を失いました:(

コミットを実行する前に、何かを手動でバックアップすることをお勧めします。私は「gitcommit」を実行し、gitは何も言わずにすべての変更を破棄しました。

私は自分のレッスンを学びました-次回は最初にバックアップし、次にコミットします。gitを信用しないでください。

于 2020-09-01T19:35:03.187 に答える