【git駆け出し向け】これだけ知っとけばなんとかなる（と思っている）gitコマンドチートシート

先に謝罪：アドベントカレンダーに間に合わせるため、多少雑になってしまいました。必要に応じて加筆修正入れます


gitに出会って7年くらい経ちましたが、「これだけ知っておけば90%くらいの状況においては困らなくね？」と感じているコマンドについて整理しておく。

gitコマンド多すぎ問題があるので、どこまで知れば取り急ぎ、9割程度の場合は困らないかにフォーカスします。
これだけは呼吸をするように命令すべし(と思っているものです)。

※概要理解のため、細かいところを省いたりしていますが、細かい部分については実践で学ぶのが最も良いと思うので、それぞれのプロジェクトなどで実践してください。

### 説明すること

- コマンドで何がおきるかの概要

### 説明しないこと

- 厳密なブランチの変化
- commit履歴の変化


# git clone

GithubやGitLabで管理されているリモートリポジトリを、ローカルリポジトリとして、文字通りクローン（複製を作る）コマンド。
開発などを開始する際に、まず初めに実行するコマンド。

![gitclone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/aaf1a40d-c9c1-63dc-17d4-d24627959dfd.png)


## 使い方

まず任意のディレクトリに移動する。
```
cd /C/user/soepy
```
hogeにあるfugaリポジトリをローカルにcloneする場合は以下のようになる。
```
git clone https://github.com/hoge/fuga.git
```
soepyフォルダ以下にfugaフォルダが作成されます。その中には現在のmainブランチ（masterとか、developとかプロジェクトによって名前は違うが）の状態がクローンされています。


# git checkeut -b 

gitの特徴であるブランチ管理のメリットを享受するための最も重要なコマンドかもしれません。
出荷物を作成したり、最も状態の進んだブランチがmainであるのであれば、そこから自分用のブランチを複製して開発し、再びその修正をmainに戻す（マージする）。
一般的に最もシンプルな「トランクベースの開発」といったりするものは、このような流れで開発が進んできいます。
そのために新しいブランチをmainブランチから分岐させて新しく作るのがgit checkout -b コマンドという理解で概ねOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/f506f2a3-40f7-2b83-e7f2-6de47fe2c277.png)


## 使い方

まずcloneしたフォルダに移動します
```
cd /C/user/soepy/fuga
```
この時mainブランチにいることを確認してください。

```
git branch 
```
先頭に * がついているものが今のブランチです
ここでtopic-hogeブランチを作って切り替える場合
```
git checkout -b topic-hoge
```

これで、目的が達成されます。

※正確には -bをつけることでbranchとcheckoutを同時にやっていることにになるので複数のコマンドを集約している感じです。

https://qiita.com/yamaday0u/items/487c304ac63b693f4dfa


# git fetch

git cloneはなにもないところにリモートから持ってくるコマンドですが、git fetchはすでにあるものに対し、リモートにのみ存在する差分をローカルのリモート追跡ブランチに持ってくるだけのコマンドです。
pullとの差は、実際にローカルのブランチに入るか入らないかの差です。
ここイメージしづらいのでリンクしておく。

https://qiita.com/wann/items/688bc17460a457104d7d

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/cfe2d1ba-6758-8678-9281-e4a30cb995a4.png)


## 使い方

まずcloneしたフォルダに移動します
```
cd /C/user/soepy/fuga
```
リモートリポジトリのブランチの状態取り込む場合は以下のようになります
```
git fetch 
```

# git pull

チーム開発をすれば、他者の修正内容が反映されることによりブランチの状態が変化していきます。cloneした時空変更が増えます。その変更をローカルに取り込む場合、このpullコマンドを使います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939153/f5caa35b-97d0-fd2f-0608-c0b3a1e0e911.png)



## 使い方

まずcloneしたフォルダに移動します
```
cd /C/user/soepy/fuga
```
リモートリポジトリブランチの状態取り込む場合は以下のようになります
```
git pull
```

ここで注意なのが、「git pull」は、今のブランチの差分をリモート→ローカルに持ってくる動作になります。

mainブランチの内容をローカルリポジトリに持ってくるときはcheckoutしてmainブランチに切り替えた状態でやります。


# git add

修正した差分をブランチに反映させるための準備（ステージング）を実行するコマンドです。

コードを修正したらまずこのコマンドを実行します。

## 使い方

差分全てをステージングする
```
git add . 
```

特定のファイルの差分のみをステージングする
```
git add /C/user/soepy/fuga/aaa.py
```

特定のフォルダ階層の差分のみをステージングする
```
git add /C/user/soepy/fuga/piyo/
```
ワイルドカードに一致する差分のみをステージングする
```
git add *fuga/piyo*
```


# git commit

addコマンドでステージングしたものをcommitします。
SVNではcommit＝リモートに反映ですが、gitでは、自分が編集しているブランチに対しcommit履歴をつくる処理となります。

## 使い方

ステージングしたものをcommitする
```
git commit -m "コミットを作成する" 
```

**-m "コミットを作成する"** をつけることでコミットメッセージをつけます（通常のチーム開発をしている場合は必須だと思います）


# git push

変更をリモートリポジトリに反映します。
このコマンドを実行したあとにGithubやGitLab上でPR、MRを作成することになります。

## 使い方

コミットをリモートに反映させます。


```
git push origin/topic-hoge 
```




# 補足リカバリーする時に知っておくとたすかる
- git reset --soft HEAD^
- git reset --hard 
- git push -f

あとは適宜足していきます