こんちくわ。
皆さんはGit
ってどれぐらい理解してますか??
私はずっと生粋の何となくスタイルなので、10分の1も理解してないです。コミット出来てプッシュできればそれでいいと思ってますし、後輩に教える時もそんな感じなので信頼が失墜しています。
私はここ1年、下記みたいなブランチ名を疑いもせず量産していました:
issueHoge/fuga
feature/login
bugfix/header
スラッシュって“モダン感”あるじゃないですか。知らんけど。
今まで実務ではケバブやスネークケース(update-icons
やfeature_hoge
)で命名してました。
しかしネットサーフィン中にスラッシュ区切りのブランチ命名をしてるサイトを見て「なにこれカッコいい☆彡」なんてふざけた印象を持ち、プライベートではもっぱらこの命名で脳死開発してました。
でも先日「issue94/2(issue94 の 2 周目ブランチっていう安直ネーミング)」を push したらコケました:
error: failed to push some refs to 'github.com:your-repo.git'
! [remote rejected] issue94/2 -> issue94/2 (cannot lock ref 'refs/heads/issue94/2': 'refs/heads/issue94' exists; cannot create 'refs/heads/issue94/2')
えっ、"cannot lock ref" とは?
私の脳内:「は?????」
英語をちゃんと読めばある程度察せるのですが
雑に言うと 「ファイルとして存在するのにフォルダも作ろうとしたら怒られた」 です。
Git「もうissue94がいるのに同名のフォルダ作れねえよ炙るぞてめえ」
私「す、すいやせん...」
Git はブランチ情報を .git/refs/heads/
以下にパス階層として保存します。
feature/login → .git/refs/heads/feature/login
bugfix/header → .git/refs/heads/bugfix/header
``` :contentReference[oaicite:0]{index=0}
なので、 issue94
というブランチ(=ファイル)がある状態で
issue94/2
(=ディレクトリ+ファイル)を作ろうとすると
ファイルとして存在するブランチ名をディレクトリとして扱おうとしてしまい
「ファイルとフォルダがバッティングして無理!」と Git がキレるわけです。
...てか、階層の概念は/
区切りの時点で察するべきでした。てへ。
試しにfeature/OO
をいくつか量産してみます。
$ git branch
develop
* feature/aa
feature/bb
feature/oo
そして.gitをlsで覗いてみると、
$ ls .git/refs/heads/
develop feature/
$ ls .git/refs/heads/feature/
aa bb oo
こんな感じで確かにブランチが/
区切りで階層化されてますね。
学びと対処法
-
“親子”関係がかぶると作れない
- 例:
issue94
がいるとissue94/2
は NG。
- 例:
-
どうしても
issue94/2
が欲しい場合-
issue94
を消す or リネーム (issue94-old
)git branch -m issue94 issue94-old # ローカル git push origin --delete issue94 # リモート
-
もしくはハイフン形式に変更 (
issue94-2
)
-
-
そもそも最初から“親”をフォルダ化前提で作る
-
issue/94
のように カテゴリ先頭 を置くと、下にいくらでもぶら下げられる。
-
おまけ:おすすめ命名テンプレ
用途 | 例 |
---|---|
機能追加 | feature/user-login |
バグ修正 | bugfix/email-sending |
緊急パッチ | hotfix/critical-prod-bug |
ドキュメント | docs/readme-typo |
タスク番号 | task/issue-xx |
issue | issue/xx |
まとめ
スラッシュはただのカッコ良さじゃなく内部構造に直結していた
これからは “なんとなくスラッシュ族” から “構造理解派スラッシュ使い” へクラスチェンジします。
そして怒られたら まずエラーメッセージ読む コレに尽きます。
なんとなくでGithubを使ってるので、今後もこういうボロは出続けるのでしょうね。
まあここらへんでも読み返したら少しは錆が抜けるでしょうか。
おわり。あーねむ