を実行した場合git branch -d XYZ
、ブランチを回復する方法はありますか? delete branch コマンドを実行しなかったかのように戻る方法はありますか?
21 に答える
git reflog --no-abbrev
はい、削除されたブランチの先端にあるコミットの SHA1 を実行して見つけることができるはずですgit checkout [sha]
。そして、そのコミットに到達したらgit checkout -b [branchname]
、そこからブランチを再作成するだけです。
この要約/ワンライナー バージョンについては @Cascabel に、sha の入手方法については @Snowcrash に感謝します。
ブランチを削除したばかりの場合は、ターミナルに次のようなものが表示されますDeleted branch <your-branch> (was <sha>)
。次に<sha>
、このワンライナーでそれを使用します。
git checkout -b <your-branch> <sha>
トップ投票のソリューションは、実際には要求以上のことを行います。
git checkout <sha>
git checkout -b <branch>
また
git checkout -b <branch> <sha>
コミットするのを忘れた可能性のある最近のすべての変更とともに、新しいブランチに移動します。特にブランチを失った後の「パニックモード」では、これはあなたの意図ではないかもしれません。
よりクリーンな(そしてよりシンプルな)解決策<sha>
は、ワンライナーのようです( withを見つけた後git reflog
):
git branch <branch> <sha>
これで、現在のブランチもコミットされていない変更も影響を受けません。代わりに、新しいブランチだけが までずっと作成されます<sha>
。
ヒントではない場合でも機能し、ブランチが短く<sha>
なるので、正しくなるまで新しいブランチ名と新しいブランチ名で再試行できます。
最後に、正常に復元されたブランチの名前を、その名前またはその他の名前に変更できます。
git branch -m <restored branch> <final branch>
言うまでもなく、成功への鍵は適切なコミットを見つけることだった<sha>
ので、コミットに賢明な名前を付けてください :)
tfe answerに追加: Git ソース (git.git リポジトリ内) の領域にgit-resurrect.shスクリプトもありcontrib/
、これが役立つ場合があります。
git-resurrect <name>
と呼ばれる分岐先端の痕跡を見つけよ<name>
うとし、それを復活させようとします。現在、reflog はチェックアウト メッセージと-r
マージ メッセージで検索されます。-m
と を使用 すると-t
、すべての参照の履歴がMerge <name> into other
/Merge <other> into <name>
(それぞれ) コミット サブジェクトに対してスキャンされます。これはかなり遅いですが、他の人のトピック ブランチを復活させることができます。
私の理解では、削除するブランチに別のブランチが到達できる場合は、次を使用して安全に削除できます
git branch -d [branch]
作業が失われることはありません。ブランチはスナップショットではなく、スナップショットへのポインターであることを忘れないでください。したがって、ブランチを削除すると、ポインターが削除されます。
別のブランチからアクセスできないブランチを削除しても、作業が失われることはありません。もちろん、コミット ハッシュをチェックアウトするほど簡単ではありませんが、それでも実行できます。を使用してアクセスできないブランチを Git が削除できないのはそのため-d
です。代わりに使用する必要があります
git branch -D [branch]
これは、Scott Chacon による Git に関する必見のビデオの一部です。彼がブランチとその削除方法について話している 58:00 分を確認してください。
ブランチを削除してコミット ID を忘れた場合は、次のコマンドを実行できます。
git log --graph --decorate $(git rev-list -g --all)
この後、すべてのコミットを見ることができます。次にgit checkout
、この id に対して行うことができ、このコミットの下に新しいブランチを作成します。
削除されたブランチを復元するには、まず reflog の履歴を調べます。
git reflog -n 60
ここで、n は最後の n 個のコミットを指します。次に、適切なヘッドを見つけて、そのヘッドでブランチを作成します。
git branch testbranch HEAD@{30}
リモートからブランチをリベースして、不要ないくつかのコミットをクリアしようとしましたが、必要な適切なものをチェリーピックするつもりでした。もちろん、私はSHAを間違って書きました...
これが私がそれらを見つけた方法です(ほとんどの場合、ここでの回答に関するものからのより簡単なインターフェース/相互作用です):
最初に、ログに緩いコミットのリストを生成します。これらはガベージ コレクターによってダンプされる可能性があるため、できるだけ早くこれを実行して作業を停止してください。
git fsck --full --no-reflogs --unreachable --lost-found > lost
これにより、lost
確認する必要があるすべてのコミットを含むファイルが作成されます。生活を簡素化するために、そこから SHA だけを切り取りましょう。
cat lost | cut -d\ -f3 > commits
これで、確認する必要があるcommits
すべてのコミットを含むファイルができました。
Bash を使用していると仮定すると、最後のステップは次のとおりです。
for c in `cat commits`; do git show $c; read; done
これにより、それぞれの差分とコミット情報が表示されます。を押してお待ちくださいEnter。必要なものをすべて書き留めて、チェリーピックします。完了したら、Ctrl-C を押します。
削除されたブランチを回復するという一般的な問題の非常に一般的なサブ問題は、機能ブランチをマージしてから削除した後に回復することです-一般的な慣行です。
このSO 投稿がカバーしているように、削除されたブランチが正常にマージされていれば、いつでも復元できます。これは、ブランチが単なるコミットへのポインタであり、マージしたため、コミットがまだそこにあるためです。マージ コミットは、マージされた 2 つ (またはそれ以上) のブランチのヘッド コミットのハッシュを一覧表示します。例えば:
git show master
commit 849675951d41497e7b07d34096ebf36dc713221 (HEAD -> master)
Merge: fc1c9ce 97f8a60
Author: Me
Date: Sun Jan 9 16:14:24 2022 +0100
Merge branch 'feature'
したがって、「機能」ブランチの削除を回復できgit checkout -b feature 97f8a60
ます-reflogの必要はありません。
最初に git batch に移動して、次のようにプロジェクトに移動します。
cd android studio project
cd Myproject
then type :
git reflog
あなたはすべて変更のリストを持っており、参照番号は参照番号を取得し、
Androidスタジオまたはgit betchaからチェックアウトします. 別の解決策は、参照番号を取得してAndroidスタジオに移動し、gitブランチをクリックしてから、参照番号を過ぎたチェックアウトタグまたはリビジョンをクリックすると、ブランチがあります。