【初心者向け】Gitってなに？④リモートリポジトリを作って一人でプッシュ＆プル

初心者のGit４回目、今回はPUSH&PULL、最終回です。

:hatching_chick: このシリーズについて :hatched_chick: 
初心者がGitのしくみと流れを把握することに重点を置いているので、することはコミット、プッシュ、プルに絞っています。まずはとにかく挫折せずに一周動かしてみるのが目標！というスタンスなので、その分コマンドの進め方などに注力した内容になってます。
***

gitを使った作業の流れをこんな感じで捉えて進めていきます。

1. 新規作成、もしくはリモートリポジトリからクローンして手元に自分のローカルリポジトリを作る。
2. 編集し、ローカルリポジトリにインデックスを経てコミットを作成。
3. これまでの変更履歴をローカルリポジトリからリモートリポジトリにプッシュして、自分の変更をアウトプット。
4. 他の人の変更をインプットするために、リモートリポジトリからプルをして変更履歴をダウンロード、自分のローカルリポジトリで編集を加え、１へ戻る

今回は3、４のパートです。

***

## リモートリポジトリ、どこ‥？

さて、前回までのところで、作成したファイルを（インデックスというワンクッションを経つつ）、自分のローカルリポジトリに追加ました。
**ローカルリポジトリに登録した事で、変更履歴であるコミットも生成された**ので、このファイルは今後いつでもこの状態に戻す事ができるようになりました。
なんだか安心感がありますね :relaxed: 

では今度はこれをプッシュして、リモートリポジトリ（共有のリポジトリ）にアウトプットしましょう。

ところで‥
皆様、実際にプッシュの実験ができるリモートリポジトリはありますか？独学で勉強中だったり、共同作業の相手がいないと実験できませんね。

ということで、作ってしまいましょう！

## ぼっち練用リモートリポジトリを作ろう
新しいリポジトリを作りましょう。コンソール画面に戻ってください。
今どこにいますか？"**pwd**"コマンドで、現在地が確認できます。
<img width="730" alt="pwd.png" src="https://qiita-image-store.s3.amazonaws.com/0/86088/da4e0562-19e3-d52e-d1ad-678ad7c15165.png">
まだ、さっきの（[第３回目](http://qiita.com/missi/items/d5d716cc96050dc8e562)参照）my_firstの中にいたようです。

<img width="726" alt="pwd02.png" src="https://qiita-image-store.s3.amazonaws.com/0/86088/4c813843-f749-94d5-7d3b-6473a43adc70.png">
:closed_book: 解説
"**../**"と打つと、一階層前の場所に戻ることができます。
"ls -a"で確認すると、my_firstの外に出てこられたことが確認できるはずです。リストの中にmy_firstがいますね。

では新しいリモート用のディレクトリを作ります、ここではsharedという名前にしました。
前回と同じように"mkdir"、"git init"を使います。
**この時、"git init"に --bareというオプションをつけてください**。
<img width="731" alt="bare02.png" src="https://qiita-image-store.s3.amazonaws.com/0/86088/37789730-03a1-8f09-1766-d053882359f2.png">
:closed_book: 解説
mkdirでsharedというディレクトリを作成、cdでその中に入る、そしてgit init --bareでsharedの中にリモートリポジトリのディレクトリを作成。
出来上がったら、ls -aで中を見てみてください。前回initだけで作った時とは中身が違いますね。bareをつけて作ったものにはこういったディレクトリが初期の時点で保存されていることが分かります。

なぜ？
リモートリポジトリはローカルリポジトリと違って複数のユーザーが使うので、オープンな状態である必要があります。これをbare(覆いがない) repositoryといいます。作業ディレクトリが無く、git用のディレクトリのみが存在するディレクトリです。このベアリポジトリを作るためのコマンドが**--bare**です。

これでぼっちでも練習できるぞ！ :bust_in_silhouette: :sparkles: 

## リモートリポジトリの登録

無事リモートリポジトリを用意できたところで、次は、連携するためにローカルリポジトリに**対象となるリモートリポジトリを登録**します。 

コマンドは" **git remote add リモートリポジトリの名前 リモートリポジトリのURL** "です。
リモートリポジトリのURLって？？
要はリモートリポジトリの場所です。場所を確かめるには"pwd"でしたね。見てみましょう。それが場所のURLです。
<img width="704" alt="remoteadd02.png" src="https://qiita-image-store.s3.amazonaws.com/0/86088/b7316ed4-0945-3b22-3e72-ee3f11156f1c.png">
:closed_book: 解説
pwdで場所のURLを確認したら、リモートリポジトリから出て、ローカルリポジトリmy_firstへ移動します。
my_firstに入ったら、上記のコマンドの出番。" **git remote add リモートリポジトリの名前 リモートリポジトリのURL** "と打ち込めば、登録完了です。
本当に登録できたか確認しましょう。
"**git remote**"で、現在ローカルリポジトリに**登録されているリモートリポジトリの一覧**を確認することができます。 ありますね、shared！

## プッシュ

では、いよいよプッシュです！
プッシュのコマンドは、"**git push リモート名 master**"です。

masterとありますが何でしょうか。
コミットが作成された時、その履歴を今後記録していくための**ブランチ**と呼ばれるディレクトリが作られます。履歴が増えるに従い、枝のように分岐したり、時には統合して進んでいくのでそう呼ばれます。 :herb: 
リポジトリに最初のコミットを行うと、Gitは**master**という名前の**最初のブランチ**を作成します。それがまさにマスターとなり、以後のコミットはブランチが増え、切り替えるまでmasterブランチに追加されていきます。 :deciduous_tree: 

ですのでこの"git push リモート名 master"の解釈としては、「ローカルのコミットを、このリモートリポジトリにアップロードします。**ブランチはmasterです**。」ということです。
ちなみに"master"というコードの部分は略されており、正式に書くと"**master:master**"、ローカルのmasterをリモートのmasterに反映させる、の意です。こう書くとイメージしやすいのではないでしょうか。
<img width="703" alt="push.png" src="https://qiita-image-store.s3.amazonaws.com/0/86088/fba70ac8-6e82-d78d-fb70-d4464bea7bcc.png">
（ブランチの仕組みは図で見て頂くともっとわかりやすいのですが、あいにく手持ち画像がないので :bow: ぜひ検索していろいろ見てみてください。）

これで手元のローカルリポジトリのmasterブランチが、リモートリポジトリsharedに書き込まれ、リモートリポジトリにmasterブランチが作成されました。

プッシュ完了！

## プル

お次はプルです。
プルは、リモートリポジトリにあがっているディレクトリを自分のローカルリポジトリに取り込むことでしたね :pencil: 。

いま、自分の**ローカルリポジトリとしてmy_first**があり、**リモートリポジトリshared**を登録しました。ということは、my_firstの中に以前作ったhello.textは、共同作業の対象になり、第三者からの編集も受け付けるようになっているということです :family: 。

## 第三者になってプルしてみよう

今度はその第三者、誰かさんの立場になって、my_firstをプルしてみましょう。

ではまず、誰かさんが使う用のディレクトリを作ります。
<img width="702" alt="someone01.png" src="https://qiita-image-store.s3.amazonaws.com/0/86088/336917d1-417d-b7d2-3861-826250c5547c.png">
:closed_book: 解説
my_firstの中から出て、新しく別のディレクトリを作ります。ここではsomeoneとしました。
中に入って、中身を確認。当然ですが空っぽです。ここに、誰かさんのためのローカルリポジトリを作ります。コマンドは"init "でしたね。
Initializedされました。

## リモート登録＆プル
このローカルリポジトリに、先ほどと同じように、リモートリポジトリであるsharedの登録を行います。これで誰かさんもsharedを一緒に使えるようになるので、データをプルすることができます。

プルのコマンドは"**git pull リモート名 master**"です。
<img width="703" alt="someone02.png" src="https://qiita-image-store.s3.amazonaws.com/0/86088/0e26e1a5-aac2-f493-b30b-0139795593bd.png">
:closed_book: 解説
git add remoteでsharedを登録してから、git pull shared masterでプルしました。
中身を確認すると、ちゃんとhello.txtが現れていますね！

sharedのマスターブランチをsomeoneのマスターブランチに投影するというかたちで、someoneのローカルリポジトリにmasterブランチが作成されました。 


これで一緒に編集ができます :couple: :notes: 
あとはお分かりの通り、編集し、プッシュとプルを積み重ねていきます。

お疲れ様でしたーーー！！！ :ok_woman: :tada: 

## 最後に
今回は、冒頭にも書きました通り、初めて挑戦する人がGitの流れを把握することが目標でした。
勉強している方ならご存知と思いますが、実際の運用にあたって理解しなければならないことはもっと複雑です。ここで出てきたことは、あくまで大まかな流れとお考えいただきつつ、最初の一歩になればと思います。

参考にさせて頂いたサイトです。ありがとうございました！:pray: 
[Git の基礎勉強 ~ Git によるバージョン管理 ~](http://tracpath.com/bootcamp/learning_git_firststep.html)
[Git 再入門 リモートリポジトリを使った作業]
(http://www.yunabe.jp/docs/relearning_git_remote.html#git-push)
[Git超入門："git push origin master"の"push"と"origin"と"master"の意味がわからないあなたへ](http://dqn.sakusakutto.jp/2011/10/git_push_origin_master.html)

## おすすめサイト

[サルでもわかるGit入門](http://www.backlog.jp/git-guide/intro/intro2_1.html)
とても有名なGit初心者サイトです。こちらではクライアントツールのSourceTreeを使用しています。


[LearnGitBranching](http://k.swd.cc/learnGitBranching-ja/)
ブランチの仕組みをゲームのように学ぶことができます。


[今更聞けない！ターミナルの使い方【初心者向け】](http://techacademy.jp/magazine/5155)
文中にたくさんコマンドが出てきましたが、tech achademyさんのサイトに見やすくまとまっていました。

***

近いうちにもう少し踏み込んだ記事も書けたらいいなと考えております。
ありがとうございました。