🏹

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

2021/03/25に公開

みなさんこんにちは! Refspec の今回は、fetch をやっていきますね! 前回は、pushを学習しましたね。本家サイトとは、順番が逆になってしまいましたが、基本は今回も本家サイトに沿って進めて行きま~す!

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

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

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

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

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

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

10.5 Gitの内側 - Refspec

学習のポイント

そういえば、前回も伝えるのをすっかり忘れていましたね。要するに学習のポイントは、ローカルブランチと、リモートブランチ名が異なった場合、push,fetch の処理ってことですね。通常は、ローカルブランチをプッシュする時、同じ名前のリモートブランチになるのが、一般的ですよね。ただ、そうでない場合も時にはあるということ、それを想定しての学習です!

まずは、環境構築から!

$ mkdir func0061 && cd $_

$ git init

// 私のリポジトリーは、こちらからからどうぞ!
$ git remote add origin https://github.com/shiozumi-makoto/20210319.git

$ git remote -v
origin  https://github.com/shiozumi-makoto/20210319.git (fetch)
origin  https://github.com/shiozumi-makoto/20210319.git (push)

$ git fetch --all

// 中略~

From https://github.com/shiozumi-makoto/20210319
 * [new branch]      master     -> origin/master

$ git branch -avv
  remotes/origin/master 7ceaea0 new.txt add

ここまでは、いつもの通り、特に問題ありませんね!
現状では、ローカルブランチはありません。リモート追跡ブランチorigin/masterのみですね。

$ cat .git/config で、確認!

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

// 注目するところは、ここ! ↑↑↑ 

Refspec <src>:<dst>

  1. src = +refs/heads/* ・・・リモートブランチのHEADの全て/*
  2. dst = refs/remotes/origin/* ・・・リモート追跡ブランチの全て/*

git config --unset-all remote.origin.fetch

まずは、一度、fetch = の設定を全て削除します。

[remote "origin"]
        url = https://github.com/shiozumi-makoto/20210319.git

// fetch = が一括で全て削除されました!

git config --add で、フェッチ設定を2項目追加!

git config --add remote.origin.fetch "+refs/heads/master:refs/remotes/origin/master"
git config --add remote.origin.fetch "+refs/heads/test_1:refs/remotes/origin/test_1"

$ git config --add remote.origin.fetch "+refs/heads/master:refs/remotes/origin/master"

$ git config --add remote.origin.fetch "+refs/heads/test_1:refs/remotes/origin/test_1"

$ cat .git/config
[remote "origin"]
        url = https://github.com/shiozumi-makoto/20210319.git
        fetch = +refs/heads/master:refs/remotes/origin/master
        fetch = +refs/heads/test_1:refs/remotes/origin/test_1

// fetch= 2行が無事追加されました!

git config --unset で、一項目ずつ削除可能!

  1. git config --unset remote.origin.fetch "master"
  2. git config --unset remote.origin.fetch "test_1"

リモートmasterブランチを、ローカルにチェックアウト!

$ git checkout -b master origin/master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'

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

今度は、ローカルmaster から、ローカルtest_1ブランチを作成してみます!

$ git checkout -b test_1
Switched to a new branch 'test_1'

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

今度は、ローカルtest_1ブランチが、リモートのtest_1ブランチを追跡するようにします。

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

$ cat .git/config
[remote "origin"]
        url = https://github.com/shiozumi-makoto/20210319.git
        fetch = +refs/heads/master:refs/remotes/origin/master
        fetch = +refs/heads/test_1:refs/remotes/origin/test_1
        push = +refs/heads/test_1:refs/heads/test_1
	
// push = 3行目が追加されました!
// これで、git push origin の省略形式でも、
// ローカルのtest_1 がリモートにプッシュされます!

git push origin 省略形で、push

$ git push origin

// 中略~

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

$ git branch -avv
  master                7ceaea0 [origin/master] new.txt add
* test_1                7ceaea0 new.txt add <!-- upstream 未設定
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test_1 7ceaea0 new.txt add

// 無事に、test_1ブランチを、push
// リモート追跡ブランチ origin/test_1 も作成されました!
// 但し、-u, --set-upstream-to を付けないで、push したので、
// ローカルtest1_1ブランチの上流ブランチは、未設定となっていますね。

git branch --set-upstream-to=origin/test_1

$ git branch --set-upstream-to=origin/test_1
Branch 'test_1' set up to track remote branch 'test_1' from 'origin'.

$ git config -l | grep branch.test_1
branch.test_1.remote=origin
branch.test_1.merge=refs/heads/test_1

$ git branch -avv
  master                7ceaea0 [origin/master] new.txt add
* test_1                7ceaea0 [origin/test_1] new.txt add <!-- upstream OK!
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test_1 7ceaea0 new.txt add

// これで、上流ブランチの設定も完了ですね! 

$ git config -l | grep branch.test_1
branch.test_1.remote=origin
branch.test_1.merge=refs/heads/test_1

// コンフィグファイルでも、上流ブランチ設定されています!

では、git push origin を実行!


// 新しく、README.md を作成して、中身は、"func0061"
$ echo "func0061" > README.md

// いつもの、add,commit
$ git add README.md
$ git commit -m "func0061"
[test_1 b695ca0] func0061
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

// ローカルtest_1ブランチのハッシュ値は、
// b695ca0 になりました!

// 現状を確認!
$ git branch -avv
  master                7ceaea0 [origin/master] new.txt add
* test_1                b695ca0 [origin/test_1: ahead 1] func0061
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test_1 7ceaea0 new.txt add

// それでは引数を省略して、push !
$ git push origin

// 中略~

7ceaea0..b695ca0  test_1 -> test_1
// 設定どおり、ローカルtest_1ブランチを、push しましたね!

$ git branch -avv
  master                7ceaea0 [origin/master] new.txt add
* test_1                b695ca0 [origin/test_1] func0061
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test_1 b695ca0 func0061

// ローカルtest_1ブランチのハッシュ値 = b695ca0
// リモート追跡ブランチorigin/test_1のハッシュ値 = b695ca0

まとめ

さあ、いかがでしょうか? git push origin 省略形コマンドで、ローカルtest_1ブランチが、push されましたね。ちなみに、もう少しはっきり区別したい場合は、origin ではなく、その他のエイリアスの方が、解りやすいかも知れませんね。remote add origin ではなく、remote add TEST_1 などでリポジトリーを設定するところから分けた方がいいかな?

$ git remote add TEST_1  https://github.com/shiozumi-makoto/20210319.git

$ git remote -v
TEST_1  https://github.com/shiozumi-makoto/20210319.git (fetch)
TEST_1  https://github.com/shiozumi-makoto/20210319.git (push)
// ↑↑↑ これで、origin 以外に、TEST_1 でも可能!

では、最後の最後に、復習も兼ねて、どうぞ!

$ git config --unset-all remote.TEST_1.fetch
// まずは、全て削除!

$ git config --add remote.TEST_1.fetch "+refs/heads/test_1:refs/remotes/TEST_1/test_1"
// git fetch TEST_1 の実行時の設定

$ git config remote.TEST_1.push "+refs/heads/test_1:refs/heads/test_1"
// git push TEST_1 の実行時の設定

$ cat .git/config

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

// TEST_1 の項目設定は、こんな感じになりましたね!
// 各自、みなさんでご自由に、add,commit してからの!

// こんな感じにファイルを編集!
$ cat README.md
func0061 + TEST

$ git add README.md
$ git commit -m "TEST_1"

$ git push -u TEST_1
// origin ではなく、TEST_1 で実行!
// -u = --set-upstream-to で、リモート追跡ブランチも同時に作成!

$ git branch -avv
  master                7ceaea0 [origin/master] new.txt add
* test_1                1c6933d [TEST_1/test_1] TEST_1
  remotes/TEST_1/test_1 1c6933d TEST_1
  remotes/origin/master 7ceaea0 new.txt add
  remotes/origin/test_1 b695ca0 func0061

// ハッシュ値が、1c6933d となりました!

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

https://zenn.dev/shiozumi/articles/6de6f93b7efa74
https://twitter.com/esmile2013

Discussion