githubを使い始める

ウェブアプリを自作中なのですが、ファイルの数が増えてくると、変更管理がしにくくなったので、githubを使ってみようと思います。現状の目的としては、素朴なバックアップ代わりになってくれればいいかな程度です。(今はVMごととっているので…)
最近は社内外問わず、システムやソフトウェアがgitで開発されていることが多く、理解しないとヤバそう、という動機もあります。

# プロジェクトの作成
まずは以下にアクセスして、(アカウントと)プロジェクトを作成します。
https://github.com

![20170117_001.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/eea95c2b-81b3-5ca4-4a1f-bf15cd34ec01.jpeg)

![20170117_007.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/9b4adab0-335a-638b-11b3-2de2b11263c4.jpeg)

基本的にはプロジェクト名だけ決めて、あとはデフォルトでよいかと。ReadMeはあったほうがいいかとおもいましたが、あるとローカルからPushする際に邪魔になったので、自分の構成管理だけなら不要かと。

# ローカルからのアップロード
## ローカル側の準備
まずそもそもの準備として、gitはフォルダ(ディレクトリ)とその中のファイルを対象に変更管理するので、必要なファイルは1つのフォルダにまとめておく必要がある。(ここでは/root/pluto/としている)
また、gitにあげたくないファイルは.gitignoreというファイルを作成して、そこに記載すればよい。.gitignoreはルートになるディレクトリにあればいい。別に下の階層においてもよいが、その階層以下でしか作用しない。
今回のフォルダ構成は、
* /root/pluto/
  * db/
  * env/
  * static/
  * templates/
  * README.md
  * pluto.py
  * requirements.txt
  * schema_pj_main.sql

dbは実データがいろいろ入るので除外し、Pythonのvirtualenv(env)も除外。またpyを実行した際にできるpycも除外します。
[root@localhost pluto]# cat .gitignore
*.pyc
env/
db/

requirements.txtというのは、Pythonの仮想環境のpackageのインストール状況を定義したテキストです。
以下のコマンドで生成できます
`(env) [root@localhost pluto]# pip freeze > requirements.txt`
他の環境にて、同等な構成を作りたい場合は以下を実行します。
`pip install -r requirements.txt`


## アップロード
以降は作業対象のマシン上で実行します。
以降のやり方は、作成したプロジェクトの画面(すぐ下の画像参照)にも書いてあるのそのままなのですが、以下のようになります。
1. git initでディレクトリをgitレポジトリに設定
2. git configでgitのユーザ名とメールアドレスを設定
3. git addで管理対象にするファイルを指定(最初は1つだけにします)
4. git commitで変更をコミット
5. git remote addでリモートのレポジトリを追加(URLは以下で確認できます)
![20170117_008.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/67eefe01-075c-e7b0-5540-552e7afa0582.jpeg)
6. git pushでローカルのファイルをリモートのレポジトリへコピー

ただ初回は下記のように失敗しました。

```shell-session
[root@localhost pluto]# git init
Initialized empty Git repository in /root/pluto/.git/
[root@localhost pluto]#
[root@localhost pluto]# git config --global user.name "KI1208"
[root@localhost pluto]# git config --global user.email xxxx@xxxx
[root@localhost pluto]#
[root@localhost pluto]# git add README.md
[root@localhost pluto]# git commit -m "first commit"
[master (root-commit) 38a6948] first commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README.md
[root@localhost pluto]#
[root@localhost pluto]# git remote add origin https://github.com/KI1208/pluto.git
[root@localhost pluto]#
[root@localhost pluto]# git push -u origin master
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/KI1208/pluto.git/info/refs

fatal: HTTP request failed
```

どうやら、HTTPSで実施する場合、URLにユーザ名を追加しなくてはいけない模様。理由がよくわかりませんが…。
すでにURLを登録してしまったので、修正してからやり直し。

```shell-session
[root@localhost pluto]# git remote set-url origin https://KI1208@github.com/KI1208/pluto.git
[root@localhost pluto]# git push -u origin master
Password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 219 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://KI1208@github.com/KI1208/pluto.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
[root@localhost pluto]#
```

OKだったので、残りをまとめてアップロード。gitignoreで除外してあるので、ディレクトリごといきました。

```shell-session
[root@localhost pluto]# git add .
[root@localhost pluto]# git commit -m "second commit"
[master 6c19103] second commit
 9 files changed, 229 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 pluto.py
 create mode 100644 requirements.txt
 create mode 100644 schema_pj_main.sql
 create mode 100644 static/style.css
 create mode 100644 templates/layout.html
 create mode 100644 templates/login.html
 create mode 100644 templates/modify_pj_entry.html
 create mode 100644 templates/show_pj_entries.html
[root@localhost pluto]# git push origin master
Password:
Counting objects: 14, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (13/13), 3.72 KiB, done.
Total 13 (delta 0), reused 0 (delta 0)
To https://KI1208@github.com/KI1208/pluto.git
   38a6948..6c19103  master -> master
[root@localhost pluto]#
```
これでリモート側を確認すると、正しく更新されていました。
![20170117_010.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/08f0c574-deb4-b6c7-c073-229abab3ef64.jpeg)

これでベース(大元のバックアップ)はできたので、ブランチを作ります。
※自分は、ブランチはベースは残して色々いじれる作業場所、と認識しています。

1. git checkoutで新しいブランチを作成、移動
-bを付けると、作成したブランチにそのまま移動します。
2. そのブランチで何らかの変更を追加し、git addで管理対象に追加
今回はテキストファイルを作成。
3. git pushでリモートレポジトリにそのブランチをコピー

```shell-session
[root@localhost pluto]# git checkout -b 20170117A
Switched to a new branch '20170117A'
[root@localhost pluto]# git status
# On branch 20170117A
nothing to commit (working directory clean)
[root@localhost pluto]# echo "Branch 20170117A" >> temp.txt
[root@localhost pluto]# ls
db  env  pluto.py  pluto.pyc  README.md  requirements.txt  schema_pj_main.sql  static  templates  temp.txt
[root@localhost pluto]# git add temp.txt
[root@localhost pluto]# git commit -m "Branch Test"
[20170117A cf5afba] Branch Test
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 temp.txt
[root@localhost pluto]# git push origin 20170117A
Password:
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 291 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
To https://KI1208@github.com/KI1208/pluto.git
 * [new branch]      20170117A -> 20170117A
[root@localhost pluto]#
```
これでリモートレポジトリを確認すると、
![20170117_012.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/a2e5319e-d3b6-5a33-024a-3b2d3f0515f9.jpeg)
![20170117_013.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/f6395300-7282-be16-88e3-b866dc3eeac7.jpeg)
きちんと別のブランチに変更が保存され、元のmasterはそのままでした。これで、バックアップを取りつつ作業を進めたいという最低限の要求は満たせそうです。

# Tips
git push -u の-uはUpstreamの意味。指定したブランチをメインのブランチとみなし、pullなどはデフォルトそこから行うようになる。

git push origin 20170117Aは省略形。実際は、
git push origin 20170117A:20170117A
構文としては、
`git push <remote repository> <local branch>:<remote branch>`
originがリモートレポジトリ(のURL)の別名。以下で確認できる。
[root@localhost pluto]# git config --list
remote.origin.url=https://KI1208@github.com/KI1208/pluto.git