Github(Git) 入門

# はじめに
春ですね，ご入社，ご入学おめでとうございます．この時期にGithub入門する人も多いと思います．この記事はせっかく社内ドキュメント作るのなら共有しちゃおうというものです．特有の言い回しなどはかみ砕いて説明するので，多少の相違は了承ください．

#なぜ必要? クラウドストレージと何が違うの?
更新の時系列がわからないディレクトリがあなたのパソコンにはありませんか？ 版を管理することをバージョン管理といいますが，ソフトウェア開発，デザイン，文筆などあらゆることでバージョン管理は煩わしいものです．更にチームになるとこのようなファイルがクラウドストレージにあったら，チームメンバーは混乱してしまいます．個人でもチームでもこんなことに時間をさきたくないはずです．
<img width="333" alt="スクリーンショット 2020-04-05 17.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/376dfae8-9b0f-1675-be87-979303135772.png">
この煩わしさからGitは開放させてくれます．Gitは時系列順に版をスナップショットとして管理するバージョン管理システムです．Gitにcommitすることによって版が作成され更新されます．もとに戻したければ戻せますし，別バージョンを作りたければbranchを切ることによってできます．

<img width="1019" alt="スクリーンショット 2020-04-06 21.27.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/64a858c6-c493-9a47-487e-40c5dce1cbfc.png">


# GitとGithub
Githubはバージョン管理システム(ソフトウェア)であるGitをクラウドサービスとして使えるようにしたもので，現在はMicrosoftによって運営されています．同等のサービスやソフトウェアとしてBitbucketやGitLabなどのプロジェクトがあります．

[Bitbucket](https://bitbucket.org/)
[GitLab](https://about.gitlab.com/)


Gitはサーバークライアントとローカルクライアントが存在し，サーバーの方をサーバーに，ローカルをパソコンにインストールすることで使用します．Gitをサーバーにインストールすることによってバージョン管理サーバーとして，チーム内で共有することができるわけです．

<img width="574" alt="スクリーンショット 2020-04-06 21.20.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/8f2f74ba-f42d-693f-db99-7331b01dec72.png">


gitをローカルで使用する場合まず，

```bash:zsh
$ git --version #でバージョン情報を表示します．

#=== 以下戻り値 ====
-git version 2.21.0 (Apple Git-122.2) 
#インストールされている場合はこのようなバージョン情報が表示されています．
-git: command not found
#not foundが表示される場合はgitをインストールする必要があります．
```

not found の場合例えばmacでしたら，
`$ brew install git`
`$ sudo apt install git`
などを使いインストールします．これは個人の環境で違います．
インストールが終わったら,

```bash:zsh
$ git config --global user.email <your e-mail address>
$ git config --global user.name <your user name>
```
####注意
このアドレスと名前はgithub上で世界に公開されます．


#GithubとGitの使い方
gitはレポジトリ(リポジトリ)という単位でプロジェクトを管理します．レポジトリとはプロジェクトのディレクトリーのこととの認識で構いません．このレポジトリにはリモートとローカルが存在します．ローカルは自分のPC内にあるもので，リモートはそれをサーバーにアップロードした状態のことを言います．
プロジェクトのルートレポジトリにある.gitという隠しファイル(サブディレクトリ)に更新情報やリモートレポジトリの情報が記載されています．

Gitのフロートしては，`clone して add して commit して push`します．
<img width="791" alt="スクリーンショット 2020-04-06 21.42.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/f0c43d9d-9190-dfcd-f4ab-f5b59334f534.png">


## 1.レポジトリを作る
まずプロジェクトを始めるにあたってリモートレポジトリであるGithubにレポジトリを作成します．本来はレポジトリを作る場合，

```bash:zsh
$ mkdir hoge        #ディレクトリの作成
$ git init          #gitの初期化(.gitの作成)
$ touch readme.md   #説明書の作成
$ touch LICENSE     #Licenseファイルの作成
```
を実行する必要がありますが，Githubではレポジトリを作ると自動で，git initを実行してreadme.mdやLICENSE，.gitを作成してくれます．
<img width="747" alt="スクリーンショット 2020-04-06 21.44.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/f610bd57-c30b-22b0-0d8a-b17d94644fc3.png">
試しにhogeレポジトリを作ります．

## 2.clone
リモートレポジトリにあるレポジトリをローカルにダウンロードすることをcloneといいます．cloneするには任意の場所で，

```
$ git clone <hoge url or git>
```
を実行します．ダウンロードされたhogeは一見readme.mdとLICENSEだけですが，きちんと.gitが含まれています．

<img width="405" alt="スクリーンショット 2020-04-06 22.01.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/fa4dd1a6-be35-7e3c-5a1c-c12dcd00e710.png">

Githubではこのcloneコマンドの他に，右上の緑色のボタンからzip形式でcloneすることもできます．プロジェクトメンバーで開発に参加していない人でも最新のzipを手軽にダウンロードすることが可能です．

<img width="1024" alt="スクリーンショット 2020-04-06 21.53.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/7160dc05-51ca-74df-0158-8ca9bbc7ca10.png">


## 3.add
cloneした状態に新しいファイルを作成したならばaddが必要です．addはあたらしいファイルを管理リストに追加することです．これでファイルの変更を追従できるようになります．

```bash:zsh
$ git add -A
```
どのファイルが追加されていないかなどは

```bash:zsh
$ git status
```
で確認できます．
<img width="619" alt="スクリーンショット 2020-04-06 22.03.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/aa9e7a4e-8302-06ea-7ccb-5f5411d297e6.png">
追従していないファイルが表示されている．
<img width="628" alt="スクリーンショット 2020-04-06 22.04.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/21dc7562-bf41-0888-f83c-8b778eaf567e.png">
addをすることで追従される．


## 4.commit
既存のファイルを編集したときや，新しいファイルをaddしたときにはcommitをします．commitをすることで新しい版(バージョン)が作成されます．
どこまでやったらcommitするかは自由ですが，戻せない変更をする場合は，する前にかならずcommitします．セーブポイントできちんとセーブをしておけば，ラスボスで負けても再挑戦ができるわけです．

commitには何を変更したかcommit messageを添えます．

```bash:zsh
$ git commit -am "example commit"
```
またcommitした変更はコミット履歴という形で履歴に残ります．

```bash:zsh
$ git log
```

<img width="639" alt="スクリーンショット 2020-04-06 22.06.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/7ccb2133-22ca-37fd-5dc0-f3fb4a0fc68b.png">


## 5. push 
commitはローカルストレージのプロジェクトディレクトリ内の.gitに記録されます．この情報をスナップショットと一緒にアップロードすることをpushといいます．
pushを行うことでリモートレポジトリを更新し最新にします．チームメンバーはgit pullをすることで，常に最新版を使うことができます．

```bash:zsh
$ git push origin master #masterブランチにpush
$ git pull
```
チーム開発の場合，大抵はmasterブランチにはpushをせずにそれぞれのバージョンのブランチにpushし，それをmergeすることでmasterを最新に保ちます．これはバグなどの影響を最小限に留めるためです．

<img width="1000" alt="スクリーンショット 2020-04-06 21.48.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/d02b0f9b-321c-2a9c-de72-c42a597fe7fc.png">
pushするまえ
<img width="1001" alt="スクリーンショット 2020-04-06 22.07.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/46e29fcb-37d0-8a22-35c8-5f1117160b0b.png">
pushしたあと

# GUIソフト
[Sourcetree](https://www.sourcetreeapp.com/)などを使えばterminalではなく視覚的なソフトからでもGitを操作することができます．
<img width="1208" alt="スクリーンショット 2020-04-06 22.23.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120043/5cc63c6c-44e6-71f1-431a-b4bd425c7ee7.png">


---
以上，いちばん基本的なGit及びGithubの使い方でした．


#参考
[Git --distributed-is-the-new-centralized](https://git-scm.com/)