Git初心者向けによく使うGitコマンドをまとめてみた。

仕様頻度が高いであろう基本的なGitコマンドについて、ちょこっと解説もしながらまとめています。

## ローカルリポジトリの作成とリモートプッシュまで
#### Gitリポジトリを新たに作成する

```
$ git init
$ git init [ディレクトリ名]
```
リポジトリを作成できます。

リポジトリって何？ってには下記の記事が参考になります。
参考：[サルでもわかるGit入門 履歴を管理するリポジトリ](https://backlog.com/ja/git-tutorial/intro/02/)

#### リポジトリをクローンする

```
$ git clone https://github.com/XXXXX/XXXXX.git
```
リモートのリポジトリを自分の作業環境下にコピーすることができます。

#### ファイル・ディレクトリの更新内容をインデックスに反映する

```
// コマンドの内容
$ git add [ファイル・ディレクトリ名]

// 実際の使用例
$ git add .  // すべてのファイル・ディレクトリをaddする
```
自分の作業環境下のワークツリーから直接リポジトリにコミットするのではなく、一旦「インデックス」と呼ばれる場所に記録します。
こうすることでワークツリーの全ての変更をコミットするのではなく、一部の変更のみを選んでコミットすることができます。

ワークツリーとかインデックスって何？っていう人には下記の記事が参考になります。
[Gitの基本 ワークツリーとインデックス](サルでもわかるGit入門 https://backlog.com/ja/git-tutorial/intro/04/)

#### ファイル・ディレクトリをcommitする

```
// コマンドの内容
$ git commit [ファイル・ディレクトリ名]  //指定のファイル・ディレクトリをcommitする
$ git commit -m [メッセージ]

// 実際の使用例
$ git commit -m 'initial commit'
```
ファイルの変更をリポジトリに記録することができます。

#### リモートリポジトリにpushする


```
// コマンドの内容
$ git push

// 実際の使用例
$ git push origin master  // masterブランチにpushする
$ git push --set-upstream origin [ブランチ名]  // 上流ブランチにpushする
```
リモートリポジトリのブランチ履歴を更新することができます。

## ブランチ関連のコマンド

1つのプロジェクトからブランチを分岐させることにより、プロジェクト本体に影響を与えずに開発を行うことができます。
ブランチを切り替えることで複数人で同時並行して作業することが可能になります。
参考：[サルでもわかるGit入門 ブランチとは](https://backlog.com/ja/git-tutorial/stepup/01/)

#### ブランチの確認

```
$ git branch  // ローカルブランチを確認する
$ git branch -r  // リモートブランチを確認する
$ git branch -a  // 両ブランチを確認する
```
#### 作業ブランチを変更する

```
$ git branch [ブランチ名]  // ブランチを作成する
$ git checkout [ブランチ名]  // ブランチを変更する
$ git checkout -b [ブランチ名]  // 上記を同時に行う
```
#### ファイルの更新状況を確認する

```
$ git status
$ git status [ディレクトリ名]

On branch sample-branch
Your branch is up to date with ‘origin/sample-branch’.

Changes not staged for commit:
 (use “git add <file>...” to update what will be committed)
 (use “git checkout -- <file>...” to discard changes in working directory)
       modified:   lib/xxx.dart

Untracked files:
 (use “git add <file>...” to include in what will be committed)
       lib/xxx.dart
```

現在のブランチの状態を表示することができます。

#### mergeをする

```
// コマンドの内容
$ git merge [統合したいブランチ名]

// 実際の使用例
$ git checkout master  // masterに移動
$ git merge branchA  // masterにbranchAを統合する
```
作業ブランチで変更した内容をマスターブランチに統合したり、逆に最新のマスターブランチを作業ブランチに統合したりすることができます。

#### rebaseをする

```
// コマンドの内容
$ git rebase [元となるブランチ名]

// 実際の使用例
$ git checkout branchB  // branchBに移動
$ git rebase master  // masterにbranchBを統合する
```
コミット履歴を綺麗に保ったままブランチを統合することができます。

rebaseについて詳しくはこちらが参考になります。
[git rebaseを初めて使った際のまとめ
](https://qiita.com/310ma3/items/e0ec74b47c6c219f2a8b)

### リモートブランチをローカルに反映させる
#### リモートリポジトリの最新の状態をローカルリポジトリのリモート追跡ブランチにダウンロードする
```
$ git fetch
```
ローカルで、リモートリポジトリの最新の情報を見ることができるようになります。

#### ローカルブランチを最新化する

```
$ git checkout [ブランチ名]
$ git pull
$ git pull origin/master  // マスターブランチをpullする
```

マスターブランチの更新内容をローカルに反映させることで、ローカルを常に最新の状態にすることができます。


## コミット関連のコマンド
コミットって何？っていう人は下記が参考になります。
参考：[サルでもわかるGit入門 変更を記録するコミット](https://backlog.com/ja/git-tutorial/intro/03/)

### コミット履歴の削除
不要なファイルをコミット・プッシュしてしまった！間違ってマスターにマージしてしまった...！
みたいな事故が起こった際にrevert/resetが使われます。もしこんな事故にあってしまった時は下記の記事を参考にしましょう。
[Gitで間違ってmasterにmergeしてしまった時の対策【revertから作業再開までの流れ】](https://qiita.com/arthur_foreign/items/2ff8a735c621ed847593)


#### コミット履歴を残さずにコミットを取り消す


```
$ git reset (--hard/--soft)
```
使い方についてはこの記事が非常に参考になります。
[[git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法](https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)

#### コミット履歴を残したままコミットを取り消す

```
// コマンドの内容
$ git revert [コミット名]

// 実際の使用例
$ git revert HEAD^  // 直前のコミットを取り消す
```
コミットによって加えられた変更を元に戻す新しいコミットを生成することで、コミットを取り消した状態になります。
実際にはコミット履歴を消さない分、resetよりrevertの方が好まれて使われるようです。

#### コミット履歴を確認する

```
$ git log

commit xxxxxxxxxxxxxxxx (HEAD -> sample-branch, origin/sample-branch)
Merge: xxxxxx xxxxxx
Author:Your name <xxxxxx@gmail.com>
Date:   Sat Nov 9 15:10:03 2019 +0900

    Merge branch 'master' into sample-branch
```

コミット履歴を確認することができます。

#### 最新のコミット内容を表示する

```
$ git show

commit xxxxxxxxxxxxxxxx (HEAD -> sample-branch, origin/sample-branch)
Merge: xxxxxx xxxxxx
Author: Your name <xxxxx@gmail.com>
Date:   Sat Nov 9 15:10:03 2019 +0900

    Merge branch 'master' into sample-branch

diff --cc xxx/xxx.dart
index xxxxxx
--- a/xxx/xxx.dart
+++ b/xxx/xxx.dart
```

最新のコミット内容を確認することができます。git logよりも詳細なコミット内容を確認することができます。

#### コミットの差分を確認する

```
$ git diff  // インデックスとの差分を確認する
$ git diff HEAD^ HEAD  // 直前のコミットとの差分を確認する
$ git diff --cached  // インデックスとHEADの差分を確認する
```
複数人で作業していると同時並行で同じファイルを編集する場合があります。その際そのままマージしてしまうと、誰かのソースを消してしまう可能性があります。
なので、diffを使って差分を確認します。（GitHub上で確認することもできます。）


#### 過去にHEADが指していたコミット履歴を確認する

```
$ git reflog 
xxxxxx (HEAD -> sample-branch, origin/sample-branch) HEAD@{0}: commit (merge): Merge branch 'master' into sample-branch
xxxxxx HEAD@{1}: checkout: moving from master to sample-branch
xxxxxx (origin/master, origin/HEAD, master) HEAD@{2}: checkout: moving from sample-branch to master
```

reflogを使うと、git logでは辿り着けない過去のあらゆるコミット履歴を見ることができます。
間違ってブランチを消してしまった！なんて時のリカバリーに使われることもあります。
参考：[git reflog についてまとめてみる
](https://gist.github.com/kymmt90/9c997726b638b316f9be07aa4e3eea5e)

## 変更を一時退避する
あるブランチで作業してて、優先度の高いIssueの対応をせざるを得なくなった場合、コミットしないとブランチ切り替えられません。
そのため、一時的にstashに保存しといてブランチを切り替えるためにstashを行います。

#### 実際の使用例

```
$ git stash  // commitしていない状態の変更ファイルを一時退避する（現在の状態を保存しておく）
```
stashしたもののリストを表示させる

```
$ git stash list  // 保存した状態の一覧を表示する
stash@{0}: WIP on sample-branch: xxxxxx [commit message]
stash@{1}: WIP on sample-branch: xxxxxx [commit message]
```
このように、stashしたもののリストが表示されます。
もしstash@{0}の状態に復元したいなら、下記のコマンドで状態を復元することができます。


```
$ git stash apply stash{[0]}  // 保存状態を復元する
```