# ブランチとタグの名前に含まれる特殊文字の処理

Git は、ブランチとタグの名前で許可される文字について非常に制限が少ないです。 コマンド ライン シェルから Git を使用する場合は、特殊文字をエスケープまたは引用符で囲む必要があることがあります。

## ブランチ名とタグ名について

多くのリポジトリでは、`main` や `update-icons` などの単純なブランチ名を使っています。 通常、タグ名も `v1.2.3` のようなバージョン番号などの基本的な形式に従います。 ブランチ名とタグ名の両方で、パス区切り記号 (`/`) を使って、`area/item` や `level-1/level-2/level-3` のように構造化することもできます。 いくつかの例外 &mdash; 名前の最初と最後にスラッシュを使わない、名前に連続したスラッシュを使わない、など &mdash; を除いて、Git にはブランチやタグの名前に使用できる文字の制約がほとんどありません。 詳細については、Git ドキュメントの「[git-check-ref-format](https://git-scm.com/docs/git-check-ref-format)」を参照してください。

## 特殊文字のエスケープが必要な理由

CLI を使っているとき、ブランチやタグの名前に、シェル環境にとって特別な意味を持つ特殊文字が含まれている場合があります。 これらの文字を Git コマンドで安全に使うには、引用符で囲むかエスケープする必要があります。そうしないと、コマンドが意図しない影響を受ける可能性があります。

たとえば、`$` 文字は多くのシェルで変数を参照するために使われます。 ほとんどのシェルは `hello-$USER` のような有効なブランチ名を、リテラル文字列 `USER` ではなく、単語 "hello"、ハイフン、変数 `hello-$USER` の現在の値の順に連続するものと解釈します。 ブランチ名に `$` 文字が含まれている場合、シェルがそれを変数参照として展開しないようにする必要があります。 同様に、ブランチ名にセミコロン (`;`) が含まれている場合、ほとんどのシェルはこれをコマンド区切り記号として解釈するので、引用符で囲むかエスケープする必要があります。

## ブランチ名やタグ名に含まれる特殊文字のエスケープ方法

特殊文字を含むほとんどのブランチやタグの名前は、`'hello-$USER'` のように、一重引用符で囲むことで処理できます。

* [Bash](https://www.gnu.org/software/bash/) シェルでは、文字列を一重引用符で囲むと、一重引用符内の文字リテラル値が保持されます。
* [Zsh](https://www.zsh.org/) は Bash と同様の動作をしますが、この動作は `RC_QUOTES` オプションを使って構成可能です。
* [PowerShell](https://microsoft.com/powershell) も一重引用符内の文字をリテラルとして扱います。

これらのシェルでは、主な例外はブランチまたはタグ名自体に単一引用符が含まれている場合です。 この場合は、シェルの公式ドキュメントを参照してください。

* [Bash のドキュメント](https://www.gnu.org/software/bash/manual/)
* [Zsh のドキュメント](https://zsh.sourceforge.io/Doc/)
* [Fish 資料](https://fishshell.com/docs/current/)
* [PowerShell のドキュメント](https://docs.microsoft.com/en-gb/powershell/)

## ブランチとタグの名前付け

可能であれば、特殊文字を含まないブランチ名やタグ名を作成してください。これらはエスケープする必要があります。 ブランチ名とタグ名に使う、安全な既定の文字セットは次のとおりです。

* 英語のアルファベット (`a` から `z`、`A` から `Z`)
* 数字 (`0` から `9`)
* 限定された句読点文字のセット:
<!-- markdownlint-disable GHD034 -->
  * ピリオド (`.`)
  * ハイフン (`-`)
  * アンダースコア (`_`)
  * フォワードスラッシュ (`/`)
<!-- markdownlint-enable GHD034 -->

混同を避けるために、ブランチ名は文字で始める必要があります。

## GitHub における名前の制限

GitHub では、少数のブランチおよびタグ名のプッシュ アップが制限されています。
それらの制限は次のとおりです。
* 実際の Git オブジェクト ID との混乱を防ぐために、Git オブジェクト ID (0 から 9 と A から F のみを含む 40 の文字) と似た名前は許可されていません。
* Git refs との混乱を避けるために `refs/` で始まる名前は許可されていません。 参照の詳細については、「[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)」(Git の参照) を参照してください。