git早見表

# この記事を書こうと思った背景
- gitで何ができるかは把握してるが、期間があいてしまうと具体的にどのコマンドを打てばいいか忘れてしまい、都度ぐぐっていた。その無駄な時間をなくしたい。
- アウトプットすることによって、自分の頭を整理したい。
- Done is better than perfectの精神で書いてます。後から自分も見返す前提なので、必要だと思ったことは追記していきます。もし誤字脱字があった場合や、こういうことも書いた方がいいよ、ということがあればご指摘ください。

## 基本的な流れ
### リポジトリの初期化
- `git init` 
- `git clone <github等のURL>`
  
### 変更内容のリポジトリへの記録
ローカルの作業内容を、リポジトリへ記録します。
- `add .`   or `add <指定のファイル>` 
- `commit -m "commit message"`
- `push -u origin master `

pull (fetch + merge), checkout -b (branch \<branch_name> + chekcout)

### 追跡とステージングという概念
gitproのページがわかりやすかったので、引用します
<blockquote>
作業コピー内の各ファイルには追跡されている(tracked)ものと追跡されてない(untracked)ものの二通りがあることを知っておきましょう。
 追跡されているファイルとは、直近のスナップショットに存在したファイルのことです。これらのファイルについては変更されていない(unmodified)」「変更されている(modified)」「ステージされている(staged)」の三つの状態があります。
 追跡されていないファイルは、そのどれでもありません。直近のスナップショットには存在せず、ステージングエリアにも存在しないファイルのことです。 最初にプロジェクトをクローンした時点では、すべてのファイルは「追跡されている」かつ「変更されていない」状態となります。チェックアウトしただけで何も編集していない状態だからです。

ファイルを編集すると、Git はそれを「変更された」とみなします。直近のコミットの後で変更が加えられたからです。変更されたファイルをステージし、それをコミットする。この繰り返しです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407898/64c13cf8-1bb7-a880-e8d4-1f50a29c4fd8.png)
</blockquote>

参考：[gitpro 2.2 Git の基本 - 変更内容のリポジトリへの記録](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%A4%89%E6%9B%B4%E5%86%85%E5%AE%B9%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%B8%E3%81%AE%E8%A8%98%E9%8C%B2)
- 上記に出てくる三つの状態（untracked,modified,unmodified)は、絶対に覚えておくべきです。git statusとたたいた時や、エラー文などにそのまま表示されます。

- 初学者の人はこちらの図の方がわかりやすいかも。でも上の３つの状態は英語でそのまま覚える方が吉。
  - [いまさらだけどGitを基本から分かりやすくまとめてみた](https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0#%E3%83%AF%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%84%E3%83%AA%E3%83%BC%E3%81%8B%E3%82%89%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%BE%E3%81%A7%E3%81%AE%E6%B5%81%E3%82%8C) 

### ローカルのブランチを削除する
`git branch -d {ブランチ名}`
`git branch --delete {ブランチ名}`
マージ済のブランチのみを削除できます。もし、マージしていないブランチを削除する場合は`git branch -D {ブランチ名}`で強制的に削除できます。

### upstreamについて
push 先のブランチをトラックするように設定されます。トラックされたブランチがデフォルトでpushやpull の対象になります。 
`git push -u origin {branch_name}`
もしくは
`git push --set-upstream origin {branch_name}`

エラー文の例。
```
fatal: The current branch {branch_name} has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin {branch_name}
```
ブランチを切った直後にpushする時に出がち
 
### aliasをつくる
長いコマンドを短縮したかたちで打つことができます。
例：`git config --global alias.co checkout`
- `git co`でchekoutと同じことができる。
- 個人的に設定してるalias
  - `git config --global alias.graph log --oneline --decorate --graph`
#### gitの設定をみる
- `git config -l`


## これなんだっけ？となるもの
### 自分の作業をかくす（一時退避させる）
`git stash` or `git stash save`

`git stash list`
退避させた一覧をみる

```
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file 
stash@{1}: WIP on master: c264051 Revert "added file_size" 
stash@{2}: WIP on master: 21d80a5 added number to log
```

`git stash apply stash@{2}`
退避から戻す。

`git stash drop stash@{1}`
stashを削除する

### remoteブランチの操作
- `git remote -v`
  - remoteに設定してるブランチの確認
- `git remote rm <repository>` <repository>には、originなどが入ります
  - remoteで設定してるブランチの削除
- `git remote add <repository> <path>`
  - 追加

### 直前のcommitメッセージを変更する方法

```
$ git add .
$ git commit -m "modify task A"
$ git commit --amend -m "modify task B"
$ git log  // 直前のlogのコミットメッセージが "modify task B"になっているのを確認。
```

もし既にpush済みなら、-fコマンドで強制プッシュ。
```
git push -u origin branch-name -f
```

### ローカルブランチの、ブランチ名の変更

`git branch -m <旧ブランチ名> <新ブランチ名>`

参考：
https://www.granfairs.com/blog/staff/git-commit-fix


### 直前のaddを取り消し

`git add <ファイル名>`をした場合、下記コマンドで戻せる

`git restore --staged <ファイル名>`



### 危険な呪文
一度やってしまうと取り返しがつかなくなるコマンド
- `git push --mirror`
  - ローカル環境をサーバー側へ反映。試したことはない。チームで作業してる場合は危険。
### 今後まとめたい内容（追記予定）
- [x] upstream(21/06/05)
- [ ] ログをみる（log,status,diff）
- [ ] HEADの存在
- [ ] vimの使い方と発生するタイミング
- [ ] git-completionについて（Mac用）
- [ ] 作業のやりなおし
- [ ] reset

### 参考
- gitpro
  - https://progit-ja.github.io/
- qiita記事
  - https://qiita.com/yamamoto7/items/fe15a1e7e360b4015fae
  - https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0
- Udemy
  - https://www.udemy.com/course/unscared_git/