Gitについてまとめた

#Gitは何のためにあるの？
gitはファイルのversionを管理するためのもの。ファイルの情報をスナップショットとして保存することができる。
最新のファイルを把握する、間違えて上書きするのを防ぐ、そういった目的のために使われる。
また、コミットをたどることで以前の状態に戻せる。これはgitがファイルをスナップショットとして保存してるからできる。


#Gitにuserの情報を入力しよう(初期設定)

```
#まずは下の二つを登録する
git config --global user.name "githubの名前"
git config --global user.email githubに登録したemail

git config user.nameなどで確認することができる。ローカル環境の場合はエディターも登録するらしい。
```

ちなみにgithubはオンライン上のgitのコード置き場と考えると分かりやすい。これをリモートリポジトリと呼ぶ。

#Gitの頻出コマンド

###cdコマンド

ディレクトリを移動します。change directryの略。

###lsコマンド

ディレクトリの内容を表示します。 ls -a コマンドで、隠しファイルを含めたディレクトリ全内容を表示します。

###mkdirコマンド

ディレクトリを新規作成します。

###rmコマンド

ファイルを削除します。

###cpコマンド

ファイルをコピーします。

###mvコマンド

ファイルの移動とファイル名の変更を行います。

###catコマンド

ファイルの中身を表示します。

#ローカルは3つに分かれる。
gitのローカル環境は主にワークツリー、ステージ、リポジトリの3つに分かれている。
なぜ、ステージが必要なのか？それは変更したファイルが大きく、リポジトリに保存したいものもあれば、変更を保存したくないものもある、そんな時に使えるから。差分を変更したいファイルだけステージに上げてコミット（スナップショットの保存）するということが可能になるのだ。


#ローカルリポジトリの新規作成

```
$git init 
```

を実行すると、.gitディレクトリが作成される。ちなみにこれがローカルリポジトリのこと。
.gitディレクトリは隠れフォルダで、ワークツリーでは見えない。


#変更差分を確認する方法

```
$git diff
$git diff ファイル名
$git diff --staged
```
このコマンドによってターミナルにファイルの変更差分が表示される。
--stagedによって、ステージとローカルリポジトリの差分をターミナルに表示することができる。


#gitでアンステージする

```
$git reset
$git reset ファイル名

#以下でもok
$git reset HEAD .
$git reset HEAD ファイル名
```

これらのコマンドでは、リポジトリから最新のコミットを取得してコミットとステージで差分が内容に修正してくれている。つまり、ステージの変更は取り消されたけど、ワークツリーの変更は取り消されてない。


#変更履歴を確認する

```
$git log

#1行で表示する
$git log --oneline

#ファイルの変更差分を表示する
$git log -p index.html

#表示するコミット数を制限する
$git log -n <コミット数>
```

#ファイルの削除を記録する

```
#リポジトリとワークツリーどちらも削除される
$git rm ファイル名
$git rm -r ディレクトリ名

#リポジトリからだけ削除し、ワークツリーではファイルを残したい時
$git rm --cached ファイル名
```
最後のコマンドはパスワードが載ったファイルをcommitしてしまった時に使う。

#ファイルの移動を記録する

```
$git mv 旧ファイル　新ファイル

#以下のコマンドと同じ
mv 旧ファイル　新ファイル
git rm 旧ファイル
git add 新ファイル
```
このコマンドを実行すると、ファイルの名前を変えて更にステージに変更差分を上げる。

#リモートリポジトリを新規追加する

```
$git remote add origin  https://~~ 
```

#リモートリポジトリに送信する

```
$git push リモート名　ブランチ名

#具体的には以下のような感じに。
$git push origin master
$git push -u origin master
$git push origin develop
```
-uオプションをつけておくと、次回以降git pushだけでリモートリポジトリにpushすることができるようになる。

ちなみに、リモートリポジトリのurlを確認したいときは

```
git remote -v
```

とすることで確認することができる。


#エイリアスをつけよう

```
$git config --global alias.ci commit
$git config --global alias.st status
```

これにより、git st と省略したコマンドを打つことができる。


#ファイルをgitの管理から外す
.gitignoreファイルに記載することで管理から外すことができる。

#ファイルへの変更を取り消す

```
$git checkout --ファイル名
$git checkout --ディレクトリ名

#全変更を取り消す
$git checkout -- .
```
これらは、ワークツリーの状態をステージの状態と同じにする機能を持っている。

#直前のコミットをやり直す

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

このコマンドは、git commit したけどあのファイルの修正忘れてたーって時に、ファイルを修正して、git addして、git commit --amend をするとファイルの修正を含んだ上で再度コミットすることができる。

*注意点としては、リモートリポジトリにpushされたコミットはやり直してはいけない！！！

#リモートリポジトリを新規追加する

```
$git remote add リモート名 リモートURL
```

#リモートから取得しよう。フェッチ編

```
$git fetch リモート名
$git fetch origin
```

このコマンドはリモートリポジトリの内容を自分のローカルリポジトリに反映させる。ただ、ワークツリーには反映されないので、git mergeをする必要がある。

また、fetchしてきたら

```
$ git branch -a
$ git checkout remotes/origin/master
```
の手順でワークツリーに反映させる方法もある。

```
$git merge origin/master
```
このコマンドを使えばoriginというリモート名のmasterブランチを自分のワークツリーに反映させることができる。


#リモートから取得しよう。pull編

pullを使うのはリモートから情報を取得してマージまでを一気にやりたい時。

```
$git pull リモート名　ブランチ名
$git pull origin master
```

上記のブランチ名はリモートリポジトリのブランチ名ということ。
もっと詳しくすると、リモート名の中のブランチを今自分がいるブランチに統合するということ？

#リモートの詳細情報を確認する

```
$git remote show リモート名
$git remote show origin
```

このコマンドでgit remote コマンドよりも詳しい情報を取得することができる。

#リモート名を変更する

```
$git remote rename 旧name 新name

#remoteを削除したい
$git remote rm リモート名
```

#ブランチを新規作成する

```
$git branch  ブランチ名
```

注意点としては、ブランチを作成はするが、切り替えまでは行われないという点。

#ブランチを切り替える

```
$git checkout 既存ブランチ名
$git checkout -b 新ブランチ名
```

ブランチを切って開発することで、それぞれ独立して開発を進めることができる。

#マージのやり方
ちなみに、マージとは他の人の変更内容を取り込むこと。

```
$git merge ブランチ名
$git merge リモート名/ブランチ名
```

#ブランチ名を変更する

```
#変えたいブランチに移動してからの
$git branch -m ブランチ名
```
#ブランチを削除する

```
$git branch -d ブランチ名

#強制削除する
$git branch -D ブランチ名
```

#リベースとは
リベースは変更を統合する際に履歴をきれいにするために使う。

```
$git rebase 繋ぐ元にするブランチ名
```

ただ、git pushしたブランチをfeatureとし、featureブランチ上でgit rebase masterとすると、リモートリポジトリ上の記録とローカル上の記録に矛盾が生まれてしまうので、git pushしたブランチに対してはrebaseを使わないようにしよう。


#pullのリベース型

普段使っているgit pull orign masterはmerge型のpullでmerge commitが残るという特徴がある。
リモートリポジトリの最新の情報を取得したいだけでcommitはいらないという時は、

```
$git pull --rebase リモート名　ブランチ名
$git pull --rebase origin master
```
を使うとコミットが残らなくなる。

##pullをrebase型に設定する

```
$git config --global pull.rebase true

#masterブランチだけ設定したい時
$git config branch.master.rebase true
```


#タグ付け

##タグの一覧を表示するには

```
$git tag

#パターンを指定してタグを表示
$git tag -l "202001"
```


##注釈付きのタグを作成する

```
$git tag -a タグ名 -m "メッセージ"
$git tag -a 202001 -m "version 202001"
```

##軽量版のタグを作成する

```
$git tag タグ名

#後からタグ付けする
$git tag タグ名　コミット名
```

#タグをリモートリポジトリに送信する

```
$git push リモート名　タグ名
$git push origin 202001

#タグを全て送信する
$git push origin --tags
```

#スタッシュで作業を一時避難する

```
$git stash
$git stash save
#どちらも同じ
```

commitまで行かない変更分をstashで一時保存することで、他のブランチで作業ができるようになる。

#避難した作業を確認する

```
$git stash list
```

#避難した作業を復元しよう

```
$git stash apply

#ステージの状況も復元する
$git stash apply --index

#特定の作業を復元する
$git stash apply スタッシュ名
$git stash apply stash@{1}
```

#避難した作業を削除する

```
#最新の作業を削除する
$git stash drop

#特定の作業を削除する
$git stash drop スタッシュ名

#全作業を削除する
$git stash clear
```


#Gitの特定のcommitまで戻りたい！

```
$ git log //戻す対象のハッシュ値を調べる
commit ************************

$ git reset --hard ハッシュ値
```

これで消したファイルとかいろいろが元に戻る。