---
# System prepended metadata

title: Git/GitHub

---

# Git/GitHub

今日の教育はGit/GitHubの教育です！

<h2>
Git とは？
</h2>
<p>
Git とは、ソースコードのバージョンを管理するための仕組みのことです（いつ誰がどこを変えたのか？ 最新のバージョンはどれか？ など）。ソースコードを書き始めると、ソースコードをある時点まで書いたら動いたけど、追加のコードを書いたら動き始めなくなった、という場面が多々出てくると思います。そのために、gitを使います。

Gitを使えば、

ソースコードv1.cpp
ソースコードv2.cpp

のようにバージョンを管理するために毎回新しいソースコードを作る必要がなくなります。
</p>

<h2>
GitHub とは？
</h2>
<p>
GitHubは、gitで管理しているソースコードを共有するためのインターネットサービスのことです。Gitでは、ローカルでソースコードを管理することができますがこれを他の人と共同で作業したいときはどうするのが良いでしょうか？ここで、GitHubが活躍します。

![](https://i.imgur.com/QquXOkD.png)

ソースコードをオンライン上に載せ、チーム開発を行うために必要になるのがGitHubになります。実際はGitLabなどのようなソースコード管理ツールもありますが、GitHubが一番有名であり、普及しているのでこちらをベースに説明をしていきます。
</p>

<h2>
Git の初期設定
</h2>
<p>
Gitは、標準で搭載されているGitを使うのが良いかと思います。（既にインストールされているものがあるはず）

```
git --version
```

念のため、上のコマンドで確認してみよう。
</p>

<h2>
GitHub の初期設定
</h2>
<p>
GitHubはソースコード管理用のオンラインサービスですので、アカウントをGitHubで作成する必要があります。

https://github.com/ にアクセスし、早速アカウントを作ってみましょう。
※アカウントが既にある人は、そのアカウントを使ってもらって全然問題ありません。

![](https://i.imgur.com/OXmmUCk.png)


GitHubアカウントの設定をローカルにする
""内は各自で登録したusernameとメールアドレスを設定する。

```git config --global user.name "John Doe"```
```git config --global user.email johndoe@example.com```

登録が完了したら、

```git config user.name```
```git config user.email```
を入力し、設定が正常にできているかを確認する。

</p>

<h2>
GitHubにSSHで接続できるようにする
</h2>

<p style="padding-bottom: 30px;">
今までの教育期間中は　

```git clone https://~~/~~/~~.git```

というコマンドを実行してソースコードをGitHubから取得する作業を行なってきた。これはHTTPS方式でソースコードを取得する方法です。

場合によってはSSH接続でソースコードを取得する機会もあるかとは思いますので、SSH接続もセットアップしておきましょう。


    cd ~/.ssh
    ssh-keygen -t rsa -b 4096

```
Enter file in which to save the key (/Users/user-name/.ssh/id_rsa): github
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```
鍵のペアができたら
    
    　cat ~/.ssh/github.pub | pbcopy
    
で、公開鍵をコピーします。

Settingsをクリック

![](https://i.imgur.com/bWac3v6.png)

SSH and GPG keysをクリック

![](https://i.imgur.com/NC1NHbZ.png)

New SSH key をクリック

![](https://i.imgur.com/WlzPUsX.png)

Title: 公開鍵名（識別できるように）
Key: さっきコピーした公開鍵を貼り付ける
終わったらAdd SSH keyで終了

![](https://i.imgur.com/lQqQAu1.png)

以下のコマンドでSSHできるかを確認できる

```ssh -T git@github.com```

![](https://i.imgur.com/hqsqb5c.png)

</p>



<h2>
リポジトリを作成してみよう
</h2>
<p>
GitHubではソースコードを管理するための単位としてリポジトリというのがあります。ディレクトリやソースコードなど細かく整理するのが基本となります。
（以下はDPDKというネットワーク関連ソフトウェアの公開リポジトリです）

![](https://i.imgur.com/FiJiWey.png)

RepositoriesのNewをクリックし、リポジトリを作成できます

![](https://i.imgur.com/YO2o6Wn.png)

リポジトリの初期設定を行います。

![](https://i.imgur.com/Kmjrd0k.png)


まずターミナルで 
```mkdir test```
```cd test```
のコマンドを入力します

その後、以下の画像の一連の手順を踏むことによりソースコードをリポジトリに公開できます。

![](https://i.imgur.com/2qDXbax.png)

※originってなんだよという方へ

```git remote -v``` で正体が分かります。

ここまでの手順で、リモートのGitHub及びローカルのGitの管理が紐づいた状態になります。
</p>

<h2>
Gitに関する操作・コマンド
</h2>
<p>
Gitの操作を行う上で必要になるコマンドを順番に説明していきます。
</p>

<h3>
$ git status
</h3>
<p>
Gitによるファイルの修正状況を表示してくれます。
現在の状態で打ち込むと、

```nothing to commit, working tree clean```

と表示されるかと思います。これは、まだ何も新規のコミットがされていない状況ということになります。
</p>
<p>
ここで一度、

```echo "README.mdを修正したぜ！！！" >> README.md```

と入力しましょう。これで、READMEファイルに新しい情報が書き加えられます。
その状態で、

```git status```

を入力してみてください。<br>
modified: README.mdと表示されていれば、ファイルが書き換わったことを教えてくれます。
</p>

<h3>
$ git add
</h3>
<p>
ここで、

```git add README.md```

と入力し、その後に ```git status``` を入力してみましょう。

modified: README.mdの色が変わったかと思います、これは、修正したファイルをコミットすれば反映できる（ステージング）ようにした状態になります。<br>

ここで、
```touch not-managed.txt```
を作成し、```git status``` を入力すると、ステージングされたREADME.mdファイルとステージングされていないnot-managed.txtファイルに分かれるかと思います。

</p>
<h3>
git reset
</h3>
<p>
ソースコードをステージングできたと思いますが、誤ってステージングしてしまった!というケースが出てくるかと思います。
その場合には、git resetというコマンドが活躍します。

```
git reset README.md
```

このコマンドを入力することにより、先ほどのgit addで追加したREADME.mdのステージング状態を解除することができます。
git statusで確認してみよう。

確認ができたら、

```
git add README.md
```

で再度READMEファイルをステージングしておこう。
</p>

<h3>
git commit
</h3>
<p>
先ほど出てきたコミットという単語ですが、コミットこそがgitのバージョン管理の単位だと思っていただいて構いません！これを実行することにより、ソースコードのバージョンを最新のものに変更することができます。（先ほどREADME.mdに加えたテキストをステージングし、コミットしたことによりバージョンが更新されたということ）

```git commit -m "README更新"```

を入力すると、新しいバージョンのソースコードになります。
</p>

<h3>
git log
</h3>
<p>
本当に今のコミットでバージョン変わったの？という人は

```git log```

を入力してみましょう。<br>
今までのバージョンのログが列挙されます。HEADと書いてあるのが最新のバージョンということになります。(qを押すと画面を閉じれる)
![](https://i.imgur.com/dtcTS7n.png)

このようにしてバージョン（コミット）はGit内で管理されていきます。

</p>
<p>
ここまで読んで、gitを使う上で、ファイル・フォルダには複数のステータスがあることが分かったかと思います。

![](https://i.imgur.com/6Kroe5R.png)

</p>

<h2>
GitHubに関する操作・コマンド
</h2>
<p>
Gitでソースコードのバージョン管理をできるようになりました！<br>
しかし、これだけでは自分の中での管理のみになってしまい、他人に共有することはできない…<br>
そこで、GitHubの登場です。
</p>

<h3>
git push
</h3>
<p>
GitHubは、言わばソースコードのリモート掲示板だと思ってください。新しいソースコードを貼り付けないと他の人には共有できないし、他の人ははりつけられたものを取ってこないとソースコードを見ることができません。

![](https://i.imgur.com/QquXOkD.png)


新しいソースコードを掲示板に貼り付けるためには、

```git push origin master```

と入力してみてください。これを行うことにより、最新版のソースコードを掲示板に掲載する(GitHubにpushする、と表現する)ことができます。

実際にGitHubのリポジトリを見てみましょう。READMEの内容が更新されていることが分かります。

![](https://i.imgur.com/rwlstom.png)

</p>

<h3>
git pull
</h3>
<p>
ここまでの過程で掲示板に新しいソースコードを貼り付けることができました。<br>
チーム開発をしている場合だと、このプッシュした情報を自分の環境に引っ張り、最新版に追いつかないといけません。<br>
現在この作業は一人でやってるかと思いますのであまり意味がないと思いますが、

```git pull origin master```

と入力することにより、最新版のソースコードに他の人もキャッチアップすることができます。
</p>

<h2>
gitのブランチ
</h2>
<p>
チーム開発をするときにはブランチ機能というものを使います。<br>
ブランチ機能とは：<br>
例えば、ソースコードの最新バージョンに一つの機能を付け加えてあげたいとします。しかし、ローカルで新しい機能を加えて動かしてみたら正常に動作しなかった…<br>
そんな状態で最新版にプッシュしたら、まずいですよね？<br>
このソースコードを一本線で管理していたら、ソースコードをGitHubで共有できない状態となってしまいます。そこで、一本線ではなく、最新バージョンから新しい分岐点を作ることによって、新しい開発用の線を派生させる仕組みがGitにはあります。これをブランチ（枝）と言います。

![](https://i.imgur.com/fKu6d4y.png)

<ul>
<li>git branch</li>
<p>
現在のリポジトリにて用意されているブランチを表示することができます。

```git branch``` と入力してみましょう。

masterというブランチが表示されれば、OKです。(qを押すと画面を閉じれる)

</p>
<li>git checkout</li>
<p>
現在いるブランチから移動することができます。<br>
また、ブランチを新しく作って切り替えるということも可能です。

```git checkout -b test```

を入力してみましょう。これにより、masterブランチを幹とする新しいブランチ（枝）を派生させることができます。
この状態で ```git branch``` を入力すると、新しいブランチが作成されていることが分かります。（＊は現在いるブランチのことを表します。）(qを押すと画面を閉じれる)
ここで、git statusを入力してみると、ファイルの管理状態も引き継いだ上で新しくブランチが派生されていることが分かるかと思います。

```echo "testブランチからの更新！！" >> README.md```

を入力してみましょう。その後に

```git add README.md```
```git commit -m "README.mdの更新 @ testブランチ"```

を入力し、コミットします。これはtestブランチへの更新になりますので、masterには何も変更されないという点に注意してください。最後に、

```git push origin test```

と入力し、GitHubにtestのブランチをプッシュします。

branchが新しく増えていることが分かります。

このブランチはmasterブランチからは独立しているため、masterブランチには何も影響しません。
![](https://i.imgur.com/AMYmlVv.png)

このようにして、ブランチを作成し、masterブランチから離れて開発を行うことがGitHubでの作法となります。
</p>
</ul>
<h4>
gitのブランチを統合（マージ）
</h4>
<p>
ブランチを切って開発を進めたわけですが、最後にこのブランチで新しい機能を追加して問題なく動くようであれば、masterのブランチに統合したいですね。

チーム開発においては、masterブランチの統合はgitHub上で行います。ローカル側で統合を行った上でプッシュしてしまうと、他の共同開発者が更新内容を確認できないまま上がってしまうためです。

そこでGitHubが用意しているのが、プルリクエストと呼ばれる機能になります。

![](https://i.imgur.com/roWvMlU.png)

masterブランチとtestブランチを比較することができます。
緑色でAble to mergeと表示されれば、統合ができる状態にあるということになります。
［Create pull request］をクリックしていきます。

![](https://i.imgur.com/0B8svm1.png)

![](https://i.imgur.com/Jx1ZjMa.png)


これでプルリクエストの登録は完了です。
これで、リポジトリが見える人はブランチごとのソースコードの差分を見ることができます。（緑色や赤い部分が差分）
![](https://i.imgur.com/rlhZQUR.png)

最後に、Merge pull requestを行うことによってmasterにtestの更新分を反映させることができます。

これで、masterブランチにtestの分を更新することができました。
チーム開発はこんな感じで進めていきます。
</p>



<h4>
git clone/fork
</h4>
<p>
上までがGit/GitHubでチーム開発を行う上で知っておくべき最低限の知識になるかと思います。
次に、公開されているリポジトリのソースコードを自分のローカルに持ってくるコマンドを紹介します。
</p>
<h4>
git clone
</h4>
<p>
リモートにあるリポジトリをローカルに引っ張ることができます。おそらく一番よく使うことになるかもしれないコマンド。
</p>

<h4>
git fork
</h4>
<p>
他人のリモートリポジトリを自分のリモートリポジトリとして使いたい時に重宝するコマンドです。
OSS(オープンソースソフトウェア)の開発を行う場合には結構重宝するコマンド。
リモートでの作業のみなので、GitHubのみでの操作となる。

</p>