Gitコマンド入門::Gitオブジェクト(Refspec,fetch)第六十一回
みなさんこんにちは! Refspec の今回は、fetch をやっていきますね! 前回は、pushを学習しましたね。本家サイトとは、順番が逆になってしまいましたが、基本は今回も本家サイトに沿って進めて行きま~す!
前回、第六十回の記事はこちらから!
git本家本元の情報はこちらから!
今回からの課題は、ここを参考にしています!
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/*
// 注目するところは、ここ! ↑↑↑
<src>:<dst>
Refspec - src =
+refs/heads/*
・・・リモートブランチのHEADの全て/* - 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 で、一項目ずつ削除可能!
git config --unset remote.origin.fetch "master"
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 となりました!
それでは、今回はここまで、お疲れ様でした!
Discussion