Git ケーススタディ集

## Gitのケーススタディ集
#### ケースからGitの使い方を学ぶ
最近業務でGitのいろいろの操作をする。たまに今までしたことない操作もして、時々間違えた操作することもある。事例からGitの使い方を学べば、捜査を間違えたとしても焦らず対応できると思い。ネットで何かないか探した。そんでこんなサイトにたどり着いた。
https://qiita.com/wariichi/items/61b5e56431a212c45b13

問題を解く感じでこの記事を読んでいこうかなと思います。
今まで知らなかった操作や、読んで方法を事例を解決するための操作を思いつかなかったときは、ここにメモとして残しておこうと思う。

## 間違ったブランチで作業をしていた
```
# 変更履歴を巻き戻し
$ git reset  <commit id>

# 移動したいブランチに移動
$ git  checkout <branch_name>
```
resetコマンドはローカルの変更履歴だけを巻き戻すだけでファイルは巻き戻さない。開発するブランチを間違えていた時、ファイル手動で対比させてブランチ移動してから上書きするみたいな手間なことをしていた。恥ずかしい......。次からはこのコマンドを使おう。
revertとresetの違いが分からなくなってきたから以下サイトでまた学習する
https://leokun0210.hatenablog.com/entry/2017/11/15/004015
revert→過去のコミットを打ち消す差分をコミットする。
reset→過去のコミットをなかったことにする。

## 修正、手直し系
#### 過去のコミットのコメントを修正したい、また追加で修正を加える
```
----------------------------
直前のコミットを反映する場合
----------------------------
# 修正を反映するファイルを選択
$ git add hoge.txt

# 選択したファイルをコミット →ammendにより直前のコミットにaddした修正が追加される
$ git commit --amend

$ git commit --amend -a
```
-aオプションを使てする記述もあったけど、いったい何だろう？

```
----------------------------
直前のコミットでない場合
rebaseを使った方法
----------------------------
```
rebaseとmergeの違い
rebaseを使うとコミットの記録が正確に残るの意味が分かったよ。
mergeは確かにブランチの内容すべてを一つのコミットにまとめてくっつけてるよね。
https://blog.codecamp.jp/git_rebase

#### あるブランチで対応した内容を開発しているブランチにコミットしたい

```
----------------------------
Cherrypicというコマンドを使う
----------------------------
# 欲しいコミットがあるブランチに移動
git checkout [branch]

# コミットの内容の内容を確認（ローカルブランチ）
git log

# コミットの内容の内容を確認（リモートブランチ）
git fetch
git log origin/master -online -2

# 適応したいブランチに移動
git checkout [branch]

# Cherrypick
git cherry-pick [commitId]

```

#### ローカルからリモートに新しいブランチを作る
```
# 対象のブランチに移動
git checkout [TargetBranch]

# ブランチを作成
git branch [NewBranch]

# 作成したブランチをpush
git push -u origin [NewBranch]

# リモートのブランチを確認
git branch -a
```

#### リモートブランチを削除したい
```
git push --delete origin branch_name
git push origin :branch_name
```

#### リモートリポジトリのブランチを誰かが削除した、自分のlocalリポジトリに反映したい
```
git fetch --prune ( git fetch -p )
```

#### 削除したブランチを復活させたい...
```
#戻したい場所をログで確認
git reflog
#ブランチ名とHEAD番号で復元
git branch ブランチ名 HEAD@{ログ番号}
```

#### コミットをリセットしたけど、戻したい...
```
#戻したい場所をログで確認
git reflog
#ブランチ名とHEAD番号で復元
git reset --soft HEAD@{ログ番号}
```

### マージしたけど戻したい
一度できたコミットを取り消す。「コミットを取り消した」という履歴の残らないようなので注意が必要。ローカルブランチで作業しててマージしてやっぱ戻したい、って時に使う。
```
git reset --hard ORIG_HEAD
```


#### フェッチしたときにリモートブランチの削除分を、ローカルリポジトリに反映してほしい
```
git config --global fetch.prune true
```

## その他
#### 2つのリポジトリをマージしたい
https://qiita.com/TsuyoshiUshio@github/items/3860757961d244b87a32


#### コミットメッセージ
https://gist.github.com/mono0926/e6ffd032c384ee4c1cef5a2aa4f778d7

#### ローカルリポジトリの内容をgithubにpushしたい！
①GitHubのリポジトリの作成
Create a new repository をする
※以下のオプションはチェックしないこと。
・README file
・Chooes a license
・gitignore file

②Localリポジトリの作成

```
#ローカルリポジトリの作成
git init -b main
git add .
git commit -m "First commit"

#local ripository に remote repository を設定
git remote add origin <remote repository url>
git remote -v

#Push
git push origin main
```

## やる前に少し考えてほしいコマンド集
```
$ git reset  <commit id>
$ git checkout  <commit id>
```
この2つのコマンドはいずれもGitからコミットの履歴を消し去ってしまうコマンドです。
まあ、reflog(コマンド実行履歴みたいなの)があるので復元可能ですが知らないと焦る。
注意点に関しては以下参照
https://prograshi.com/general/git/git-reset/


## 所感
まだまだ、Gitについて知らないことが多い......。