[超初心者向け] Git、GitHubの使い方

# はじめに
ここではGit、GitHubの使い方について研究していきたいと思います。
以下が前提条件になります。
・Railsアプリを作成中
・バージョン管理をしていきながら、アプリを構築していきたい

共有しながら一緒に学んでいけたらと思いますので、アドバイス等いただければ嬉しいです。

# 設定環境
- OS
    - Mac OS X
        - 10.12.6
- Software
    - PostgreSQL
        - 10.1
    - Ruby
        - 2.5.0
    - Rails
        - 5.1.5

## Railsアプリの開発を始めるにあたって
Railsアプリを開発する上では、アプリ開発だけの知識ではなく環境の設定だったり、開発の進め方も考えておく必要があります。

# **Gitとは?** #

アプリ開発を進めていくと、ソースコードを管理する上で、バージョン管理（更新していく度に上書き保存していき、バージョンが増える）が必要になってきます。自分で開発しながら、更新したものを元に戻したり、複数で開発していくためのバージョンがこのGitという管理システムで管理されているようです。

# **GitHubとは?** #

このGitにおいて、ローカル環境でGitをインストールして、設定すればローカル環境で自分の作成したRailsアプリのバージョン管理ができます。ただこれをクラウド上のサービスと連携しておけば、どのMacで作業をしたとしても同じことができ、もし自分のMacが壊れてしまっても自分の構築したアプリを失わずに済みます。このクラウドサービスをGitHubというらしいです。

# **Gitの基礎** #
Gitでバージョンを管理するにあたって、３つのステップがあると考えておくといいかと思います。
![スクリーンショット 2018-03-23 12.39.34.png](https://qiita-image-store.s3.amazonaws.com/0/108456/17a306ec-d95a-04db-7b0a-d5f34b20bd9d.png)
[参考:サルでもわかるGit入門]
(http://www.backlog.jp/git-guide/)

**ワークツリー(作業ディレクトリ)**
個々の環境で作業をしているフォルダー（ディレクトリー）のことをワークツリーといいます。
新規に作成したり、編集したりするステップです。

**インデックス(ステージングエリア)**
インデックスとは、リポジトリにコミットする準備をするための場所のことです。
上記作業の途中経過を少しづつ更新していくステップです。

**レポジトリー**
作業が終わってある程度まとまっているものをアップロードするステップです。
ローカルレポジトリ、リモートレポジトリ(これが後に出てくるGitHubにあたります)があります。

# **ローカル環境でのGitの設定** #
**Gitのインストール**
参考ではSourcetreeなどを推奨されてますが、インストールをする必要はないみたいです。
Sourcetreeなどを使わない方法でGitを設定してみましょう。

Railsアプリを作成した時点でGitはインストールされているようです。
ターミナルでGit --versionしてみて表示されていれば大丈夫です。

**Railsアプリ内でのGitの設定**
ターミナルでRailsアプリのディレクトリ(フォルダー)に入ったら、以下のコマンドで設定ができます。

git config --global user.name "(your name)"
git config --global user.email "(your email)"
git config --global color.ui true

```js:
$ cd myapp
```
```js:
myapp ユーザー名$　git config --global user.name "(your name)"
```
```js:
myapp ユーザー名$　git config --global user.email "(your email)"
```
```js:
myapp ユーザー名$　git config --global color.ui true
```
この設定ができればアプリ上のGitの設定は完了です。

**初めてのコミットに向けた設定**
ディレクトリ内にはいったら、まずgit initというコマンドをタイプしましょう。
これはこのアプリを管理する上でGitを使うという宣言になるみたいです。

```js:
$ cd myapp
```
```js:
myapp ユーザー名$　git init
```
# **初めてのコミット(ローカル環境、ローカルレポジトリ編)** #
上記の設定が終わったら、ワークツリー(作業用ディレクトリ)からインデックス(ステージングエリア)にあげる為に、以下のコマンドをタイプしましょう。

```js:
myapp ユーザー名$　git add . 
```
Git addについてはこちらを[参照]
(https://qiita.com/YusukeHigaki/items/06e38eec96387d408780)
このaddの後のピリオドに関してですが、ディレクトリ(フォルダー)にある全てのファイルを追加するという意味があるようです。
そしてその後レポジトリにコミットするために以下のコマンドをタイプしてみましょう。

```js:
myapp ユーザー名$　git commit
```
コミットメッセージを入れる場合は以下のようにします。

```js:
myapp ユーザー名$　git commit -m "初めてのコミット"
```
基本的なコマンドのリストはこちらが参考になります。
https://qiita.com/2m1tsu3/items/6d49374230afab251337

その他以下のようなGitのコマンドもあります。
全てのディレクトリー内のファイルをインデックスにあげる
$ git add -A
コミットと、コミットメッセージ追加
$ git commit -m "htmlを修正"
直前のコミットを更新する方法
$ git commit --amend -m "cssを修正"

初めてのコミットがきちんとできてたか確認するには、以下のコマンドをタイプしてみましょう。

```js:
myapp ユーザー名$　git log
```
コミットメッセージが表示されていれば問題なくコミットされています。

# **RailsアプリとGitHub** #
Railsアプリをローカル環境で構築しつつ、Gitにコミットができたら、このファイルをリモートレポジトリにアップロードすることが可能です。
・GitHub-このリモートレポジトリを提供しているクラウドサービス
・Push（プッシュ)する-GitHubにローカルにあるファイルをアップロードすること

少し話がそれますが、GitHubはGitの仕組みを利用し、開発者の作品(コーディングやデザインデータなど)を保存、公開することができるようにしたウェブサービスの名称です。公開された作品を元に自分のサービスを作ることも可能です。

# **初めてのコミット（リモートレポジトリ編）** #
現在[今さら聞けない！GitHubの使い方【超初心者向け】]
(https://techacademy.jp/magazine/6235)を参考にGitHubの使い方について研究しています。

git init
git commit -m "first commit"
git remote add origin https://github.com/xxxx/xxxx.git
git push -u origin master

**ローカルレポジトリ→リモートレポジトリ** ><"

参考？
https://techacademy.jp/magazine/6235
https://www.sejuku.net/blog/7901
https://www.sejuku.net/blog/8178#Github
https://backlog.com/ja/git-tutorial/intro/intro3_1.html
[git pullを強制し、リモートでローカルを上書きする方法。]
(http://www-creators.com/archives/1097)

# **(番外編)git push時に起きたエラーについて** #
以下のようなエラーが発生しました。

```js:
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:[your id]/[repository name].git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
これは要するにローカルのMasterとリモートのMasterのバージョンの整合性が合わないことを示しており、一度以下のコマンドをタイプすることでローカル、リモート両方のバージョンの整合性を合わせてくれるようです。

git pull --allow-unrelated-histories origin master

私の場合はこれをした後、Conflictが起こりました。

```js:
* branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
```
このREADME.mdの重複している内容の片方を削除して再度addとコミットしてあげればConflictは解決するようです。
こちらを実行したあと

git push -u origin master

をしてあげれば問題なくpushできるはずです。

# **(番外編#2)git push origin master時に起きたエラーについて** #
以下のようなエラーが発生しました。

```js:
remote: Permission to xxxxxxx/xxxxxx.git denied to xxxxx.
fatal: unable to access 'https://github.com/xxxxxxx/xxxxxxx.git/': The requested URL returned error: 403
```
この場合、調べたところ作成したのも忘れていたぐらいのssh keyを削除するといいと書いてあったので、まず対象のGitHubアカウントに入って、Profile->Setting->SSH Keyと進んだら削除できます。

そのあと以下を元に
```js:
git remote set-url origin git@github.com:xxxxxx/xxxxxxx.git
```
と入力し、Enterを実行すると、無事にgit push origin masterが成功しました。。

# **参考** #

[ドットインストールGit入門]
(https://dotinstall.com/lessons/basic_git)
[サルでもわかるGit入門]
(http://www.backlog.jp/git-guide/)
[gitでpushしようとしたら403された話]
(https://qiita.com/ritukiii/items/0d14df8f0253ca223373)
[Gitマージの基本　マージ・競合・競合解決・マージしなおし]
(https://qiita.com/genreh/items/8e66f6f8f1a536830081)
[git-refusing-to-merge-unrelated-histories-on-rebase]
(https://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories-on-rebase)
[【git】既存のディレクトリやソースをgit管理化にしてリモートに紐づける流れメモ]
(http://tweeeety.hateblo.jp/entry/2016/02/10/000712)
[Need your help with github: permission denied to my own repo]
(https://www.freecodecamp.org/forum/t/need-your-help-with-github-permission-denied-to-my-own-repo/17421/2)