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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Q&A

解決済

1回答

9504閲覧

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

nelpesica

総合スコア159

SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

0グッド

1クリップ

投稿2020/07/16 02:32

編集2020/07/20 02:45

前提・実現したいこと

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(バックアップする)

  1. リポジトリをProjectFolderの同層へclone

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

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

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

  1. C:\Users[ProjectFolder]内の.gitフォルダ以外のファイルをどこかに退避
  2. SourceTreeでブランチをダブルクリックすると履歴が復活
  3. 退避したファイルを元に戻して上書き(コミットされていない差分が復活)

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

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

  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ブランチが復活

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2020/07/17 01:13

症状がよくわからないのですが、いったん閉じて(タブの×印)、ファイル→開く→レポジトリの選択、で開きなおしたら治らないでしょうか。
nelpesica

2020/07/17 01:27

コメントありがとうございます。 リポジトリはいくつかあるのですが、その中の1つが本件の症状になっております。 「試したこと」としてbsdfanさんの手順も試してみましたがブランチは消えたままです。 現状、「新規にリポジトリを作成した状態」とほぼ同じなのですが、退避させていたスタッシュ情報だけ残っています。
bsdfan

2020/07/17 01:31

コマンドラインでの作業になるのですが、 git branch -a と git status を確認できますか
nelpesica

2020/07/17 01:36 編集

カレントディレクトリは.gitフォルダで良かったでしょうか? コマンドの結果は以下です。 C:\Users\[ProjectFolder]\.git> git branch -a * master C:\Users\[ProjectFolder]\.git> git status fatal: this operation must be run in a work tree
bsdfan

2020/07/17 01:37

git status は .git のひとつ上で実行してください。 ブランチはmasterひとつだけというのは、もとからそうですか?
nelpesica

2020/07/17 01:50 編集

元のブランチは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 02:05

.git/refs/heads に、[ブランチ名].lock というファイルがあります? もしあれば、.lock を取り除いた [ブランチ名] だけに変更してみてください。 (作業前に、レポジトリ全体を別のディレクトリにコピーしてバックアップしておくほうが安全です)
nelpesica

2020/07/17 02:15

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

回答1

0

ベストアンサー

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 04:44

bsdfan

総合スコア4560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nelpesica

2020/07/17 06:31 編集

回答ありがとうございます。 以下の手順1~3までを行いブランチ名は表示されるようになりました。 手順1. C:\Users\ └[ProjectFolder] │└.git(バックアップする) 手順2. git clone C:\Users[ProjectFolder] ../newProjectFolder C:\Users\ ├[ProjectFolder] │└.git(バックアップした) ├newProjectFolder(新しく作った) │└.git(cloneした) 手順3. C:\Users\ ├[ProjectFolder] │└.git(cloneしたフォルダで上書き) しかしコミットの履歴は復活していません。 手順4をもっと詳しく教えていただけますか? --- 以下、SourceTreeでブランチをダブルクリックして表示されたエラーです。 git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks checkout master --progress error: The following untracked working tree files would be overwritten by checkout: index.php(その他ディレクトリにあるphpファイルなど) Please move or remove them before you switch branches. Aborting
bsdfan

2020/07/17 06:41 編集

手順3のあと、 git reset --hard してみてください。 手順4は履歴がちゃんと見えるようになった後の話なので・・・ 3までで治ってなければ、よくわからないです。 もし、newProjectFolderのほうで履歴が見えていたら、そちらに乗り換えてしまうのも手だと思います。
nelpesica

2020/07/17 07:03 編集

git reset --hard をしてみましたが、何も返ってきません。 ちなみにnewProjectFolder/.gitにはlogフォルダがありませんでした。 またnewProjectFolder/.git/refs/headsフォルダにもブランチ名はありませんでした。
bsdfan

2020/07/17 06:53

git reset --hard のあと、sourcetree でブランチをダブルクリックしたらそのブランチが展開されませんか? cloneしたほうの .git では、.git/packed-refs にブランチのハッシュがまとめられているはずなので、.git/refs/heads はカラかもしれません。
nelpesica

2020/07/17 07:06 編集

.gitにカレントディレクトリを移動してgit reset --hard をしたら以下が表示されました。 fatal: this operation must be run in a work tree --- ブランチをダブルクリックしたら先程と同じエラー文が表示されましたが、 リモートを開いたらoriginが見つかりました。 リモート └origin │└master こちらのmasterブランチをダブルクリックしたら ・既存のブランチをチェックアウト ・新規ブランチを作成してチェックアウト のモーダルが表示されました。
bsdfan

2020/07/17 07:16

error: The following untracked working tree files would be overwritten by checkout のエラーは、チェックアウトしようとするファイルと、既存のファイルと衝突しているからです。 乱暴ですが、既存のファイル(.git以外)を全部消せば大丈夫なはずです。 そのうえでブランチをチェックアウトしてみてはどうでしょうか。 ・新規ブランチを作成してチェックアウト、を選びます。 (なにかあったとき、バックアップから元に戻せるようにした上で、実行してくださいね)
nelpesica

2020/07/17 07:31 編集

.git以外を退避してブランチをダブルクリックしたらブランチが復活しました! (リモートのoriginは触ってません) その後、退避したファイルを戻したらコミットされていない変更も反映されました。 ただ、master以外にもいくつかあったブランチは復活しているのですが、 日本語(マルチバイト)名のブランチが表示されていません。 .gitフォルダの中に存在はしているのですが、こちらを復活させるにはどうしたら良いでしょうか?
bsdfan

2020/07/17 11:31 編集

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

2020/07/20 01: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でリポジトリを更新 この度は一つ一つ丁寧にお教えいただき、本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問