【Git】refspecを世界一かみくだいて説明する

  • 2022年1月31日
  • 2022年1月12日
  • Git

Push/Pullで実は必ず活用している、Gitにおける「refspec」の概念を紹介します。なおここでは、Gitのpush/pullについての解説はしません。

refspecとは?

git pushをする場合を考えます。初学者さん向けの記事では、その構文は以下のように書かれていると思います。

$ git push origin master

解説としては、「”origin”という名前で登録してあるGitHub上のリポジトリにmasterブランチをプッシュする」というかたちになるでしょうか。わたしも、新人さん向けにはそういう風に言うことが多いです。

が、ここではもう少し深掘りしてみたいと思います。4語目”master”の部分です。これは正確にはrefspec(多分reference specificationの略)と呼ばれるもので、「参照元と参照先との情報」を表しています。git pushの時には参照元=ローカルブランチで、参照先=リモートブランチです。git pullする際にはこの関係が逆になります。

上にあげたように”master”ひと単語で済ますのは、実はrefspecの省略記法で、以下のコマンドと同値です。

$ git push origin master:master

「ローカルのmasterブランチを、リモートのmasterブランチにプッシュする」ということですね。

こうしてみた時、何らかの事情でローカルに”master”ブランチがないにも関わらず、リモートのmasterブランチにプッシュするつもりでgit push origin masterすると、以下のようなエラーになります。

$ git push origin master
error: src refspec master does not match any

エラーメッセージの”src”(=source)は、refspecの参照元、つまり master:masterと正式に書いたときの左側を指します(ちなみに右側が”dst”=destinationです)。つまりこのエラーは、「おいジェームズ、ローカルには”master”ブランチないのに、そこを参照するように言ってくれちゃってるぜ?」と伝えてくれているのです(ジェームズは適宜読み換えてください)。なのでこの場合、(技術的には)以下のように対応できます。

# developブランチがローカルにあるという想定
$ git push origin develop:master

参考