web-dev-qa-db-ja.com

Gitで削除したブランチを回復することはできますか?

git branch -d XYZを実行した場合、ブランチを回復する方法はありますか? delete branchコマンドを実行しなかったかのように戻る方法はありますか?

891
prosseek

はい、git reflogを実行して、削除されたブランチの先端にコミット用のSHA1を見つけ、次にgit checkout [sha]を見つけることができるはずです。そして、コミットしたら、そこからブランチを再作成するためにgit checkout -b [branchname]を実行できます。


この要約/ワンライナーバージョンの@Cascabelの功績。

あなたは一つのステップでそれをすることができます:

git checkout -b <branch> <sha>
1625
tfe

ほとんどの場合、到達不可能なコミットはreflogにあります。したがって、 最初に試すことは、コマンドgit reflog(これはHEADのreflogを表示する)を使用してreflog を調べることです。

コミットがまだ存在する特定のブランチの一部であった場合、おそらくもっと簡単なことは、コマンドgit reflog name-of-my-branchを使用することです。プッシュを強制した場合など、リモコンでも機能します。


あなたのコミットがあなたのreflogにない場合 (おそらくreflogに書かれていないサードパーティ製のツールによって削除されたため)、私はうまく使って見つけたコミットのshaにブランチをリセットしてブランチを回復しましたそのようなコマンド(それはすべての未確定コミットを含むファイルを作成します):

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt

あなたがそれを複数回使うべきなら(あるいはどこかに保存したいなら)、そのコマンドでエイリアスを作成することもできます。

git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'

そしてgit rescueと一緒に使用してください

見つかったコミットを調査するには、いくつかのコマンドを使用してそれらを調べて各コミットを表示できます。

コミットメタデータ(作成者、作成日、コミットメッセージ)を表示するには

git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

差分も見るには:

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

コミットを見つけたら、このコミットの上に次のようにブランチを作成します。

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
122
Philippe

GUIを使いたいのなら、gitkを使って全体の操作を実行できます。

gitk --reflog

これにより、ブランチが削除されていないかのように、ブランチのコミット履歴を見ることができます。最新のブランチへのコミットを右クリックして、メニューオプションCreate new branchを選択してください。

38
nobar

トップ投票の解決策は、実際には要求以上のことをしています。

git checkout <sha>
git checkout -b <branch>

または

git checkout -b <branch> <sha>

コミットを忘れた可能性があるすべての最近の変更とともに、新しいブランチに移動します。特にブランチを失った後に「パニックモード」にあるときは、これはあなたの意図とは異なるかもしれません。

クリーナー(そしてより単純な)ソリューション はワンライナーのようです(<sha>git reflogを見つけた後):

git branch <branch> <sha>

現在のブランチもコミットされていない変更も影響を受けません。代わりに、新しいブランチだけが<sha>までずっと作成されます。

それがヒントではない場合、それはまだ動作し、あなたはより短いブランチを得るでしょう、そしてあなたはそれが正しくなるまで新しい<sha>と新しいブランチ名で再試行することができます。

最後に、正常に復元されたブランチの名前を、それが命名されたものまたはそれ以外のものに変更できます。

git branch -m <restored branch> <final branch>

言うまでもありませんが、成功への鍵は正しいコミット<sha>を見つけることでしたので、コミットに賢明な名前を付けてください:)

18
Dmitri Zaitsev

tfe answer に追加する:Gitソースのcontrib/エリアにgit-resurrect.shスクリプトもあります(git.gitリポジトリにあります) 、それはあなたを助けるかもしれません。

git-resurrect <name>は、<name>と呼ばれるブランチチップの痕跡を見つけようと試み、それを復活させようとします。現在、reflogでチェックアウトメッセージが検索され、-rでメッセージもマージされます。 -mおよび-tを使用すると、すべての参照の履歴からMerge <name> into other/Merge <other> into <name>(それぞれ)コミットサブジェクトがスキャンされます。これはかなり遅いですが、他の人のトピックブランチを復活させることができます。

14
Jakub Narębski

あなたがreflogを持っていないなら、例えば。 reflogが有効になっておらず、回復したいコミットが最近作成された裸のリポジトリで作業しているので、もう1つのオプションは最近作成されたコミットオブジェクトを見つけてそれを調べることです。

.git/objectsディレクトリの内側から、次のコマンドを実行します。

find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit

これは過去12時間以内に作成されたすべてのオブジェクト(コミット、ファイル、タグなど)を見つけ、コミットのみを表示するようにそれらをフィルタリングします。これらをチェックするのは簡単な作業です。

Jakub's answer に記載されているgit-ressurect.shスクリプトを試してみます。

9
Robert Knight

Gitがインストールされていない GitHub ユーザーの場合:

GitHub Webサイトから復元したい場合は、それらのAPIを使用してください _でrepo関連のイベントのリストを取得できます。

最初の

  • それらのSHAを見つけます(ハッシュのコミット):

    curl -i https://api.github.com/repos/PublicUser/PublicRepo/events

    ...またはプライベートリポジトリの場合:

    curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events

    (GitHubのパスワードを要求されます)

    • (レポーターが2要素認証を必要とする場合は、以下のこの回答に対するコメントを参照してください。)

次の

  • GitHub に行き、永遠に削除される新しい一時的なブランチを作成します( Chrome が望ましいです)。

•枝に移動してその枝を削除します。

同じページで、リロードせずに 、DevToolsの[ネットワーク]パネルを開きます。今準備してください...

•復元をクリックします。あなたは新しい "line"に気付くでしょう。それを右クリックして「Copy as cURL」を選択し、このテキストをエディタに保存します。

•コピーしたコードの行の最後に追加します:-H "Cookie="

これで次のようになります。

    curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed

最終ステップ

  • "BranchSHA"をあなたのSHAハッシュに、BranchNameを希望の名前に置き換えてください(ところで、Webからブランチ名を変更するのは素晴らしいハックです)。あなたがそれほど遅くないならば、あなたはとにかくこの要求をする必要があります。たとえば、端末にコピー&ペーストするだけです。

P.S

私は、これが「最も簡単な解決策」でも「正しい」解決策でもないかもしれないことを理解していますが、誰かがそれを役に立つと思った場合に備えて提供されます。

8
Maxim Mazurok

削除したブランチを見つけて取得するには、次のコマンドを使用しました。最初のステップはgcbの説明からです。

$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\  -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline

それでは、コミットコメントに基づいてgitコミットID(GIT-SHA)を探し、それを以下のコマンドで使用します。以前に見つかったGIT-SHAでNEW-BRANCHという新しいブランチをチェックアウトします。

$ git checkout -b NEW-BRANCH GIT-SHA
8

私が理解したところでは、削除するブランチに別のブランチが到達できるかどうかは、次のようにして安全に削除できます。

git branch -d [branch]

そしてあなたの仕事は失われません。ブランチはスナップショットではなく、スナップショットへのポインタです。そのため、ブランチを削除すると、ポインタも削除されます。

他のブランチがアクセスできないブランチを削除しても、作業を失うことはありません。もちろん、コミットハッシュをチェックアウトするほど簡単ではありませんが、それでも実行できます。 Gitが-dを使っても到達できないブランチを削除できないのはそのためです。代わりにあなたが使用する必要があります

git branch -D [branch]

これはGitについてのScott Chaconのビデオを見るための必需品の一部です。分58:00に、ブランチについて話して、それらをどのように削除するかを確認します。

GitHubのScott ChaconによるGitの紹介

7
fabiopagoti

私は望んでいなかったいくつかのコミットをクリアしようとするためにリモートからブランチをリベースしました。もちろん、私は間違った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してください。

4
gcb

削除されたブランチを回復するために、まずreflog履歴を見てください。

git reflog -n 60

Nは最後のn個のコミットを表します。それから適切な頭を見つけて、その頭で枝を作ります。

git branch testbranch HEAD@{30}
3
sajin tm

BIG YES

GITを使用している場合これらの簡単な手順に従ってくださいhttps://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html

smartgitを使用していて、すでにそのブランチをプッシュしている場合 Originに移動し、そのブランチを見つけて右クリックし、チェックアウト

2
Aljohn Yamaro

まず最初に、git batchを使ってプロジェクトに移動します。

cd Android studio project
cd Myproject
then type :
git reflog

あなたはすべて変更のリストを持っています、そして参照番号は参照番号を取り、そしてチェックアウトします
Androidスタジオまたはgit betchaから。別の解決策は、参照番号を取得してgitの枝を下にクリックし、次に参照番号を過ぎてチェックアウトタグまたは改訂をクリックしてから、あなたが枝を持っているのを見てください。

Tfeの答えに加えて、それがコミットがガベージコレクトされていない限り、あなたは言及されたこのプロセスで回復することができます。 Gitブランチは、コミットツリー内の特定のコミットへのポインタです。しかし、ポインタを削除し、そのブランチのコミットが他の既存のブランチにマージされていない場合、gitはそれをダングリングコミットとして扱い、ガベージコレクション中にそれらを削除します。定期的に実行されます。

あなたのブランチが既存のブランチにマージされていない場合、そしてそれがガベージコレクションされている場合は、ブランチが既存のブランチから分岐した時点までのすべてのコミットを失います。

1

関連する問題:「削除されたブランチが何であるかを知る方法」を検索した後にこのページに来ました。

多くの古い枝を削除している間に、私が誤って新しい枝の1つを削除したと感じましたが、それを回復するための名前がわかりませんでした。

最近削除されたブランチを確認するには、以下の手順に従います。

GitのURLにアクセスすると、次のようになります。

https://your-website-name/orgs/your-org-name/dashboard

それから最近の過去に誰が削除したのか、フィードを見ることができます。

必ずこれらすべてをローカルで実行し、Bitbucket Cloudにプッシュする前にリポジトリが希望の状態になっていることを確認してください。現在のレポジトリを複製して、これらの解決策を最初にテストすることもお勧めです。

  1. ブランチを削除したばかりの場合は、端末に次のようなものが表示されます。

    削除されたブランチ(だった)

    2.ブランチを元に戻すには、次のコマンドを使います。

    git checkout -b

頭の上の「しゃ」がわからない場合は、次のことができます。

  1. 削除したブランチの先端にあるコミットの 'sha'を探します。

    git reflog

  2. ブランチを元に戻すには、次のようにします。

    git checkout -b

あなたのコミットがあなたのreflogにない場合:

  1. 次のようなコマンドを使用して、見つかったコミットのshaにブランチをリセットすることで、ブランチの復旧を試すことができます。

    git fsck --full --no-reflogs - アクセスできない--lost-found | grep commit | cut -d\-f3 | xargs -n 1 gitログ-n 1 --pretty = oneline> .git/lost-found.txt

    2.次に、以下のいずれかを使用して各コミットを表示できます。

    git log -p git cat-file -p

0
uyghurbeg

git reflogを使っただけではshaが返されませんでした。 commit idのみ(これは8文字の長さで、shaはずっと長い)

だから私はgit reflog --no-abbrevを使いました

そして、上記と同じようにします。git checkout -b <branch> <sha>

0
MarvinVK