GitHubを使ってみよう！👶基本的な操作をざっと確認！

この投稿は、初心者向けにざっくりとGitHubについて説明し、基本的な操作をざっと確認するために記述しました。

# はじめに
はじめに、GitHubとは？Gitとは？を説明していきます。

##GitHubとは？
GitHubは、Webサービスの名前で、
 https://github.com で公開されています。
GitHubを使うと、自分の書いたコードを**世界中に発信**できたり、便利なライブラリを作って世界中に発信して、便利だな！と思った他のユーザーから**スターをもらえたり**:star:します！
なんだか楽しそうですね😊  
他にも、自分の書いたコードを**保存しておく**ことができたり、今ある**問題をまとめておく**ことができたり、**進捗管理**まで出来てしまいます。

##Gitとは？
GitHubはGitの仕組みを利用して作られています。
Gitは**バージョン管理システム**のことです。
Gitそのものは、全てがコマンドライン上で完結していて、GUI上での操作ができません。
Gitを使うと、**ソースコードのセーブを取ること**（変更履歴などを記録すること）ができたり、**複数人で同じソースコードを編集する**ことが出来ます。

##GitとGitHub
GitHubは、Gitの仕組みを使って、更にわかりやすく、GitHubオリジナルの機能を追加して発展したものです。
なので、GitHubを使うには、GitHubオリジナルの機能についての理解はもちろん、Gitの機能について理解する必要があります。

#Gitを使うとできること（例え）
Gitはバージョン管理システムだという話をしました。
バージョン管理とは、具体的にどのような事ができるのかを説明します。
Gitでのバージョン管理は、ゲームのセーブのように考えてみるとわかりやすいかもしれません。
ゲームをやっていて、

- 何か新しいアイテムをゲットしたとき
- 次のステージに進んだとき
- レベルが上がったとき

など、何か**前に進む変化**があったときにセーブをすると思います。
Gitも同じように、自分でコーディングをしていて、何か前に進む変化があった時にセーブすることができます。

また、ゲームをしていて先に進んでいたセーブファイルと進む前のセーブファイルを分けたいときがあると思います。
Gitも同じように、変更後と変更前のセーブファイル(branch)をそれぞれ分けて保存して置くことが出来ます。

また、ゲームのセーブでは出来ない点として、前回セーブしたところと今回セーブしたところを比べると、どこがどう変わったのか、ということもGitでは管理することが出来ます。
例えば、前回、持ち物が剣:dagger:だけの状態で、ステージ２まで進めたところで１回目のセーブ。
今回、ステージ３まで進めて、弓:bow_and_arrow:も手に入れてセーブしたとしましょう。
そうすると、前回から今回までの変更点として、

- ステージが３になったこと
- 弓:bow_and_arrow:を手に入れられたこと

が記録されます。この変更点のことを、**差分**といいます。


#Gitを使うとできること（実践）

##リモートリポジトリとローカルリポジトリ
Gitを使うとインターネット上にあるリモートリポジトリ、自分のPC上にあるローカルリポジトリの２つが作られます。
自分のPC上で加えた変更はまずローカルリポジトリに保存され、その変更をリモートリポジトリに反映すると、そのソースコードを編集している人みんながその変更されたソースコードを見ることが出来ます。
Gitにはブランチというものがあり、ローカルリポジトリの中にあるブランチをローカルブランチ、リモートリポジトリの中にあるブランチをリモートブランチと呼びます。

##ファイル更新をする
何か変更を加えてそれを更新したいときは、基本的に`add`、`commit`、`push`の３種類を使います。
これを3つを１セットと覚えておくと間違いがないと思います。更新をしたら、addしてcommitしてpushします。

###add
何か変更を加えたファイルを**追加**する時に使います。

```
git add . //全てのファイルをadd
git add ファイルpath //指定したpathのファイルのみをadd
```

###commit
addしたものをローカルブランチに反映させるために使います。

```
git commit -m "コミットメッセージ"
```
何かした作業ごとにこまめにコミットをしていきましょう。コミットログは、作業記録になり、コードの歴史を作ります。いつ何をしたのかを記録していきましょう。

####コミットメッセージ
この**コミットメッセージ**には、どんな変更を加えたかを書きます。
どんなふうに書いても良いのですが、あとから何を変更したのかちゃんと分かるように書きましょう。
ちなみに、日本語でなくて英語で書いたほうがやっぱりオシャレかっこいいです。スマートな感じを出すために(?)よく使われていると思われる英語のコミットメッセージを紹介しておきます。

基本的に、よく使うgitの操作というのは、

- 追加したよ！
- 変更したよ！
- 消したよ！

だと思います。それぞれ、

|操作|内容|英語のメッセージ|
|:--|:--|:--|
|追加したよ！|何かファイルを追加した時|add|
|変更したよ！|何かバグを解決した時|fix|
|変更したよ！|何か変更を加えたとき（バグ以外）|change|
|消したよ！|何かファイルを消したとき|remove|

という英単語がよく使われます。

```例
git commit -m "add hoge.java"
git commit -m "fix typo"
git commit -m "change file name"
git commit -m "remove piyo.png"
```
みたいな感じで簡単なコミットメッセージからチャレンジしてみましょう！目指せスマートなエンジニア:muscle:

###push
commit結果をリモートブランチに反映させるために使います。

```
git push origin ブランチ名
```
### 流れ
もともとあったファイル、例えば`test.java`があるとします

```java:test.java
public class test{
   public static void main(String[] args){
     System.out.println("Hello World!!");
   }
}
```
この出力結果を、`Hello World!!`から`Good-bye World!!`に変更するとします。

```java:test.java
public class test{
   public static void main(String[] args){
     System.out.println("Good-bye World!!");
   }
}
```
変更後、コマンドラインでGitの操作をします。

```
git add test.java //変更したファイルをaddします。今回の例では、１つのファイルしか変更していないので、git add .でもOK

git commit -m "出力結果を変更"

git push origin master
```

これでGitに変更を記録することが出来ます。
差分としては`Hello World!!`から`Good-bye World!!`に変更されたことが記録されます。

コミットメッセージを英語で書くなら、`git commit -m "change output message"`とかになるのでしょうか！？
英語のほうがかっこいいですよね！という記事を書きながらスマートでおしゃれなエンジニアになれていないので、おしゃれじゃないかもしれません。おしゃれな書き方を教えてください:older_woman_tone1:

![git.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/93899/c1009f14-1c19-f7cb-0f4a-3a5be39234be.jpeg)


##ブランチを作る
実際に完成形を残し続けるブランチを、基本的に**masterブランチ**とします。
作っている物をリリースしたいときはこのmasterブランチの内容を使用することが多いです。
なので、常に変更を加え続けるブランチを作る必要があります。基本的に**developブランチ**とします。

![名称未設定.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/93899/9fb90046-846b-624f-3bd5-e98b6b287885.jpeg)

ブランチは、何かのブランチを元にして次のブランチを作ることができます。
この図では、<font color="red">masterブランチ</font>が大もとにあり、<font color="red">masterブランチ</font>を元にした<font color="blue">developブランチ</font>、<font color="blue">developブランチ</font>を元にした<font color="green">feature/hogeブランチ</font>があります。

それぞれのもととなっているブランチから新しいブランチをつくり、変更を加え、元のブランチに合流させることを**マージ**と言います。

```
git branch ブランチ名 //指定した名前のブランチを作る
git checkout ブランチ名 //指定した名前のブランチに移動する
```

ブランチをマージするときは、マージされる側のブランチにcheckoutし、以下のコマンドを実行します。

```
git merge マージしたいブランチ名
```

こうしてブランチを複数作ることで、セーブファイルを複数作ることが出来ます。

#GitHubを使うとできること
GitHubでは色々な便利な機能が使えます。その中でも、代表的なものについて説明します。

##GitとGithubの連携
GitとGithubを連携させるにはコマンドを数行書くだけです。
まず、GitHub上でリモートリポジトリを作ります。

<img width="312" alt="スクリーンショット 2017-11-02 21.14.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/a6a3ab33-0bba-41c9-e228-ef30e678ae5b.png">


```
git init //Gitの初期化、これはGitの設定
git add ファイルpath
git commit -m "コミットメッセージ"
git remote add origin sshのURL　//GitHubとSSH接続できるようにします
git push -u origin master //リモートのmasterブランチにpushします
```

sshのURLは、リポジトリを作った際にでてきます。
<img width="984" alt="スクリーンショット 2017-11-02 21.18.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/05e2e8b8-8d8f-ea2c-0089-003131a18346.png">


##プルリクエスト
あるブランチをマージしてほしい！という**依頼**をする時に使います。
ブランチが複数ある時に、マージできるブランチがあれば、そこにプルリクエストを送ることが出来ます。
<img width="1017" alt="スクリーンショット 2017-11-02 21.07.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/ad8ba3c4-bc8e-3b5c-7ee7-88fd1d69e7de.png">
このような緑のボタンがあるので、押すとプルリクエストを送ることが出来ます。
プルリクエストは、基本的に複数人で開発している場合に使います。
自分が書いたコードが、本当にマージしても良いのかをチェックしてもらうために送ることが多いです。

##issue
例えば、そのコードで発生しているバグ、エラーなど、何か問題が起きている時にissueを立てることが出来ます。
<img width="1031" alt="スクリーンショット 2017-11-02 21.33.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/bf3da252-f744-5af6-34d9-0e929dffc6e6.png">
<img width="996" alt="スクリーンショット 2017-11-02 21.34.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/2ecbcd24-1ef5-876e-088a-164b8366f9ad.png">
issueはopenとcloseができて、解決したissueはcloseすることが出来ます。

###Assignees
そのissueの解決を担当する人を選ぶことが出来ます。

###Labels
そのissueがどんな性質を持っているのか選ぶことが出来ます。

###Projects
後述するProjectsに紐付ける事ができます。

###Milestone
後述するMilestoneに紐付ける事ができます。

##Projects
ToDoリストをまとめることが出来ます。
カードをつくり、リポジトリ毎に進捗管理をすることが出来、とっても便利です。
<img width="988" alt="スクリーンショット 2017-11-02 21.41.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/863dfb69-4d55-078d-952f-04ba00f238fd.png">

##Milestone
やることとについて期限をつけることが出来ます。
issueと紐付けることで、期限を設けることが出来ます。
<img width="1061" alt="スクリーンショット 2017-11-02 21.40.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/f1475039-daef-c8c2-01be-ceb2baaf02cb.png">

1人で開発する上ではあまり使わないことが多いかもしれませんが、質問がある際などは、issueを立てて教えてくれる人をAssignするなどして活用できると思います。