自分のためのGitメモ

# はじめに

イマイチGitの操作に自信が持てない自分のために、マニュアルを読みながら参考になりそうなコマンドをまとめてみることにしました。Gitで困ったら、そのたびにググってたけど、いつまで経っても身につかないので。

[参考]

* [Git - Book](https://git-scm.com/book/ja/)


# 初期設定

Git全体で有効な設定。設定は`~/.gitconfig`に保存される。`--global`オプションで指定可能。

```bash
$ git config --global --list
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
```

リポジトリごとに有効な設定。設定はリポジトリごとの`.git/cofig`に保存される。

```bash
$ git config --list
$ git config user.name "John Doe"
$ git config user.email johndoe@example.com
```

[参考]

* [Git - 最初のGitの構成](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90)
* [Git - Gitの設定](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)


# Gitリポジトリの取得

リポジトリの初期化。

```bash
$ cd /path/to/dir
$ git init
```

ファイルをリポジトリに追加してコミット。

```bash
$ git add README.md
$ git commit -m 'first commit'
```

既存リポジトリのクローン。最後にディレクトリ名を付けると、クローン先のディレクトリ名を指定できる。

```bash
$ git clone git://github.com/schacon/grit.git
$ git clone git://github.com/schacon/grit.git mygrit
```

[参考]

* [Git - Gitリポジトリの取得](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%8F%96%E5%BE%97)


# 変更内容の反映

リポジトリの状態の確認。

```bash
$ git status
```

`.gitignore`ファイルには、gitで管理したくないファイルを記述する。色々と正規表現が使える。

```
$ cat .gitignore
# コメント。これは無視されます
# .a ファイルは無視
*.a
# しかし、lib.a ファイルだけは .a であっても追跡対象とします
!lib.a
# ルートディレクトリの TODO ファイルだけを無視し、サブディレクトリの TODO は無視しません
/TODO
# build/ ディレクトリのすべてのファイルを無視します
build/
# doc/notes.txt は無視しますが、doc/server/arch.txt は無視しません
doc/*.txt
# doc/ ディレクトリの .txt ファイル全てを無視します
doc/**/*.txt
```

変更したけどまだステージしてないファイルの差分確認。ステージしたけどコミットしていない差分の確認には`--staged`または`--cached`オプションをつける。

```bash
$ git diff
$ git diff --staged
```

```bash
git commit
git commit -m 'commit comment'
git commit -a -m 'commit comment'
```

ファイルの削除。

```bash
$ rm filename
$ git rm filename
```

ファイル名の変更。

```bash
$ git mv file_from file_to
```

[参考]

* [Git - 変更内容のリポジトリへの記録](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%A4%89%E6%9B%B4%E5%86%85%E5%AE%B9%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%B8%E3%81%AE%E8%A8%98%E9%8C%B2)


# コミット履歴の閲覧

ログの閲覧。`-p`オプションで差分も確認できる。`-2`オプションで直近2コミット分の履歴を確認できる。`--status`オプションで統計情報を参照できる。`--graph`オプションでコミットの履歴をアスキーアートのグラフで参照できる。

```bash
$ git log
$ git log -p
$ git log -p -2
$ git log --status
$ git log --graph
```

[参考]

* [Git - コミット履歴の閲覧](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7)


# 作業のやり直し

コミットのやり直し。

```bash
$ git commit -m 'first commit'
$ git add 忘れていたファイル
$ git commit --amend
```

ステージしたファイルの取り消し。

```bash
$ git reset HEAD benchmarks.rb
```

ファイルへの変更の取り消し。

```bash
$ git checkout -- benchmarks.rb
```

[参考]

* [Git - 作業のやり直し](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E4%BD%9C%E6%A5%AD%E3%81%AE%E3%82%84%E3%82%8A%E7%9B%B4%E3%81%97)


# リモートでの作業

リモートリポジトリの一覧表示。`-v`オプションをつけると、リモートリポジトリのURLも表示する。`show origin`でリモートリポジトリ(origin)の詳細を確認。

```bash
$ git remote
$ git remote -v
$ git remote show origin
```

リモートリポジトリのクローン。

```bash
$ git clone git://github.com/schacon/ticgit.git
```

リモートリポジトリの追加。

```bash
$ git remote add pb git://github.com/paulboone/ticgit.git
```

init＋remote addとcloneって何が違うんだろ。と、思ったので調べてみたメモ。

* [initしてremote addするのとcloneするのの違い - hokaccha.hamalog v2](http://d.hatena.ne.jp/hokaccha/20110802/1312278626)


リモートリポジトリのデータを取得。実行してデータを同期すると、すべてのブランチで操作ができるようになる。

```bash
$ git fetch
```

自動的にフェッチを行い、リモートブランチの内容を現在のブランチにマージ。

```bash
$ git pull
```

手元のmasterブランチを、リモートのoriginにプッシュ。

```bash
$ git push origin master
```

リモートを参照する名前の変更。下記の例では、pbからpaulへ名前を変更する場合。

```bash
$ git remote rename pb paul
```

リモートの削除。

```bash
$ git remote rm paul
```

[参考]

* [Git - リモートでの作業](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AE%E4%BD%9C%E6%A5%AD)


# ブランチ

ブランチ作成と切り替え。

```bash
$ git branch testing
$ git checkout testing
```

masterブランチへの切り替え。

```bash
$ git checkout master
```

`checkout`に`-b`オプションをつけて実行すると、ブランチの新規作成と切り替えを同時に実行できる。

```bash
$ git checkout -b feature/iss53
```

ブランチで作成した内容をmasterにマージする。

```bash
$ git checkout master
$ git merge feature/iss53
```

[参考]

* [Git - ブランチとマージの基本](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC)


# ブランチの管理

現在のブランチ一覧を表示。`-v`オプションはブランチの詳細情報を表示。`--merged`オプションはマージしたブランチ名を表示。`--no-merged`オプションはまだマージしてないブランチ一覧を表示。

```bash
$ git branch
$ git branch -v
$ git branch --merged
$ git branch --no-merged
```

ブランチの削除。まだマージできていないものは、`-d`オプションでは削除できない。強制的に削除する場合は、`-D`オプションを付けて実行する。

```bash
$ git branch -d testing
```

[参考]

* [Git - ブランチの管理](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AE%E7%AE%A1%E7%90%86)


# リベース

リベース。別ブランチの内容を現在のブランチに取り込む。他にも色々とリベースのテクニックがありそう。詳細は参考を読んでおくべし。

```bash
$ git checkout experiment
$ git rebase master
```

[参考]

* [Git - リベース](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9)