【講義02.PC概論】gitコマンドとGitHubで詰みを回収した話

# 本記事について
自分の備忘録と講義02.PC概論の復習と前提知識としてあったほうがいいことまとめました。
P2Pで一緒に解決したツミを書きました

## git / GitHubとは
git : バージョン（変更履歴）を管理をするもの
GitHub : Gitのバージョン管理をオンラインで共有できる
※gitとGitHubは違います

## まずgit-flow、GitHub Flowを学ぼう
少しだけ例え話を交えながら
GitHubを使う時は川に例えられることが多い
本流:mainブランチ(以前はmasterブランチ) 
支流:作業用ブランチ（Topic branch） 
川の流れの中で本流は流れが止めてはいけない。必ず動いている状態を維持する。支流でいろんな機能を作成確認をして、完璧に流れることを確認して、本流へ合流させましょう
絶対本流を汚染してはならない。汚染度合いは、自動テストが十分に存在しているのであれば、自動テストが全て通るかどうかで判断できる
支流は一時的に汚染される（通らない自動テストが存在する）ことがありうるが、本流に合流させるときには浄化処理を済ませて置く（全てのテストが通る状態に修正する）必要がある
元からあったテストが通れば良いというだけでなく、基本的には、追加/修正したコードに対する十分なテストを常に追加すべきというイメージができると良い
汚染は不具合など
参考のURL一読してもらえるとうれしいです
#### 参考 [【図解】git-flow、GitHub Flowを開発現場で使い始めるためにこれだけは覚えておこう](https://www.atmarkit.co.jp/ait/articles/1708/01/news015.html)

## 回収したツミ
### 事例1 : GitHubでreadme.mdを作成してmain branch（デフォルト）ができた後にローカルでmaster branchを作成してしまったときに起きた
#### エラー：fatal: refusing to merge unrelated histories

1. GitHub上でリポジトリを作り， readme.mdを作成
2. ローカルでgit initしてリポジトリを作り， git remote add origin <GitHubのリポジトリ>でリモートリポジトリを指定
3. ローカルで作業を行い，pushをしたら起きた
   fatal: refusing to merge unrelated histories
   と表示されpullもできない
### 原因
1.の作業でmainブランチができてしまった
2.でデフォルト（main）ブランチではなくmasterブランチを指定した

### ツミ回収方法
git mergeコマンドに--allow-unrelated-historiesのオプションを使いして実行
masterブランチがデフォルトのとき</b>
git merge --allow-unrelated-histories origin/master
<b>mainブランチがデフォルトのとき</b>
git merge --allow-unrelated-histories origin/main

実際はmasterブランチをデフォルトに切り替えてmainブランチは削除してブランチを１つにした（一人開発と初期段階のため） GitHubリポジトリのデフォルトブランチをdevelopに変更する 
Githubでブランチ削除

## なぜ起きたか
通常のマージでは，共通の祖先から分岐したブランチ同士が結合される．しかし，今回はGithubでのコミット，ローカルでのコミットはそれぞれ共通の祖先がない状態から行われてしまっているためマージができなかった

今後もgit/GitHub関連でツミが起きたものはアップしていきます

## Tips
便利な設定（やっておくと見える化できていい）
### ターミナルで作業が図解される
```
git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
```
をターミナル上で実行

```
git lola
```
コマンドがターミナルで使えます

### コマンド事例と説明
【git】基本コマンド

```
git init //初期化
git add * //現在あるファイル全部追加
git commit -m "コメント" //コミット
```

#### ファイル更新までの基本手順

```
git add [変更/追加したファイル名]
    or
git add .（全部あげてもいい）
git commit -m"コメント" // ファイルをコミット
git push origin 【branch名】//※Topicブランチが多い
```

#### リモートブランチの確認（urlも表示）

```
git remote -v
```

#### 今やってる作業を一時退避する

```
git stash
git stash pop //戻す場合
git stash list //退避の一覧
git stash clear //退避の消去
```

#### ログ表示

```
git log //コミットのログが見れる
git log -p
git log --oneline
git reflog //いろいろ見れる
git reflog origin/branch_name //pushのログが見れる
```



#### Topicブランチをマージさせる方法（一人の時はほぼ使わない）
```
git checkout branch名 //Topicブランチに切り替え
git pull origin develop //リモートdevelopから最新の情報をpull
git merge --no-ff branch名 //Topicブランチ作業に移動先のブランチをマージ
git checkout branch名 //ブランチの切り替え
git merge --no-ff branch名 //Topicブランチ作業しているブランチのマージ
```

#### ブランチの切り替え
```
git checkout 【branch名】
git checkout -b 【branch名】//新しいブランチを作成して移動する
git checkout -t origin/develop // 名前の
```


ブランチ名変更

```
git mv 変更前のブランチ名 変更後のブランチ名
git commit -a -m "rename"
git push origin master
```

差分チェック

```
git diff
git diff HEAD^ //最後のコミットからの差分を表示
git diff --name-only HEAD^ //差分ファイルを表示
git diff file1.txt file2.txt //特定フィイルの差分
git diff commit1 commit2 //コミットの差分
```

慣れてきたらヘルプコマンドの利用してhelp内容を読んだだけで使い方が理解できるようになるのが望ましいです
ググった情報や書籍の情報は古くなるので

```
git help <サブコマンド> 
``` 

よく使う / 使っていくコマンドもアップデートしていきます