Posted at

【Git】SourceTreeで階層構造のブランチ作成がエラーになる対処法

More than 1 year has passed since last update.


はじめに

Gitを視覚的に利用できるSourceTree。私も便利に利用させていただいているのですが、ちょっと躓いた箇所があったので対処法をメモしておきます。


概要

ブランチを作成するにあたってブランチ名を入力する際、hghg/fgfgとスラッシュを入れることで、SourceTreeが自動でブランチを階層表示してくれるようになります。

この時hghgというブランチを作成してからhghg/fgfgブランチを作成しようとするとエラーになります。


git -c diff.mnemonicprefix=false -c core.quotepath=false branch hghg/fgfg

error: unable to create directory for .git/refs/heads/hghg/fgfg

fatal: Failed to lock ref for update: No such file or directory

エラー終了しました。エラーの内容は上記をご覧ください。


原因は、ブランチが管理されるフォルダ内で同名のファイル/フォルダ(このケースではhghg)を作成できないからでした。

対処法としては、hghgブランチをhghg/allなどに名前変更し、階層の中に入れることで解決します。


原因の詳細

hghg/fgfgブランチを作成しようとした場合、ブランチが管理されるフォルダ(.git\refs\heads)内では「hghg」というフォルダが作成され、その中で「fgfg」というファイルが生成されます。

しかし最初にhghgブランチを作成すると、headsフォルダにファイル「hghg」が作成されるため、hghg/fgfgブランチを作成するときに「一つのフォルダ内で同じ名前のファイルとフォルダは共存できない」ルールに引っかかってhghgフォルダが作成できなくなります。

hghgフォルダが作成されなかったのだから、「hghgフォルダにfgfgファイルを作成」という命令は通りませんよね。存在しない場所にモノを作ることはできません。


事の発端

私はリポジトリを作成後、masterブランチはとりあえず置いておいて、developブランチを作成しました。

更にfeatureブランチを作ってそちらに移動し、いくつかのフォルダを用意したり、空のスクリプトを作成して開発の準備を進めました。

そしていざ個々の機能を作り始めようと「feature/camera」というブランチを作成しようとしたところ、このエラーに当たったのです。

普段からGitに使い慣れている方ならまず起こさないであろう初歩的なエラーでしたが、これからGitやプログラミングを勉強し始める方々がここで立ち止まったり挫折してしまうのは大きな機会損失になるなと思い、Qiitaにまとめることにした次第です。


前提の知識

先述の通り、初心者を意識した記事としておりますので、この記事を読むために必要な情報をまとめておきます。

他に読んでいて分からないことがありましたらコメント等で質問していただけたら追記しようと思います。


ファイルとフォルダの違い

ファイルとフォルダは似ている名前ですし、コンピュータに詳しくない方は混同されているケースもよく見られます。

写真や音楽のように、一つ一つにデータが格納されている状態のものをファイルと呼びます。各ファイルは(中身が空の場合を除いて)蓄えているデータ分の容量を持っています。

一方フォルダは、複数のファイルまたはフォルダを格納するための入れ物であり、これ自体は容量を持っていません。

「このフォルダは○○GBの容量があります」などと表示される場合は、そのフォルダの中に含まれるすべてのファイルの容量の合計を表しています。


拡張子について

ファイルには「.exe」「.mp3」といった「拡張子」が付けられていることがほとんどですが、当記事で扱うブランチ情報を格納したファイルには拡張子はありません。拡張子がなくてもファイルとして存在は可能なのです。

拡張子はOSの設定によっては非表示になっている場合がありますが、表示するようにしておくと、例えアイコンが設定されていないファイルでも、その種類がひと目で分かるようになります。

また、非表示設定にしているユーザーをターゲットとしたウイルスファイル(「file.mp3.exe」などの名前で、拡張子を非表示にするとfile.mp3と表示される)なども存在するため、常に表示しておくに越したことはないでしょう。


フォルダとディレクトリの違い

同じと考えて差し支えありません。

MacのターミナルやWindowsのコマンドプロンプトなでどコンピュータをコマンド操作する際には「mkdir(make directoryの略)」などの呼び方が使われるので、ディレクトリと言われたらフォルダのことだなと覚えるようにしておくと何かとスムーズです。


.gitフォルダが見つからない

OSの設定で、隠しフォルダや隠しファイルが非表示になっているのでしょう。これも設定を変えれば表示されるようになります。

今回の原因が特定できたのは隠しフォルダである.gitフォルダが表示されており、中身を参照できたからですし、他にもブラウザのキャッシュデータを参照したり、ゲームのセーブデータをコピーしたりと便利に利用することが可能です。

ただし、隠しフォルダや隠しファイルなどは、ユーザーがうっかり変更、削除するとシステムトラブルになるデータを保護する目的で隠されている場合がほとんどですので、よく分からない隠しフォルダや隠しファイルを目障りだからと破棄するのはやめておきましょう。


参考

ブランチの効果的な利用について、こちらの記事で丁寧に解説されておりましたので紹介させていただきます。

Gitの教本などで「こうやってブランチを分けられるんだよー」と言われても、具体的にどう活用すればいいのか分からない......そんな方にオススメです。

Gitのブランチモデルについて