gitコマンド[メモ]

##内容

- gitコマンドのメモ  
　チート表とかもあるけど、とりあえず自分で使ってみたものをメモ

##前提知識
よく出てくる「origin master」と「origin/master」何が違うのかよく分からないので調べてみた。
まずこの２つをわかりやすくするには、「origin」、「master」、「origin/master」の３つに分ける。

- origin  
　これは要するにリモートブランチそのもののこと。  
　当然その中にはブランチがあるはずである。  
- master  
　という事でこれがブランチを表している。  
　であるので、「origin master」とは、リモートブランチの(origin)masterブランチを指しているわけである。  
- origin/master  
　上記２つはリモートブランチだったが、こちらはローカルブランチ。  
　リモートのmasterブランチを追跡する追跡ブランチである。  

これらそれぞれが何してるか分かっとくとコマンド打つときある程度迷わなくなる？（逆に曖昧で現場で迷った経験あり笑）

##リモートの変更を持ってくる
- **git pull** < origin [ブランチ名] >  
　<>に記載しているブランチの変更をひっぱってくる。  
  実際は引数なしでチェックアウトしているブランチの変更を引っ張ってくることが多い？

```terminal
git pull
# あえて引数を指定するなら
git pull origin master
```
git pullは実際は、「git fetch」と「git merge」のコマンドをまとめて行っているコマンドである。

- **git fetch** < origin [ブランチ名]>  
　リモートブランチ内の引数に設定したブランチ(引数がなければ現在チェックアウトしているブランチ)を  
　ローカルブランチの追跡ブランチに落とす。この時の追跡ブランチが「origin/[ブランチ名]」。  
　
- **git merge** < origin [ブランチ名] >
　fetchで落とした「origin/[ブランチ名]」をローカルに落とす。

```terminal
#　masterブランチの変更を落としたい場合
git pull
#　もしくは丁寧に
git fetch
git merge origin master
```
初心者のうちは、fetchしてからmergeした方が何しているか理解する上でもいいのかなぁ。

##ブランチ作成
基本的にmasterを変更してpushってことはないかと思われる。。。
という事でその変更ごとにブランチを切って、レビューしてからマージするはず。
となのでまずはブランチの切り方。

- git branch < ブランチ名 >  
　引数で与えたブランチ名でブランチを新しく作成。

```terminal
　# testというブランチを新しく作成
　git branch test
```
- git checkout < ブランチ名 >
　上で作成したブランチ名を入れればそのブランチに移動できる。
　元々ブランチが作成されているのであればこれでブランチの変更が可能。
　git pull後にチェックアウトした場合もう一度git pullする。（チェックアウトしたブランチが変更されている可能性があるため）  

```terminal
　#上で作成したtestブランチに移動
　git branch test
```
- git checkout -b < ブランチ名 >   
　めんどくさいから新しいブランチ作ってそのままチェックアウトしちゃう便利なやつ

```terminal
　#testtestブランチを作成
　git checkout -b testtest
```
##リモートに変更をあげる
無事にブランチも切れた事でファイルを編集後リモートに反映する。
今回は、testブランチで新しくtest.txtとindex.txtというファイルを作成する。

```terminal
touch test.txt
touch index.txt
```
この作ったファイルをリモートに反映していく。

[以前書いている](https://qiita.com/memezie/items/1a2dc0e108c06cdbab7b)ので詳しいことは省略。
(今回はstatusなどの状態の確認は省略している)
ただし、**push**の仕方のみ注意！

```terminal
# リモートに反映したいファイルの登録
git add test.txt index.txt
# 変更記録を保存
git commit -m "create newfile"
# リモートに送る
git push -u origin test
```

初回pushのみオプションとして「-u」をつけること。
これをすることでpushしたローカルのブランチが上流ブランチとして登録される。（２回目以降はオプションなしで問題ない）
※上流ブランチと追跡ブランチの違いがよく分からん

```terminal
--------           ローカル           --------   ----  リモート  ----  
    < master >    ->    < origin/master >    |    < master >  
        == 上流ブランチ =>　　　　　　 == 上流ブランチ =>  
```
ローカルの<master>の上流ブランチは、< origin/master >である。このブランチはローカルの<master>を上流ブランチとした追跡ブランチである。
って認識？
新しくブランチ切った場合は、fetchするまで追跡ブランチはない？
これは時間あるときに調べましょう。

##その他コマンド

- **git status**  
　現在の変更状況が確認できる。  
- **git diff**  
　変更したファイルの変更点の確認ができる
- **git stash**  
- **git stash save "massage"**  
  修正途中で他の作業がしたい！でもコミットはしたくない！ってときに一時退避できる。  
  save "message"でメッセージを残せる。
- **git stash list**  
  stashで退避した作業の一覧が見れる。

```terminal
git stash list

# こんな感じで表示される
stash@{0}: WIP on test: xxxx
stash@{1}: WIP on sample: xxxx
```
- **git stash apply**  
- **git stash pop**  
  退避した作業を戻す。  
  stashは戻したリストを残す。

```terminal
# listで表示したもののどれに戻したいかを最後の引数で指定
git stash apply stash@{0}
# 最新なら引数なしでOK
git stash apply
# listを表示しても削除はされていない
git stash list

stash@{0}: WIP on test: xxxx
stash@{1}: WIP on sample: xxxx
```
popは削除。

```terminal
# listで表示したもののどれに戻したいかを最後の引数で指定
git stash pop stash@{0}
# 最新なら引数なしでOK
git stash pop
# listを表示すると適用したものが削除されている
git stash list

stash@{0}: WIP on sample: xxxx
```


```terminal
git stash >> stash.txt
```
でテキストに出してapplyできた気がするけどちょっと調べよう。

## submodule関連

- git submodule foreach "[コマンド]"
　gitのサブモジュールに対して、まとめて指示できる。  
　特にサブモジュールを紐付けた際に、ブランチがその時の最新ブランチになるので
　masterに変更する時など。
 
```terminal:submodule
git submodule foreach "git checkout master"
```

## ブランチ名の変更

```terminal:ブランチ名の変更
git branch -m <古いブランチ名> <新しいブランチ名>
// 現在のブランチの場合
git branch -m <新しいブランチ名>
```

## ブランチの削除

```terminal:ブランチの削除
git branch -D <ブランチ名>
```