質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

SourceTree(Git)のブランチの復元方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 401

nelpesica

score 110

前提・実現したいこと

SourceTreeで管理しているローカルリポジトリのブランチ(History)がすべて消えていました。
故意に削除したわけではなく、ソフトを立ち上げたらブランチが消えていて管理していたファイルがすべてステージされた状態でした。

ブランチを復元する方法はありますか?

試したこと

ブランチが消えた原因としてPCがブルースクリーンで落ちたことが考えられました。
最新の復元ポイントに復元しましたがSourceTreeの設定などは戻りませんでした。

リポジトリの再読み込みもしてみましたが、ブランチは消えたままでした。

補足情報

Windows 10 pro 64bit
SourceTree Ver3.3.8
内蔵Gitバージョン 2.24.1

リポジトリの管理はローカルのみです。
gitフォルダの中には管理していたログ(ブランチ)と思われるファイルなどが残っているようです。
.git\logs\refs\heads\master
.git\refs\heads\master
など

現状、『新規リポジトリ作成をした状態』とほぼ同じですが、退避させていたスタッシュ情報だけは残っています。
何もコミットされていない状態になっているのでmasterブランチも存在しません。
他にも管理しているローカルリポジトリはありますが、ブランチが消えてしまったのは1件のみです。

CLIは苦手なので、コマンドプロンプトを使った操作方法であれば、わかりやすく解説(またはコピペで済む方法で)していただけると助かります。

解決方法

アドバイスをいただき無事に解決しましたので、解決手順をまとめました。
対象のgitフォルダはC:\Users\[ProjectFolder]\.gitと仮定

  1. 念のためにリポジトリをどこかにバックアップ
    C:\Users\
    └[ProjectFolder]
    │└.git(バックアップする)

  2. リポジトリをProjectFolderの同層へclone
    コマンドプロンプトを起動 Windowsキー + R cmdと入力
    カレントディレクトリを移動 cd C:\Users\[ProjectFolder]
    リポジトリをクローン git clone C:\Users\[ProjectFolder] newProjectFolder
    C:\Users\
    ├[ProjectFolder]
    │└.git(バックアップした)
    ├newProjectFolder(新しく作った)
    │└.git(cloneした)

  3. cloneした.gitフォルダをC:\Users\[ProjectFolder]\.gitに上書き(コピペ)
    C:\Users\
    ├[ProjectFolder]
    │└.git(cloneしたフォルダで上書き)

  4. C:\Users\[ProjectFolder]内の.gitフォルダ以外のファイルをどこかに退避

  5. SourceTreeでブランチをダブルクリックすると履歴が復活

  6. 退避したファイルを元に戻して上書き(コミットされていない差分が復活)

以上の手順で消えたブランチを復活させることができました。

補足:日本語(マルチバイト)名のブランチが表示されない場合

  1. .git\logs\refs\heads.git\refs\headsにあるマルチバイトブランチファイル(以下、jpブランチ)をシングルバイトにリネーム
  2. .git\logsのHEADファイルの中身のjpブランチをリネームしたシングルバイト名に置換
  3. .git\logs\refs\headsのjpブランチファイルから最新のコミットID(一番下の行の左から2つ目のコードの塊)をコピー
  4. .git\refs\headsのjpブランチファイルにコピーしたコミットIDを貼り付けて保存
  5. SourceTreeでリポジトリを更新するとjpブランチが復活
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • nelpesica

    2020/07/17 10:46 編集

    元のブランチはmaster以外にもいくつかありました。
    .gitの上層フォルダで実行しました。
    (すみません、先程の実行結果は別のプロジェクトでしたので無視してください)

    C:\Users\[ProjectFolder]\.git> git branch -a
    fatal: Failed to resolve HEAD as a valid ref.

    C:\Users\[ProjectFolder]> git status

    No commits yet

    Untracked files:
    (use "git add <file>..." to include in what will be committed)
    index.php(その他ディレクトリにあるphpファイルなど)

    nothing added to commit but untracked files present (use "git add" to track)

    ----

    今は何もコミットされていないのでmasterブランチも存在していない状態です。

    キャンセル

  • bsdfan

    2020/07/17 11:05

    .git/refs/heads に、[ブランチ名].lock というファイルがあります?
    もしあれば、.lock を取り除いた [ブランチ名] だけに変更してみてください。

    (作業前に、レポジトリ全体を別のディレクトリにコピーしてバックアップしておくほうが安全です)

    キャンセル

  • nelpesica

    2020/07/17 11:15

    .git/refs/heads フォルダの中に作成していたブランチ名がすべてありますが、.lockがついたファイルはありません。

    キャンセル

回答 1

checkベストアンサー

+1

https://stackoverflow.com/a/37850950で解決できないでしょうか。

  1. レポジトリをバックアップしておく
  2. レポジトリを別のところへclone (ProjectFolderのひとつ上とかで)
    git clone C:\Users\[ProjectFolder] newProjectFolder
  3. C:\Users\[ProjectFolder]\.git を削除して newProjectFolder\.git を C:\Users\[ProjectFolder] にコピー (エクスプローラで)
  4. ブランチがoriginの下になっているのを作り直して、originは削除
  5. 問題なかったらバックアップを削除

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/17 16:31 編集

    .git以外を退避してブランチをダブルクリックしたらブランチが復活しました!
    (リモートのoriginは触ってません)
    その後、退避したファイルを戻したらコミットされていない変更も反映されました。

    ただ、master以外にもいくつかあったブランチは復活しているのですが、
    日本語(マルチバイト)名のブランチが表示されていません。
    .gitフォルダの中に存在はしているのですが、こちらを復活させるにはどうしたら良いでしょうか?

    キャンセル

  • 2020/07/17 20:13 編集

    まずは復活できたようで良かったです。
    マルチバイトのブランチ名についてはわからないです。.git/refs/heads/のブランチ名のファイル名を英語だけのものに変更してみるとかかな。

    キャンセル

  • 2020/07/20 10:44

    表示されていなかった日本語(マルチバイト)名のブランチを復活させることができました。
    以下、解決手順。

    .git\refs\heads と .git\logs\refs\heads にあったマルチバイトブランチファイル(以下、jpブランチ)をシングルバイトにリネーム
    .git\logs のHEADファイルの中身のjpブランチをリネームしたシングルバイト名に置換
    .git\logs\refs\heads のjpブランチファイルから最新のコミットIDをコピー
    .git\refs\heads のjpブランチファイルにコピーしたコミットIDを貼り付けて保存
    SourceTreeでリポジトリを更新

    この度は一つ一つ丁寧にお教えいただき、本当にありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る