git 覚書き

mercurial から移行してきました。
Mercurial から移行すると Git はわりかし楽に履歴の改変が行えて良いですね。
まだまだ Git 触り始めでちゃんと覚えきれていないので、自分が使っている Git コマンドをまとめておきます。

## 初めに実施しておく設定系
### ユーザ情報を設定する

```
git config user.email <メールアドレス>
git config user.name <ユーザ名>
```

コマンドで指定したメールアドレスとユーザ名のセットが、コミットした際のユーザ情報(Author, Commiter)として登録されます。
Authorは最初にソースを編集・作成したユーザ、Committer はコミットを行ったユーザのことです。

### カラー設定

```
git config --global color.ui true
```

コマンドにもよりますが、git のコマンド結果をカラフルに表示するようになります。

## リポジトリのクローン

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

```
git clone <GitリポジトリのURL>
```

master ブランチに checkout した状態でリポジトリをクローンします。

### ブランチを指定してクローン

```
git clone -b <ブランチ名> <GitリポジトリのURL>
```

こちらは指定したブランチに checkout した状態でリポジトリをクローンします。

### リポジトリ全体をクローンすると重いから・・・最新版だけクローンする

```
git clone --depth 1 <GitリポジトリのURL>
```

"--depth 1" を指定すると、リポジトリの履歴は取得せず、最新のソースコードだけクローンします。とりあえず最新のソースコードだけあればいいんだけど、リポジトリの変更履歴が長くてクローンするのに時間がかかる・・・という時なんかに利用できます。

### 作業ディレクトリを作成せずにクローンする

```
git clone --bare <GitリポジトリのURL>
```

簡単に言えばソースコードなしでリポジトリをクローンします。
例えばサーバ機で、ソースコードはいらないけどリポジトリをクローンして社内システムと連携して履歴を管理したいなんて時に利用できます。

## ブランチ操作

### リポジトリ内のブランチを一覧で表示する

```
git branch
```

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

```
git branch <ブランチ名>
```

### 作業ブランチを切り替える

```
git checkout <ブランチ名>
```

### 作成したブランチに切り替える

```
git checkout -b <ブランチ名>
```

`git branch` と `git checkout` を同時に実施できます。

### マージ済みのブランチを削除する

```
git branch --delete <ブランチ名>
```

### ブランチを強制的に削除する

```
git branch -D <ブランチ名>
```

`--delete` の場合、指定したブランチが別のブランチとマージされていないとエラーとなります。
`-D` ではマージしたかどうかに関わらず、指定したブランチを削除することができます。

### リモート追跡ブランチを作成して checkout する

```
git checkout -b <追跡ブランチ名> <リモートブランチ名>
```

他の開発者がリポジトリに push した内容を自分のリポジトリに取り込み、自分もそのブランチの開発を行いたいなんて時に使用します。追跡ブランチと書いていますが、実際はただのローカルブランチです。

上のコマンドを実施することでリモートブランチと同じリビジョンにローカルブランチを作成し、checkout まで行います。

### ブランチをマージする

```
git merge --ff <マージするブランチ名>
```

こちらは fast-forward なマージとなります。
マージ後の履歴を見ると、Mercurialしか知らない人は一瞬「ん？」となると思います。

簡単に言えば、マージの際にマージコミットが発生しません。
また `git merge` のデフォルト動作となっているため、fast-forward なマージでよい場合はわざわざ `--ff` をつける必要はありません。

### ブランチをマージする(no fast-forward)

```
git merge --no-ff <マージするブランチ名>
```

こちらは no fast-forward なマージとなります。
マージの際にマージコミットが発生します。


## 履歴を確認する

### コミットログを表示する

```
git log
```

あとは `git log` のオプション指定ですね。よく使われるオプションの組み合わせとしては下記のものです。

```
git log --graph --oneline --graph
```

長いので適当な alias を設定しておくと使いやすくなると思います。
すべてのブランチを確認する場合、`--all`を指定します。

```
git log --all --graph --oneline --graph
```

### 変更を加えたファイルを表示する

```
git log --stat
```

### ファイルの特定行がいつ変更されたか

```
git blame
```

ファイルの各行がどのコミットで追加・更新されたかを表示することができます。
インデント調整によるホワイトスペースの追加・削除の場合は無視したい場合は`-w`を指定します。

```
git blame -w
```

## ステージング・コミットを行う

### 変更を加えたファイルをステージングする

```
git add <ファイル名>
```

`--all` を付けると変更したファイルをすべてステージングします。

### ステージング(git add)を取り消す
 
git add したものは `git reset` で取り消すことができます。

```
git reset HEAD <ファイルパス>
```

すべてのファイルのステージングを取り消す場合はファイルパス部分は不要です。

### コミットする

```
git commit
```

慣れた人なら理解していると思いますが、`git commit`を実施するとエディタが開きますので、
コミットメッセージを編集し保存して終了したらコミットとなります。
エディタの編集内容を破棄した場合、コミットされません。

### 指定したコミットメッセージをつけてコミットする

```
git commit -m 'コミットメッセージ'
```

上記とは違いこちらはエディタによるコミットメッセージの編集作業はなく、指定したメッセージにてコミットをします。

### ステージングとコミットを同時に実施

ステージングしてからコミットするのがめんどいという方はこちら。

```
git commit -a
```

### コミットを取り消す(ロールバック)

```
git reset --hard HEAD^
```

`HEAD^` はHEADのひとつ前のコミットを表します。つまり状態をHEADのひとつ前の時点まで戻す、
つまりロールバックを行います。`HEAD^`の箇所にコミットバージョンを指定することで任意の状態まで戻すことが可能です。

### コミットの内容を変更する

主にコミットメッセージを変更したりするときに使っています。

```
git commit --amend
```

ただしコミットのハッシュ値が変わってしまうことに注意が必要です。
前回コミットを別のコミットで上書きするというイメージで良いかと思います。

## リモート環境に反映する(push)

`commit`実行後、pushすることでリモート環境に反映します。

```
git push <リモートリポジトリ名> <ブランチ名>
```

慣習的に下記であることが多いです。

```
git push origin master
```

リモートリポジトリは`git remote -v`コマンドで確認できます。

---

rebase なんかもそのうちまとめられたらいいなー。