Git入門 - 番外編

## 1. はじめに

当記事は全5回（+α）からなる **Git入門シリーズ** の番外編です。

今回は **GitHubとは何なのか** ということと **GitとGitHubの連携** について説明します。

- [1回: 概要](https://qiita.com/AGadget/items/a5f3addbe334db97d990)
- [2回: 導入手順とGitコマンド](https://qiita.com/AGadget/items/24c655fcbf9fc58625f0)
- [3回: データの保存](https://qiita.com/AGadget/items/6b1ccc036d682f5475a0)
- [4回: データの活用と便利な操作](https://qiita.com/AGadget/items/fbc2f67e8d6e3143d620)
- [5回: ブランチ](https://qiita.com/AGadget/items/b48983b7da16099eeba0)
- **番外編: GitHub**





## 2. GitHubとは？

**GitHub（ギットハブ）** は2008年4月10日に正式スタートしたWebサービスです。Gitのリリースが2005年12月21日なので、およそ2年半後のことですね。開発元はGitHub社で（開発自体は法人化する前から始まっていたっぽい）、同社は2018年10月26日をもって75億ドルでMicrosoftに買収されています。

サービスの特徴としては――

- ローカルや社内で管理していたソースコードをクラウド上に保存できる
- ソースコードの公開と非公開を選択できる
- SNS的な側面があり、ソースコードやプロジェクトについて議論を交わせる

――などが挙げられます。

現在のところ、およそ1億個のリポジトリがGitHubで管理されているとされ、約4,000万の開発者と、約210万の組織で利用されるサービスにまで成長しました。

ちなみに、GitHubの開発には、Rubyのフレームワークの1つであるRuby on Railsや、スウェーデンのIT企業Ericsson社が開発したプログラミング言語Erlangが用いられているようです。





### 2-1. 普及と好評の理由

GitHubがこれほどまでに普及した理由の1つに、OSSと相性が良かったという指摘をいくつか確認しました。

ざっと調べてみたかぎりですと、2000年くらいから企業のシステムにOSSが利用されるようになり、2010年にもなるとOSSの利用が一般化、そして、2020年現在では無くてはならない存在にまでなったOSSは、そのプラットフォームとしてGitHubを利用することが多く、それに伴いGitHubの規模も大きくなっていったと考えられます。

そして、そもそもOSS勢がGitHubを利用するようになったのは、OSSの開発を助けるいくつかの機能が用意されていたことにあるでしょう。誰かがアップロードしたリポジトリを、自身の環境にコピーして好きに弄ることができる **フォーク機能** 。OSS開発責任者に機能の追加・改修・バグ修正等を提案することができる **プルリクエスト機能** 。GitHub上で意見交換や議論ができる **イシュー機能** などです。





## 3. GitHubにリポジトリを用意する

GitHubにリポジトリを用意するにはGitHubのアカウントが必要です。アカウントは無料・有料、どちらもありますので、とりあえず無料のプランでアカウントを取ってしまいましょう。

アカウントが取得できましたら、GitHubの指示に従ってリポジトリを作成してください。リポジトリは **Public** と **Private** の2種類あります。前者は公開用、後者は自分および特定のメンバーにのみ公開されるリポジトリです。どちらを選んでもよいと思いますが、とりあえず最初はPrivateにして色々弄ってみるのが無難だと思います。





## 4. データを上げる

GitHub上に作成したリポジトリにバージョン情報をアップロードするには **pushコマンド** を使用します。

まず、第1引数にデータのアップロード先となるGitHubリポジトリのURLを指定します。URLといっても色々だと思いますが、基本的には「[https://github.com/GitHubアカウント名/リポジトリ名]()」という構成になっているURLを指定すればOKです。具体的には、例えば、私が公開しているリポジトリですと「[https://github.com/AGadget/rps-like](https://github.com/AGadget/rps-like)」です。

そして、第2引数にアップロードしたいブランチを指定します。GitHubに上げるバージョン情報はブランチ単位となります。

```:文法
PS C:\Users\AGadget> git push [GitHub上に作成したリポジトリのURL] [アップロードしたいブランチ]
```

```:例文
PS C:\Users\AGadget> git push https://github.com/AGadget/rps-like master
```

初めて実行するときはウィンドウが表示され、GitHubのID・パスワードの入力が求められますので入力してください。1度通った場合は入力を求められなくなります。





## 5. エイリアス

アップロード先となるURLに対して、エイリアスを設定することができます。エイリアスを付けることで長いURLを打ち込む必要がなくなる他、後ほどエイリアス一覧を確認することで、そのリポジトリがどのGitHubリポジトリと連携しているか把握する助けになります。

エイリアスの操作には **remoteコマンド** を使用します。





### 5-1. 追加

エイリアスを追加するにはremoteコマンドの第1引数に **add** を指定し、さらにエイリアス名・URLと続けます。

ちなみに、Git界隈では主要なエイリアスには **origin** という名前を付ける傾向があります。

```:文法
PS C:\Users\AGadget> git remote add [エイリアス] [GitHubのURL]
```

```:例文
PS C:\Users\AGadget> git remote add origin https://github.com/AGadget/rps-like master
```





### 5-2. 確認

作成したエイリアスを一覧表示したいときはオプション・引数無しにremoteコマンドを実行してください。

```
PS C:\Users\AGadget> git remote
```

URLも併せて知りたいときは **--verboseオプション** も付けてください。

```
PS C:\Users\AGadget> git remote --verbose
```





### 5-3. リネーム

エイリアス名を変更するならばremoteコマンドの第1引数に **rename** と指定し、第2引数に変更したいエイリアス、第3引数に変更後の名前をそれぞれ入力してください。

```
PS C:\Users\AGadget> git remote rename [古い名前] [新しい名前]
```





### 5-4. 削除

削除するにはremoteコマンドの第1引数に **rm** を指定し、削除したいエイリアス名を続けます。

```
PS C:\Users\AGadget> git remote rm [エイリアス]
```





## 6. GitHubに上げたデータを確認

pushコマンドでアップロードしたら、割とすぐにGitHubのページに反映されるはずなので確認してみてください。





## 7. データを取ってくる

GitHubに上げておいてデータを自身のPCのリポジトリに持ってくるには **fetchコマンド** を使用します。第1引数に対象となるGitHub上のリポジトリを指定するのですが、原則としてURLではなく、エイリアスを使って指定することをオススメします。

理由は後述します。

```
PS C:\Users\AGadget> git fetch [GitHubのリポジトリ（エイリアスの指定を推奨）] [取ってくるブランチ名]
```





### 7-1. fetchコマンドの実行結果

fetchコマンドを実行すると、リポジトリにGitHubに上げたブランチがそのまま追加されます。ブランチ名は「エイリアス名/ブランチ名」となります。

例えば「[https://github.com/AGadget/rps-like](https://github.com/AGadget/rps-like)」というGitHub上のリポジトリに、「origin」というエイリアスを付けて、そこに「master」ブランチのデータを上げるとします。後ほど、以下のようにコマンドを実行します。

```
PS C:\Users\AGadget> git fetch origin master
```

すると自身のPCのリポジトリ内に「origin/master」という **リモートトラッキングブランチ（トラッキングブランチ、リモートブランチとも）** が作られます。





### 7-2. フェッチ後、どうするのか？

fetchコマンド実行後は基本的に、取ってきたブランチと同名のブランチに対して、マージ処理を行います。

```
PS C:\Users\AGadget> git switch master

PS C:\Users\AGadget> git merge origin/master
```

こうしてGitHubにアップロードされたデータとの差分を、ローカル環境のリポジトリに反映させます。

もちろん、コンフリクトが発生する可能性がありますので注意してください。





### 7-3. エイリアスではなくURLを指定した場合

fetchコマンド実行時にエイリアスではなくURLを指定した場合、リモートトラッキングブランチは作成されません。

では、どのようにしてGitHubのブランチを参照するのかというと **FETCH_HEAD** というポインタを参照します。名前から何となく分かるようにHEADのお仲間で、fetchコマンド実行時に生成されるポインタです。

```
PS C:\Users\AGadget> git merge FETCH_HEAD
```





### 7-4. pullコマンド

fetchコマンドと似た役割を持つコマンドとして **pullコマンド** があります。

```
PS C:\Users\AGadget> git pull [GitHubのリポジトリ（エイリアスの指定を推奨）] [取ってくるブランチ名]
```

pullコマンドを実行すると、まず、fetchコマンドを実行したときのようにGitHub上に保存されたリポジトリを取得し、さらに、mergeコマンドを実行して、ブランチの統合まで行ってくれます。fetchコマンド・mergeコマンドを省略してくれるので便利です。





## 8. cloneコマンド

**cloneコマンド** は引数に指定したリポジトリを基に、リポジトリを新規作成するコマンドです。既にGitHubでバージョン管理を行っているプロジェクトに途中参加するときや、GitHubに登録されている有名なプロジェクトの内容を確認するのに便利なコマンドです。

```
PS C:\Users\AGadget> git clone [リポジトリ]
```





## 9. 知っておきたい概念と操作

ここまで来た人は以下の概念・操作を知っていてください。





### 9-1. ローカルとリモート

バージョン情報を保存するリポジトリですが、リポジトリがどこに存在するかで **ローカルリポジトリ** と **リモートリポジトリ** とに呼び分けられます。ローカルリポジトリはクライアント側にあるリポジトリ。対して、リモートリポジトリはサーバー側にあるリポジトリです。





### 9-2. リポジトリは2種類

リポジトリにはワークツリーが有るものと無いものがあります。ワークツリーが有ると **ノンベアリポジトリ** 、無いと **ベアリポジトリ** と言ばれます。「ベア（bare）」は「裸の」あるいは「剥き出しの」という意味です。

これまで紹介してきたinitコマンド・cloneコマンドで作成したリポジトリは全てノンベアリポジトリです。対して、GitHubのリポジトリはベアリポジトリとなります。

ベアリポジトリは、ノンベアリポジトリで編集・保存したデータを集積するだけの役割しかありません。機能こそノンベアリポジトリよりも劣りますが、そのぶんリポジトリのサイズが小さくなるというメリットがあります（らしいです）。また、ワークツリーを持たないがために直接編集することができないというのも、見方を変えれば、バージョン情報をセキュアに管理するための制約と考えることができます。





### 9-3. ベアリポジトリを作成

ところで、ベアリポジトリはGitHub固有のものではありません。自作することが可能であり、GitHubを利用する代わりに社内サーバー上などに配置し、リモートリポジトリとして利用することができます。

ベアリポジトリを作るには、initコマンドを実行するときに **--bareオプション** を付けて実行してください。カレントディレクトリ直下にベアリポジトリが自動作成されます。

面白い挙動として、ノンベアリポジトリを作成するときは「.git」というディレクトリが作られたのに対して、ベアリポジトリを作るときは「.git」の中身がカレントディレクトリ直下に作られます。これはまさにリポジトリの内容が剥き出し――ベアであるということなのでしょう。

```
PS C:\Users\AGadget> git init --bare
```

作成したベアリポジトリはGitHub上に作成したリポジトリと同じように使用することができます。pushコマンドでデータを送ったり、fetchコマンドでデータを受信したりです。

ところで、ベアリポジトリを作るときというと、それはGitHub等のクラウド上にソースコードを置きたくないが、プロジェクトのバージョン情報をどこかで集中管理したいときでしょう。そんなときは **--sharedオプション** を付け、その引数に **true** を指定してください。これは1つのリポジトリを複数のユーザーで共有する許可を与えるオプションです。

```
PS C:\Users\AGadget> git init --bare --shared=true
```

引数を省略した場合、自動的にtrueが指定されますので省略してもかまいません。

```
PS C:\Users\AGadget> git init --bare --shared
```