情弱のためのGitHub入門

# はじめに
自分用です。。
参考
https://dotinstall.com/lessons/basic_git
http://lilylila.hatenablog.com/entry/2018/06/22/071932
branch関係
https://www.granfairs.com/blog/staff/gitbeginner01
fork先のリポジトリの情報を持ってくる関係
https://qiita.com/taoki11111/items/6582dafeb971f66d1f79

# リポジトリの作成

管理したいディレクトリに移動して

~~~bash
$ git init
~~~

GitHubのページに行って、新しいRepositoryを作る。
ターミナルに戻って、README.mdを作る。

~~~bash
$ echo "# <プロジェクト名>" >> README.md
~~~

のっけたくないファイルやフォルダがあったら、.gitignoreファイルを作ってその名前をかく。

~~~bash
# style.cssがいらない
style.css
# tsファイルは全部いらない
*.ts
# /imagesフォルダはいらない
/images
~~~

インデックス(ステージングエリア)に追加(add)する。

~~~bash
$ git add .  # 全部 
$ git add <ファイル名>
~~~

リポジトリにcommitする。

~~~bash
$ git commit -m "コメント"
~~~

リモートリポジトリにpushする。

~~~bash
$ git remote add origin https://github.com/CanonMukai/<プロジェクト名>.git
$ git push -u origin master
~~~

# 便利
addとcommitを同時にできるコマンド

~~~bash
$ git commit -am "add and commit"
~~~

# ちょっとだけコマンド集

~~~bash
# commitをログを見る
$ git log
# 見るのを終了するときはqを押す

# 差分を見る(ステージングに何かあるとき)
$ git diff
# ないとき
$ git diff --cached

# 直前のコミットに戻る
$ git reset --hard HEAD
# 直前の1こ前のコミットに戻る
$ git reset --hard HEAD^
# とあるコミットに戻る
$ git reset --hard <commit idの最初の7桁以上>
# 1こ前まで自分が採用していたコミットに戻る(今までのはあくまでコミットの時系列)
$ git reset --hard ORIG_HEAD
~~~

# branch
hogeというbranchを作る。下の流れを見るとbranchのすごさがわかる。

~~~bash
$ git branch  # branchを見る
*master
$ ls
index.html 
$ git branch hoge  # hogeというbranchを作る
$ git branch
*master
 hoge
$ git checkout hoge
$ git branch
*hoge
 master
## 新しいファイルstyle.cssを作る
$ ls
index.html style.css
$ git add .
$ git commit -m "Add style.css"
$ git checkout master
$ ls
index.html  ## style.cssはhogeにしかない！！
~~~

branchちょい技紹介。
以下のコマンドでhogeという新しいbranchを作り、さらにcheckoutすることができる。便利。

~~~bash
$ git checkout -b hoge
~~~

# merge(さっきの続き)
hogeで作ったstyle.cssをmasterにも反映させたいとき

~~~bash
$ git branch
*master
 hoge
$ git merge hoge
# ログを見るとhogeのcommitが付け足されてる
$ ls
index.html style.css
# hogeを消そう
$ git branch -d hoge
$ git branch
*master
~~~

# merge conflictの対応(頑張るぞ)
a.txtをを用意し、masterにすでにcommitしている状態。

~~~txt:a.txt
original
~~~

ここで、hogeというbranchを作っておく。このときmasterでもhogeでもa.txtの内容は"original"。

~~~bash
$ git branch hoge
~~~

master branchでa.txtを以下に変更してadd, commitしておく。

~~~:a.txt(master)
Edit in master
~~~

hogeに移動する。

~~~bash
$ git checkout hoge
$ git branch
*hoge
 master
~~~

a.txtを以下に変更してadd, commitしておく。

~~~:a.txt(hoge)
Edit in hoge
~~~

masterに移動。

~~~bash
$ git checkout master
$ git branch
 hoge
*master
~~~

ここで、hogeの内容をmasterにmergeしようとすると、a.txtの"original"の状態からどちらのbranchでも変更しているのでmerge conflictが起こる。

~~~bash
$ gir merge hoge
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
# git statusで状態を確認
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both modified:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")
~~~

このmerge conflictをエディタを使って解消する。
masterのa.txtをエディタで開くと以下のようになっている。

~~~:a.txt(master)
<<<<<<< HEAD
Edit in master
=======
Edit in hoge
>>>>>>> hoge
~~~

hogeを適用したいので以下のように変更する。手作業面倒だけども...

~~~:a.txt(master)
Edit in hoge
~~~

これをadd, commitするとmerge conflictを解消できる。

# 共同作業
~~~bash
# 他の人のリモートリポジトリの中身をクローンする
$ git clone https://~~~~
# リモートリポジトリをoriginに割り当てる(?)
$ git remote add origin https://github.com/~~~~~
# リモートリポジトリにローカルリポジトリの変更を反映させる
$ git push origin master
# 他の人が先にリモートリポジトリを変更していたらエラーがでるので、
# まずはリモートリポジトリの内容を引っ張ってくる
$ git pull origin master
# 運悪く他の人が自分と同じ箇所を変更していたらmerge conflictを解決する
~~~



とりあえずここまで。