“GitLabまとめ“の”GitLabを用意”で、テスト用のリポジトリが用意できました。
今回は、ローカルリポジトリを作成するまでを実施し、何が起きているか理解します。
gitクライアントは、macに入れたgitコマンドです。
“GitLabまとめ“で用意したのは下記です。
- グループ”mygrp”
- 開発ユーザ”monkey”と”dog”で、mygrpへ権限付与
- プロジェクト”projectx”へリポジトリ作成しプロテクト解除
これから、GitLabに作成したリモートリポジトリから、それと連携するローカルリポジトリを作成します。
下記の2通りありますが、”git clone”を使わないほうが勉強になるかと思います。
- “git clone”で一括作成
- “git branch”などで順次作成
この記事の目次
git clone で一括作成
git cloneで、リモートリポジトリからローカルリポジトリを一括作成します。git cloneでいろんなことが裏で実施されます。
主に下記の画像のようなことが起きています。
まずは、git cloneして、どんな状態になるか理解します。
まずは git clone
下記のように、git cloneすると、プロジェクト名のディレクトリ”projectx”ができ、そこにリモートリポジトリのmasterブランチの内容が取得できている状態になります。
$ git clone http://gitlab.monkey.local/mygrp/projectx.git
どんな状態になっているか
ディレクトリへ入って、リモートリポジトリの状態を確認して理解していきます。
$ cd projectx
リモートリポジトリ
“git remote”で、出来上がったprojectxに設定されているリモートリポジトリを確認できます。”-v”で詳細です。
$ git remote -v
origin http://gitlab.monkey.local/mygrp/projectx.git (fetch)
origin http://gitlab.monkey.local/mygrp/projectx.git (push)
“origin”という名前で、”http://gitlab.monkey.local/mygrp/projectx.git”のサーバにあるリポジトリが設定されています。”origin”は、git cloneが設定するデフォルトの名前です。git pullなどのコマンドでリモート名を省略すると、”origin”を使うなどデフォルトの名前としてgitで使われているものです。
originはリモートリポジトリ(サーバのリポジトリ)のエイリアスと理解できていればよいです。
ブランチ
“git branch”で、ローカルのリポジトリにあるブランチを確認できます。”-a”はリモートとローカル両方です。”-r”はリモートで、指定しない場合はローカルのみです。
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
“master”がローカルブランチで、”remotes/xxx”がリモートブランチです。
まず、リモートブランチは、”リモート追跡ブランチ”と呼ばれ、リモートリポジトリの状態を追跡するためのブランチです。例えば、この”remotes/origin/master”をfetchすれば、サーバのmasterブランチの最新の情報をとってこ来れます。
“remotes/origin/master”は、”origin(リモートリポジトリのエイリアス)”のmasterブランチのことを示しています。リモートリポジトリにmaster以外のブランチがあれば、それらも表示されます。
注意としては、あくまでもcloneしたときのoriginにあったブランチが表示されるだけです。つまり、ローカルリポジトリにあるリモートブランチをリストアップしているだけで、サーバの最新のブランチ一覧を表示しているわけではありません。
clone後に追加されたブランチを、ローカルリポジトリに追加したい場合は、”git fetch origin”とリモートブランチ”origin”をfetchする必要があります。(ブランチ名がわかっているなら”git fetch origin
次に、ローカルブランチは、作業用に作成されているローカルブランチで、ローカルブランチ作成時はリモートブランチのどれかを指しています。作業開始時には、リモートブランチとローカルブランチは同一です。ローカルでcommit等をすると、ローカルブランチが先に進み、また、誰かがリモートブランチの示しているサーバのブランチを更新して、それをfetchすれば、リモートブランチは別のパスを進みます。
ローカルブランチがどのリモートブランチを指しているか(指していたか)を確認するには、”-vv”を指定します。
[~/tmp/clone/projectx] $ git branch -vv
* master 1100259 [origin/master] 管理者でREADME.mdを追加。
ローカルブランチ”master”は、リモートブランチ”origin/master”を指していることがわかります。
最後に、”remotes/origin/HEAD -> origin/master”ですが、これはリモートリポジトリのHEADで、”git push”等でブランチ名を省略した場合に、このHEADのブランチが使用されます。”git remote set-head”で変更できます。
作業中ブランチ(ローカルのHEAD)
先程の下記ブランチ一覧で”*”がついているのが作業ブランチです。よく言うHEADのことです。
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
この場合、ローカルブランチ”master”をHEADが指しており、このブランチで作業中ということです。”git checkout”で作業ブランチ(HEAD)を切り替えることができます。
先程のリモートブランチでもHEADが出てきましたが、それとは別ものです。
- ローカルブランチのHEADは作業中のブランチのことで、”git checkout
“で切り替える。 - リモートブランチのHEADはpushやpullのリモート操作のときのデフォルトのブランチのことで、”git remote set-head”で切り替える。
と私は理解してますが、明確に整理されているのを見たことがないので、間違っているかもしれません。そもそも、リモートのHEADは理解しなくていいんですが、省略してしまうといつの間にか使っていることになります。
“git branch”などで順次作成
下記の図のgit cloneと同じことをgit remote add, fetch, branch, checkoutというように、1つずつ細かいステップで作っていきます。
git init (事前準備)
まずは、空のローカルリポジトリを作成します。
[~/tmp]$ mkdir monkey/projectx
[~/tmp/monkey/projectx]$ cd monkey/projectx
[~/tmp/monkey/projectx]$ git init
開発ユーザ”monkey”の設定を、初期化したローカルのリポジトリに反映します。
–localにしています。これはローカルリポジトリのディレクトリのみに反映します。–globalとするとログインユーザに反映してしまうので注意してください。
[~/tmp/monkey/projectx] $ git config --local user.name "monkey"
[~/tmp/monkey/projectx] $ git config --local user.email "monkey@monkey.local"
ここまでで、空のワーキングツリー(ワーキングディレクトリ)と空のローカルリポジトリができました。
git remote add (リモートリポジトリを追加)
次は、このローカルリポジトリに、リモートリポジトリを設定します。
[~/tmp/monkey/projectx] $ git remote add origin http://gitlab.monkey.local/mygrp/projectx.git
リモートリポジトリの設定内容を確認してみます。
[~/tmp/monkey/projectx] $ git remote -v
origin http://gitlab.monkey.local/mygrp/projectx.git (fetch)
origin http://gitlab.monkey.local/mygrp/projectx.git (push)
ここまでで、ローカルリポジトリにリモートリポジトリの設定ができました。
git fetch (リモートリポジトリをローカルへ反映)
上記のremoteでは、リモートブランチ”projectxのmaster”をoriginで登録しただけです。
まだローカルリポジトリには、何も持ってきていません。設定しただけです。
リモートブランチをローカルブランチに持ってくるのがfetchです。
まずは、ブランチを確認してみましょう。
[~/tmp/monkey/projectx] $ git branch -a
結果は何も表示されません。’-a’はローカル、リモートの両方のブランチを表示するオプションです。
では、fetchしてみましょう。”git remote add”で登録した”origin”をfetchします。
[~/tmp/monkey/projectx] $ git fetch
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From http://gitlab.monkey.local/mygrp/projectx
* [new branch] master -> origin/master
[~/tmp/monkey/projectx] $ git branch -a
remotes/origin/master
リモートの”projectxのmaster”ブランチがfetchできました。
“git branch -a”は、GitLab上にあるgit serverを見に行っていないことがわかりましたか?fetchして初めて一覧にでてきます。つまり”git branch -a”はローカルリポジトリにある、リモートブランチの情報なのです。
また、”git fetch”と入力しました。本当は、”git fetch
[~/tmp/monkey/projectx] $ git fetch origin
ここまでで、ローカルリポジトリにリモートリポジトリの最新化ができました。
git branch (ローカルリポジトリを作る)
ローカルリポジトリ”master”を、リモートリポジトリ”origin/master”を上位に作ります。
“git branch
[~/tmp/monkey/projectx] $ git branch master origin/master
Branch 'master' set up to track remote branch 'master' from 'origin'.
出来上がったブランチ(ローカル/リモート)を確認しましょう。
[~/tmp/monkey/projectx] $ git branch -a
* master
remotes/origin/master
[~/tmp/monkey/projectx] $ git branch -vv
* master 1100259 [origin/master] 管理者でREADME.mdを追加。
“master”ができ、ローカルのHEADも”master”になっています。HEADがマスターになるのは、今までローカルブランチがなく、HEADがなかったので、1つ目のローカルブランチが出来たためです。通常は次の”git checkout”をしないとHEADは移動しません。
ここまでで、ローカルリポジトリにローカルブランチができました。
git checkout (作業ブランチを変える)
あとは、作成したローカルブランチを作業ブランチに変更するだけです。作業ブランチが変更されれば、ワーキングツリーにそのスナップショットが反映されます。
作業ブランチを切り替えるのは”git checkout”でできます。
[~/tmp/monkey/projectx] $ git checkout master
Already on 'master'
Your branch is up to date with 'origin/master'.
これで、ワーキングツリーにリポジトリのファイルが複製されます。GitLabで作成した”README.md”が作成されています。
[~/tmp/monkey/projectx] $ ls
README.md
[~/tmp/monkey/projectx] $ cat README.md
これはgitクライアントをテストするためのプロジェクトです。
ここまでで、ほぼgit cloneで裏で動いていた処理を実行し終えました。
git cloneとの差
まだ、git cloneとの差があります。リモートブランチのHEADがない状態です。
pushなどでブランチを省略しなければ必要ない設定ですが、下記のように”git remote set-head”を実行すれば設定できます。
[~/tmp/monkey/projectx] $ git branch -a
* master
remotes/origin/master
[~/tmp/monkey/projectx] $ git remote set-head origin master
[~/tmp/monkey/projectx] $ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
まとめ
長くはなりましたが、これでローカルにリポジトリを作って、作業ブランチが準備できました。
GitLabまとめ記事へのリンク
GitLabの他のネタを纏めています。参考になれば嬉しいです。
↓↓↓GitLabまとめページはこちら↓↓↓
【保存版】GitLabまとめ