Github の始め方(ローカルにすでにディレクトリがある場合）[備忘録  ]

# きっかけ
github 以前使おうとして、アカウントを使っていたりはしていた。
使いこなせなくて、それ以降使っていなかったので、今回改めて始めた。

途中から始める場合には、git push の時などにつまずくポイントがあったのでまとめる。

参考にした記事
[GitHub 入門](https://qiita.com/ay3/items/8d758ebde41d256a32dc)

すごくわかりやすく、環境構築のところから書いてあります。

まだ、インストールもできていないという人はぜひ参考にしてください。

# 環境
```
$ git --version
git version 2.20.1 (Apple Git-117)
```
mac OS mojave

# まとめ
最初に最終的にどんなコードを実行したのかを書きます。

```summary.sh
# 0.　gitの環境構築 (install,公開鍵認証、メールアドレス登録など）

# 1. localの自分のディレクトリでgit を開始する、ローカルに現在のディレクトリを全てコミットする。
git init

# 除外するファイルの設定（除外したいファイル名やディレクトリ名を書きます）
vim .gitignore

git add .
git commit -m "commit message"

# 2. remote repositoryの登録
git remote rm origin  # １度リモートのレポジトリを登録している場合
git remote add origin https://github.com/Username/Repository_name 

# 3. remote　のrepositoryと統合する fetch and merge
git fetch
git merge --allow-unrelated-histories origin/master

# 4. local のrepositoryをremoteにpushする
git push -u origin master

# 5. よく使う処理
git status #　commit,addされていないファイルなどの確認
git diff # どんな変更がされたのか確認
git add . # カレントディレクトリを全てステージング（仮のコミット）する
git diff --cached # 差分の確認
git commit -m "commit message" # commit
git push # remote にlocal での変更を反映させる
git pull # localに　remoteの変更を反映させる
git log # commitの履歴を確認
git log --oneline # 1行でcommitの履歴を確認　hashとcommit message
git log -p -n # 直前のn件のcommitの変更点を行単位で確認する。また、commitの時刻も確認できる
git log --pretty=format:"%cd %s" 
#--pretty=formatを使うことで、自分の好きな情報を、好きなフォーマットで出力することができます。
# %cd でcommitの時刻　%s でcommit messageをみることができます。

```
##　インストール、メールアドレスの設定
事前にGithubで登録（アカウント作成時）

```
git config user.email メールアドレス
git config user.name ユーザ名
````

## config 設定の確認
```
git config --list
git config 確認したい設定
```

## 現在あるディレクトリをCommit

```
# 0.　gitの環境構築 (install,公開鍵認証、メールアドレス登録など）

# 1. localの自分のディレクトリでgit を開始する、ローカルに現在のディレクトリを全てコミットする。
cd target_dir
git init

# 除外するファイルの設定（除外したいファイル名やディレクトリ名を書きます）
vim .gitignore

git add .
git commit -m "commit message"
```

## 公開鍵認証
公開鍵で送りたい場合 setting -> SSH and GPG keys で確認できます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253261/fc1f6a6d-c2b0-53a2-8d4e-a8a1118c1e2d.png)



## localのディレクトリを登録する (git remote rm originが必要）
```
$ git remote add origin https://github.com/Adaachill/atcoder.git
fatal: remote origin already exists.
```

でエラー。
http://pyoonn.hatenablog.com/entry/2014/10/29/191744
を参考に 
`git remote rm origin`をする

## ローカルのディレクトリをpushする
一旦remoteを設定し直すことで、リモートの登録はできたものの、git push でエラーが。
リモートにあるファイルやディレクトリ（README.txtなど）がローカルにはないことが原因。

＊逆にGithubでのremoteレポジトリ作成時に何もdiscriptionを書かないと、README.txtが生成されず、空のレポジトリになるのでmergeせずにそのままpushできる（というよりは、mergeするとエラーが出る）ようです。[そのことについて記事](https://qiita.com/Adaachill/items/d24e8b0ce4085673c06b)を書きました。

```
$ git remote rm origin
$ git remote add origin https://github.com/Adaachill/atcoder.git 
$ git push -u origin master
To https://github.com/Adaachill/atcoder.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/Adaachill/atcoder.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

長々とエラーが出たので、辟易しながら読んでみると、
remoteの方にローカルの方にはない、元からあったwork（ファイル？）があるので、失敗しました。
なので、まずは、remoteの方の変更をintegrateしてください。と言っています。

### remoteの変更をマージする(まずリモートのmergeが必要）
```
git fetch && git merge origin/master
fatal: refusing to merge unrelated histories
```

でそのままやるとmergeできない。
https://qiita.com/takanatsu/items/fc89de9bd11148da1438　
を参考にして、`--allow-unrelated-histories`をつけると解決した

```
git merge --allow-unrelated-histories origin/master
Merge made by the 'recursive' strategy.
 README.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 README.md
```

この時に、なぜか自動的に、マージ用の設定ファイルがvimで開かれたのですが、そのまま閉じました。

次にREADME.mdをいじって変更を反映させようとしたところ、反映されませんでした。

```
$ git push origin master
Everything up-to-date
```

https://www.ksakae1216.com/entry/2016/06/09/160000
を参考にすると、もう一回commitすればいいようです。

```
$ git add README.md 
$ git commit -m "re commit"
```

これでもう一度pushすると反映されました。

## 手元でファイルをいじった後commitするまでの流れ
これで、とりあえず、今まであったファイルやディレクトリをGithubにあげることができました。
今度は、そこからローカルでファイルをいじる場合のコマンドを調べます。

流れとしては、ファイルを変更したら、git status,git diffでその変更内容を確認してから、git addでステージングエリア（commit 前の仮の場所のようなもの）にあげ、さらに今度はcommitされているものとの差分を確認をしてcommitします。

差分を確認しすぎな気もしますが、commit前に何度も書き換える場合は、こういうことをしないとどこが変更されるかわからなくなって大変なことになるのでしょう。

```
git status #　commit,addされていないファイルなどの確認
git diff # どんな変更がされたのか確認
git add change_file # 指定したファイルの変更内容を確認する
git diff --cached # 現在commitされているものとの差分の確認
git commit -m "commit message" # commit
git push # remote にlocal での変更を反映させる
git pull # localに　remoteの変更を反映させる
```


## git push -u について
git push の際に`git push -u origin master`とすると、次の時から、リモートやローカルのレポジトリの名前を指定しなくても、`git push` `git pull`で実行することができるようです。

# commit log の確認
基本的にcommitのlog は`git log` でみることができます。

ただし、これは、authorやdate,commitのhash番号も含まれていて見にくかったりします。

`git log --oneline`で1行の簡単な履歴をみることができます。commit messsage のみw見たい時には便利です。

```
$ git log --oneline
bf5a668 (HEAD -> master, origin/master) re commit
794220c Merge remote-tracking branch 'origin/master'
21cf55e 2nd commit
edd4808 first commit
0eb5287 master branch change
9901a53 Initial commit
```

細かいファイルの差分を見たい場合は`git log -p `を行うことでみることができます。
`git log -p -n` で直前のn件のcommitについての情報を得ることができます。


```
diff --git a/README.md b/README.md
index 7b84569..0319ff8 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
-# hello-world
-1st repository and sample
+# AtCoder 
+AtCoderの解いたファイルを保存します。
+今後整理はしたいですが、解けてないコードなども含まれています。
 
-#master branch change(commit)
-this is the master branch change
```

-　が先頭に着くのが、削除、変更前された行
+ が先頭に着くのが、追加、変更後された行です。

`git log --pretty=format:"%cd %s" `
--pretty=formatを使うことで、自分の好きな情報を、好きなフォーマットで出力することができます。
 %cd でcommitの時刻　%s でcommit messageをみることができます。
他にもいろんな情報を出せるようなのできになる方は調べてみてください

https://qiita.com/hirotsugu_kawa/items/41afaafe477b877b5b73
この記事がgitのログについては非常にわかりやすいです。



まだ基本的なコマンドも全然わかっていない状態で、かつ他の人のブログからコードをコピペしただけで何をやっているかがわかっていないことが多いのでぼちぼち学んでいこうと思います。