心配性が始めるgit管理(確認/修正をするgitコマンド集)

2019/10/09追記  
- 頂いたコメントから [コミットそのものをミスった -> コミット取り消し](https://qiita.com/s-kamada/items/63737b123c671642c27d#%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E3%83%9F%E3%82%B9%E3%81%A3%E3%81%9F---%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%97)に追記
- 同項に注意事項を追記

# はじめに
今年の3月に大学を卒業し、4月からアプリを作る会社に入社した者です。
iOSアプリを作るエンジニアしてます。Androidアプリも勉強してます。

**超心配性です。**

仕事で当然Gitを使う訳ですが、、、これが新米エンジニアには難しい。
入社直後、.gitignoreの設定をミスってしまい、`FilesChanged`が7000を超えるトンデモPRを生み出したことがあります。(その後.gitignoreの設定を直したら、今度はなぜか.xcodeprojファイルがぶっ壊れて...と修正に丸々1日潰しました :innocent: )

それ以来、**超超心配性**な性格も相まって
「.gitignoreの設定反映されてないかな...」
「このままpushしても大丈夫かな...コミット履歴ミスってないかな...」
「mergeのブランチ間違えてないかな...」
と必要以上の心配をすることがあります。

その度に調べるのは大変なので、**何かを確認/修正するgitコマンド**を中心に紹介します。
随時更新したいです。

## 何かが心配な時に使うコマンド
#### コミットログがどうなっているか心配
```bash
$ git log
```
コミットIDがみたい場合 `--oneline`
HEADの位置をみたい場合 `--decorate`
ツリーを見たい場合 `--graph`
など、logのオプションはたくさんあります
参考: https://qiita.com/take4s5i/items/15d8648405f4e7ea3039

#### .gitignoreがちゃんと働いているか心配
ignoreされたファイルを表示、

```bash
$ git status --ignored
On branch develop
(中略)
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

	.DS_Store
	Carthage/
	Pods/
    #...
    #ignoreされたファイル
```


#### どのファイルがステージングされてるか心配 -> 一覧を見る
```bash
$ git ls-files<img width="327" alt="スクリーンショット 2019-10-08 11.39.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203273/59749482-6cf1-70fe-4a20-fe020b7b92c6.png">

.gitignore
Podfile
Podfile.lock
README.md
hogeProject/HogeViewController.swift
(略)
```
ステージングされたファイルの一覧

#### merge元のブランチとmerge先のブランチが合っているか心配
`feature`ブランチで編集中に、`develop`ブランチに変更が加わり、`feature`ブランチにもその変更を反映したいとき
<img width="327" alt="スクリーンショット 2019-10-08 11.39.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203273/80a36b03-e666-5fb8-7f12-a2fb2330c3df.png">

「あれ？featureブランチでmerge叩けばいいんだっけ？ :thinking: 」
ミスっても `git revert`とかすればいいんですが。初心者心配性エンジニアはそれを知っててもmerge前に1回心配します。

```bash
$ git checkout feature
Switched to branch 'feature'

$ git merge develop --no-commit
Automatic merge went well; stopped before committing as requested
```

マージコミットが作られないけどdevelopブランチの変更が取り込まれた状態になります。
ワーキングツリーを確認してcommitすればちゃんとmergeされた状態になるし、間違えてたら`git merge --abort`すれば良さそうです。


#### addの前に変なファイルがaddされたりしないか心配

```bash
$ git add --dry-run <addする予定のファイル>
add 'addする予定のファイル'
# 実際にaddされるわけではない
```

#### pushの前に今いるブランチは間違えてないか、push先のブランチは間違えてないか心配

```bash
$ git push -n <リモート名> <プッシュ先ブランチ>
To https://github.com/hogehoge/fugafuga.git
   123456..7890ab  local_branch -> remote/branch
# 実際にpushされるわけではない
```
要は前述の`--dry-run`と同じです

## 何かをミスった時に使うコマンド

たとえ **超超超心配性** でも、「ミスっても○○すれば直るから大丈夫だもんね！」というお気持ちになれれば心強いもの。

#### コミットコメントをミスった -> 直前のコミットを編集
viが開かれ、コミットメッセージを編集できる

```bash
$ git commit --amend
```

#### コミットそのものをミスった -> コミット取り消し

```bash
$ git reset (オプション) HEAD~
```

`reset`コマンドはオプションとresetするコミットの指定方法によって色々できます
オプション

- `--soft` commitのみ取り消し
- `--mixed` commit, add取り消し(オプションなしの場合もこれ)
- `--hard`または`--merge` そもそもの変更ごと取り消し

どこまで戻すか

- `HEAD` 最新コミットまで戻る(最後のコミット後に変更した内容だけreset)
- `HEAD~`または`HEAD^`または`HEAD@{1}` コミット1つだけreset
- `HEAD~~~`または`HEAD^^^`(n個~や^をつける)または`HEAD@{n}`または`HEAD~n` コミットn個reset  
※`~`と`^`にも一応違いがあるようですが、resetする分にはほとんど違いがないはずです。。。
https://qiita.com/chihiro/items/d551c14cb9764454e0b9


(2019/10/09追記、コメントありがとうございます :bow: :bow: )
`HEAD`のエイリアスとして`@`が使えるので、上記の`HEAD`を`@`として置き換えても可です

#### `git reset`もミスった -> reset取り消し
```bash
$ git reset --hard ORIG_HEAD
```

#### 作成するブランチ名をミスった -> ブランチ名変更
```bash
$ git branch -m <変更前のブランチ名> <変更後のブランチ名>
```

#### マージをミスった -> マージ取り消し
```bash
$ git merge --abort
```

#### コミットするブランチを間違えた -> cherry-pick
```bash
(移動先のブランチに移動してから)
$ git cherry-pick <移動元ブランチでのハッシュ値>
```

#### マージしたらコンフリクトした(マージをキャンセルする場合)
```bash
$ git merge --abort
```

# さいごに
gitの知識と失敗の経験が身についてきたら心配性も緩和されていくと思うので、要勉強です
失敗するたびに更新して行きたいですね :innocent: 
自分の心配性が極端なのは自覚してますが、一息ついて確認するのも大事だと思いますよ。。。

# お気持ち
[sourcetree](https://www.sourcetreeapp.com/)とか[gitkraken](https://www.gitkraken.com/)とかのgitクライアントを使えばレポジトリの状況が見えやすくなるから心配性も緩和されることに最近気づきました。。。