ブランチを全部消してしまってもいいの？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35712/93d14ff5-a2e6-3cde-c8da-c4244de508cd.png)
photo by [Bridget McKenzie](https://www.flickr.com/photos/bridgetmckenz/)

Gitを使ったことがある人ならば、Gitにはブランチ（Branch）という便利な機能があるというのは誰もが知っていることだと思う。ただし、本当にブランチの概念を正確に理解出来ているのかについては疑問符が付く人もいることだろう。そこで、ブランチの削除に関するおバカ問題を3つ用意してみた。まずはちょっと下の問題について考えてみてほしい：

1. デフォルトの`master`ブランチって削除してもいいの？
2. どのブランチを消しちゃっても差し障りない？
3. じゃあ全部のブランチを完全に消しちゃってもいいの？

## そもそもブランチって何？

ブランチの削除について話す前に、まずはブランチとは何かを理解しなければならないだろう。一部の人はブランチというのは、ディレクトリをコピーしてくるようなものだと思っていて、だから修正をしても大元のブランチの内容には影響を及ぼさないと思っているようなのだが、実際のところブランチというのは小さな小さなファイルに過ぎず、言うなれば一枚の付箋のようなものであって、単にとあるコミット上に貼られているに過ぎない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35712/06f25f2d-9408-c1b1-8c65-247c117619ae.png)

この例でいえば、今のところ`dog`、`cat`とデフォルトの`master`3つのブランチは、それぞれ`053fb21`、`b174a5a`及び`e12d8ef`という3つのコミット上に貼られている。

（ブランチの使い方について、もっと詳しく知りたいという方は「[やりたいことが
今すぐわかる逆引きGit入門](https://amazon.co.jp/やりたいことが今すぐわかる-逆引きGit入門/dp/4798059595/)」のブランチの章をご参照下さい。）

## じゃあブランチを消してしまったら…？

ブランチというのはとあるコミット上に貼られた付箋のような存在に過ぎないので、ブランチを削除するというのは付箋を剥がすようなものだと思ってもらって構わない。だから、付箋は剥がされてしまったからといって、元々のコミット自体が消えてしまうようなことにはならない。単に姿が見えなくなってしまったというだけで、実はひっそりとGitの海を漂っていて、見つかりにくい存在になってしまっただけなのだ。

（もし消してしまったブランチを救い出してあげたい時には、「[やりたいことが
今すぐわかる逆引きGit入門](https://amazon.co.jp/やりたいことが今すぐわかる-逆引きGit入門/dp/4798059595/)」の【どーする？】うっかりマージしてないブランチを消しちゃったんだけど、助かる方法ありますか？ 」の章を参照して下さい。）

と、ここまで書いてきたのだが、ここまででブランチに対する正確な概念を理解することが出来たのであれば、きっと「救い出す」という言い方では正確さに欠けることに気づいたのではないだろうか。正確に言えば「もともとブランチという付箋を貼り付けていた某コミットを探し出してくる」というような言い回しになるだろう。

## デフォルトのブランチ

`master`ブランチというのはGitにおけるデフォルトのブランチだ。だが、実のところこのブランチ、その正体は普通のブランチに過ぎず、ただ単に`master`と呼ばれているだけだったする。ということは、`master`と呼ばれていること以外に特別なことは何もないので、名前を変更しようが消してしまおうが、何も問題はない。
ということは、どんなブランチでも削除しちゃっていいってこと？

これは…状況によりけりだろう。例えば、自分が今いるブランチは消せないように、とある状況下では幾つかのブランチはどうしても消せないということが起こり得る：

    $ git branch
      cat
      dog
    * master

ちょうど今`master`ブランチにいるので、もし無理やり削除してしまった場合、このようなエラーメッセージが出てくるだろう：

    $ git branch -D master
    error: Cannot delete branch 'master' checked out at '/tmp/git-practice'

例えて言うならば、ちょうど今`master`上に足を置いているので、もしこの`master`を外してしまうと自分の足場が無くなって立てなくなってしまうというようなイメージだ。ただそ、だからこの`master`ブランチは消せないのかと言えば、そういうわけではない。単にブランチを切り換えてしまえばいいだけのことなのだ：

    $ git checkout cat
    Switched to branch 'cat'

    $ git branch
    * cat
      dog
      master

    $ git branch -D master
    Deleted branch master (was e12d8ef).

先にブランチを切り換えておいて、後は刀を片手に振り向いて、バサッと！

## 全部消してしまえ～！

ブランチがどういうものかわかってくると、どんなブランチでも消してしまえることが分かってきたのではないだろうか。と、ここで最初に出した問題のうちの最後の一つ「じゃあ全部のブランチを完全に消してしまってもいいの？」という微妙なテーマについて見ていこう。

まあ、先に答えを言ってしまうと、うん…まあ削除してしまってもいいよ。ということになるだろう。ただし、消していくと最後に「今現在いるブランチは消すことが出来ない」という状況が起こるので、そこまで来たらブランチのないコミットにCheckoutして削除を実行すればいい。（この時「detached HEAD」状態になる）上の例でいえば直接`053fb21`というコミットに切り替えて削除を実行すればいい（元々 dog ブランチと名付けられていたコミットのこと）：

    $ git checkout 053fb21
    Note: checking out '053fb21'.

    You are in 'detached HEAD' state. You can look around, make experimental 
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.

    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:

      git checkout -b <new-branch-name>

    HEAD is now at 053fb21... add dog 2

すると、このようなメッセージが表示されるのだが、これは決してエラーメッセージではないので怖がらなくて大丈夫。 detached HEAD 状態については「【豆知識】detached HEADってどういうこと？」の章を参照してもらいたい。

さて、これでブランチがどうなったのかというと：

    $ git branch
    * (HEAD detached at 053fb21)
    cat
    dog

`cat`ブランチにも`dog`ブランチにもいない。`master`も削除してしまったのでない。ということで、ここで大技！：

    $ git branch -D cat dog
    Deleted branch cat (was b174a5a).
    Deleted branch dog (was 053fb21).

さて結果を見てみよう：

    $ git branch
    * (HEAD detached at 053fb21)
    
これで全てを削除することが出来た！

## っていうか、なんでブランチ全部消してんの？これって何か意味あるの？

意味ですか？意味なんてありません。単なるおふざけです！（えー！）

## メッセージ大歓迎です

Git に関する難問疑問、こういうケースだとどうなる？というような応用問題、どんなことでも構いません、メール・メッセージで、どんどん聞いて下さい。もし、メッセージ欄では答えきれないという場合は、後日整理して新しい記事をアップしていきたいと思っています :)