🏹

Gitコマンド入門::Gitオブジェクト(Refspec)第六十回

2021/03/24に公開

みなさんこんにちは! 今回も引き続き、本家サイトになぞって進めて行きます!

本家サイトから抜粋:
refspecの書式は <src>:<dst> で、その前にオプションとして + を指定できます。+ は、fast-forwardでない場合でも、参照を更新するようGitに指示しています。

とまあ~、このようにサイトに書いてありますけど、早速、学習して行きましょう! ちなみに、本家サイトでは、git fetch から初めていますが、私は、git push を先に、git fetch は、次回の第六十一回で学習して行きま~す!(笑)

前回、第五十九回の記事はこちらから!

https://zenn.dev/shiozumi/articles/c6a4b1553ac075

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

今回からの課題は、ここを参考にしています!

https://git-scm.com/book/ja/v2/Gitの内側-Refspec

10.5 Gitの内側 - Refspec

まずは、環境構築から!

私のリポジトリーは、こちらからどうぞ! 第五十八回と同じです。

$ git clone https://github.com/shiozumi-makoto/20210319.git 20210324

$ cd 20210324

$ git branch -avv
* master                7ceaea0 [origin/master] new.txt add
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 7ceaea0 new.txt add

Refspecは、<src>:<dst> 形式!

$ cat .git/config

[remote "origin"]
        url = https://github.com/shiozumi-makoto/20210319.git
        fetch = +refs/heads/*:refs/remotes/origin/*

// ここ、fetch=以下の部分ですね。↑↑↑↑
//
// src => +refs/heads/*
// dst => refs/remotes/origin/*
  1. src は、GitHubにあるリモートリポジトリのヘッダーですね。
  2. dst は、ローカルにある、リモート追跡ブランチですね。
  3. heads/*,origin/* *アスタリスクとなっているので、複数指定となっています。

リモートリポジトリのmasterから、リモート追跡ブランチorigin/testを作成してみましょう!

$ git fetch origin master:refs/remotes/origin/test
 * [new branch]      master     -> origin/test

$ git branch -avv
* master                7ceaea0 [origin/master] new.txt add
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test   7ceaea0 new.txt add

リモート追跡ブランチorigin/testから、ローカルtestブランチ作成

$ git checkout -b test origin/test
Branch 'test' set up to track remote branch 'test' from 'origin'.
Switched to a new branch 'test'

$ git branch -avv
  master                7ceaea0 [origin/master] new.txt add
* test                  7ceaea0 [origin/test] new.txt add
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test   7ceaea0 new.txt add

ローカルtestブランチを、GitHubのリモートtestブランチ名で、push しま~す!

$ git push origin test:test

// 中略~

To https://github.com/shiozumi-makoto/20210319.git
 * [new branch]      test -> test

$ git branch -avv
  master                7ceaea0 [origin/master] new.txt add
* test                  7ceaea0 [origin/test] new.txt add
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test   7ceaea0 new.txt add

ローカルtestブランチを、GitHubのリモートリポジトリに、リモートtest_1ブランチ名で、push しま~す!

$ git push origin test:test_1

// 中略~

To https://github.com/shiozumi-makoto/20210319.git
* [new branch]      test -> test_1

$ git branch -avv
  master                7ceaea0 [origin/master] new.txt add
* test                  7ceaea0 [origin/test] new.txt add
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test   7ceaea0 new.txt add
  remotes/origin/test_1 7ceaea0 new.txt add
  
// リモート追跡ブランチ test_1 も追加されましたね!

<src>:<dst> 形式は、これで分かりましたね!

GitHubの画面でもこのように、testブランチ、test_1ブランチが作成されています!

git push origin <src>:<dst> を指定せずに省略して、pushしたときの動作を設定します。

通常は、git push origin test:refs/heads/test_1 のように、<src>:<dst> を指定しますが、省略形コマンド git push origin でも同じ動作にするための設定です。

$ git config remote.origin.push "+refs/heads/test:refs/heads/test_1"

// cat コマンドで確認
$ cat .git/config
[remote "origin"]
        url = https://github.com/shiozumi-makoto/20210319.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        push = +refs/heads/test:refs/heads/test_1
	
// config コマンドで確認!
$ git config -l | grep remote.origin.push
remote.origin.push=+refs/heads/test:refs/heads/test_1

git push origin ローカルtestブランチを、リモートtest_1ブランチへ、pushできるか、実際にテストしてみます。

// ファイルをviで開いて、任意のテキスト文字を追加!
$ vi README.md

// 毎度のadd,commit
$ git add README.md
$ git commit -m "push"

[test e09c3ef] push
// ローカルtestブランチのハッシュ値は、e09c3ef ですね!

// いよいよ、<src>:<dst> を省略して、push
$ git push origin

// 中略~

$ git branch -avv
* test                  e09c3ef [origin/test_1] push
  remotes/origin/test_1 e09c3ef push

// リモート追跡ブランチorigin/test_1のハッシュ値も、e09c3ef ですね!

GitHubのリモートtest_1ブランチのハッシュ値を確認!

git config --unset remote.origin.push このコマンドで設定を削除し、掃除して終了します!

$ git config --unset remote.origin.push

// cat コマンドで確認
$ cat .git/config

[remote "origin"]
        url = https://github.com/shiozumi-makoto/20210319.git
        fetch = +refs/heads/*:refs/remotes/origin/*

// push の設定が削除されました!

git push origin :test_1

<src>:<dst> 形式で、src を省略すると、リモートブランチの削除になります。

// リモートtest_1ブランチも削除してみましょう!
$ git push origin :test_1

// 中略~
- [deleted]         test_1

// これで、完了!

まとめ

Refspec は、<src>:<dst> で指定する。そして省略時のデフォルト設定は、remote.origin.push に記述すれば、そちらを優先してくれます。まあ~、それだけの事ですが、普段、git pushの使用頻度が高い場合、間違えて、ローカルmasterブランチ を、リモートmasterブランチにプッシュしてしまうような操作ミスを防ぐためには、とても有効かと思います。まあ~それも、ほぼ無いと思いますが、、、(^▽^;)

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/9c47ca39a03731
https://twitter.com/esmile2013

Discussion