Git初心者のメモ その3：Gitのコマンド覚え書き

Gitに関する記事

* 前の記事：[Git初心者のメモ](http://qiita.com/y_ito/items/7c99dd9c78119d428804)
* 次の記事：[Git初心者のメモ その4：ブランチを使ってみる](http://qiita.com/y_ito/items/6bc6549eafe231cce16d)

---

ブランチとか分散型とか全く理解していないので、とりあえずコミットしてログや差分を見るという使い方をした場合に利用しそうなコマンドをまとめた。
動作の確認は Git for Windows のバージョン2.10.0 上で行った。


#リビジョンの指定の仕方
リビジョンを指定するためにコマンドの引数にコミットハッシュを使う場合、`git log` で表示されるコミットハッシュを全部書く必要はない。
`git log --oneline` で表示される __先頭7文字でまず問題はない。7文字で一意にリビジョンを指定できることがほとんど__ なので。

##HEAD
`HEAD` は現在作業しているブランチの直近のコミットを表す。
`@` も同じ意味。

### HEAD~ と HEAD^
`HEAD~` はHEADから1世代前のリビジョン、`HEAD~N` はN世代前のリビジョンを表す。
※現在のブランチを過去にたどっていく感じ？
`HEAD~~` と `HEAD~2` は同じ意味（2世代前のリビジョン）。

`HEAD^N` はHEADの親が複数ある場合（マージした場合など）にNで親を指定してそのリビジョンを表す。

HEADの後ろに "^" を続けたものは、HEADから "^" の数だけ前のリビジョンを表す。
HEAD~n は、HEADからn個前のリビジョンを現す。
つまり、下記の2つはどちらも直近のリビジョンから3つ前のリビジョンのこと。

![git_branch.png](https://qiita-image-store.s3.amazonaws.com/0/110278/b765e153-0fa5-741e-72df-eb29b670015d.png)


上記のようなGitの履歴の場合、@（HEAD）を使ったリビジョンの指定は以下のようになる。

```shell-session
y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short HEAD
485841b

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short @
485841b

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short master
485841b

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short branch-a
75587e5

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short branch-b
91502d7

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short @~
4dfe425

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short @~~
c2099fd

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short @~2
c2099fd

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short @~3
5e284b8

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short @^
4dfe425

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short @^2
91502d7

y_ito@note MINGW64 /c/work/git_test/hoge (master)
$ git rev-parse --short @~^2
75587e5
```


#コマンド覚え書き

##Basic Snapshotting
- `git status`
現在の状態を表示する。

- `git add ＜パス＞`
ファイルをステージングエリアに追加する。パスはディレクトリでもファイルでもよい。ディレクトリを指定した場合はサブディレクトリ内のファイルも追加する。

- `git commit --allow-empty`
空のコミットをする。一番最初のコミットは空にしたほうが何かと都合がいいらしい。

- `git commit [-m ＜コミットメッセージ＞]`
コミットする。オプションを省略した場合、エディタが起動する。エディタでコミットをログを書いて内容を保存して終了するとコミットが完了する。書いた内容を破棄して終了するとコミットされない。

- `git commit --amend --no-edit`
ステージされた内容と直前のコミットとの結合をする。コミットした後に漏れていたファイルに気付いた時やちょとした修正をして前のコミットに加えたい場合などに便利。
「どのタイミングでコミットしようか？」と迷うくらいならとりあえずコミットして、それからこのコマンドでどんどん追加していけばいい。
"--no-edit" を付けないとエディタが立ち上がってコミットログ編集画面になってしまう。

- `git commit --amend [-m ＜コミットメッセージ＞]`
上と同じだがコミットログをついでに編集したい場合は "--no-edit" を付けずに実行する。
この記事で以前は「直前のコミットのコミットメッセージを変更する」と説明していたが、それはステージングエリアに何も追加していない状態でこのコマンドを実行すれば結果的にはコミットメッセージの変更になるということ。

- `git commit -a`
変更されたファイルや削除されたファイルをステージしてコミットする。ようはadd＋commit。
新規作成されたファイルは対象外なので注意。

- `git diff [-w|-b] [-- ＜パス＞]`
addする前の差分を表示する。
ステージングエリアとワークツリーの差分を表示する。と説明されているが、まだ add していない場合は何との比較なんだろう？
オプションでファイルを指定できる。ハイフン2つとパスの間にスペースが入っているので注意。
`-w`はスペースを無視する。
`-b`はスペースの数の変化を無視する。元々スペースがある場所でのスペースの追加・削除（スペースが1個以上残っている）は差分なしとされれるが、新にスペースを追加した場合やスペースを削除してその場所にスペースがなくなった場合は差分ありとなる。

- `git diff --name-only`
差分のファイル名だけ表示する。

- `git diff --stat`
差分の統計情報（diffstatのグラフ）を表示する。diffstatって何?

- `git diff --diff-filter=[A|C|D|M|R]`
フィルタをかけて差分を出力する。A：追加、C：コピー、D：削除、M：変更、R：リネーム。大文字の場合は指定したもののみを、小文字の場合は指定したものを除外して出力する。

- `git diff --cached`
  `git diff --staged`
HEADとステージングエリアの差分を表示する。2つは同じ意味。
 
- `git diff HEAD`
HEADとワークツリーの差分を表示する。ステージしたもの含めてワークツリーの変更はすべて表示される。
 
- `git diff ＜リビジョン＞ [-- ＜パス＞]`
指定したリビジョンとワークツリーの差分を表示する。
リビジョンの部分を `stash` の名前を指定することもできる。

- `git diff ＜リビジョン１＞ ＜リビジョン2＞`
`git diff ＜リビジョン１＞..＜リビジョン2＞`
リビジョン間の差分を表示する。2つは同じ意味。

- `git diff ＜リビジョン＞..HEAD --diff-filter=D --name-only`
指定したリビジョンより後で削除されたファイルを表示する。

- `git rm [-r] --cached ＜パス＞`
指定したファイルをファイル自体は残したままgitの管理対象から除外する。パスがディレクトリの場合は -r オプションが必要。

- `git reset [-- ＜パス＞]`
ステージしたものをアンステージする。ステージングエリアは元に戻るが、ワークツリーの変更はそのまま。
パスを指定した場合は指定したファイルのみをアンステージする。

- `git reset --hard`
ステージングエリアとワーキングツリーのすべての変更を取り消す。変更は何もかも取り消されて、ステージングエリアとワーキングエリアは直近のコミット直後のまっさらな状態になる。

- `git reset --soft HEAD^`
直近のコミットを取り消す。ステージングエリアとワーキングツリーはそのまま。

- `git reset HEAD^`
直近のコミットを取り消し、ステージングエリアも元に戻す。ワーキングツリーはそのまま直前のコミットの前のステージした状態になる。

- `git reset --hard HEAD^`
直近のコミットを取り消し、ステージングエリアとワーキングツリーも元に戻す。2つ前のコミットをした直後の状態になる。

- `git mv ＜移動元＞ ＜移動先＞`
ファイルを移動する。


`git reset [＜モード＞] [＜リビジョン＞]` については、[下の方](#git-reset)に少し説明を書いた。


##Branching and Merging
- `git stash [push] [-m ＜メッセージ＞]`
ワークツリーの現在の状態を一時的に退避する。作業途中でコミットしていない変更がある状態で rebase しようとするとエラーになって「全部コミットするかstashしろ」みたいに言われる。このコマンドで退避すると、ワークツリーはきれいな状態になってrebaseできる。
＜メッセージ＞で `stash list` に表示される退避した内容の説明文を指定できる。
`git stash [save] [＜メッセージ＞]` という書式もあるが、__それは古い書式のようで[こちらのドキュメント](https://git-scm.com/docs/git-stash)には非推奨とある__。

- `git stash pop [＜名前＞]`
退避した内容を復元する。名前を指定しない場合は最新の退避内容を復元する。

- `git stash apply [＜名前＞]`
復元するが、退避内容は残す。

- `git checkout ＜名前＞ ＜ファイル名＞`
退避した内容から指定したファイルのみを復元する。指定した退避内容は残る。

- `git stash list`
退避した内容のリストを表示する。

- `git stash show ＜名前＞`
指定した退避内容に含まれているファイルのファイル名を表示する。

- `git stash drop [＜名前＞]`
退避した内容を削除する。名前を指定しない場合は最新の退避内容を削除する。

- `git diff ＜名前＞ [-- ＜パス＞]`
退避した内容とワークツリーの差分を表示する。

- `git tag ＜タグ名＞ [＜リビジョン＞]`
軽量タグを作成する。リビジョンの省略時のデフォルトはHEAD。

- `git tag -am ＜注釈＞ ＜タグ名＞ [＜リビジョン＞]`
注釈付きタグを作成する。リビジョンの省略時のデフォルトはHEAD。

- `git tag`
タグの一覧を表示する。

- `git tag -n`
注釈付きでタグの一覧を表示する。軽量タグはタグが指しているリビジョンのコミットメッセージを表示する。

- `git tag -l ＜パターン＞`
パターンに一致するタグ名のタグを表示する。パターンには例えば "v_1*" のようにワイルドカード(*)が使用できる。

- `git tag -d ＜タグ名＞`
タグを削除する。

##Inspection and Comparison
- `git log [-- ＜パス＞]`
ログを表示する。新しいリビジョンから古いリビジョンの順番で表示する。パスを指定した場合はそのパスのファイル・ディレクトリについてのログを表示する。

- `git log -＜n＞`
直近のn個のコミットのログを表示する。

- `git log ＜A＞..＜B＞`
AとBの間（Aは含まずBは含む）範囲を指定してリビジョンを表示する。AとBはコミットハッシュまたはブランチ。
A,Bがブランチの場合は「Bから到達可能でAから到達不可能」なコミットのログを表示する。

- `git log ＜ブランチ＞`
指定したブランチのコミットログを表示する。

- `git log ＜ブランチA＞...＜ブランチB＞`
ブランチAとブランチBのいずれかから辿ることができ、かつブランチAとブランチBの両方から辿ることができないリビジョンのコミットログを表示する。ブランチの記述順は意味なく `A...B` と `B...A` は同じ。

- `git log --summary`
追加、変更、削除したファイルを表示する。

- `git log --oneline`
リビジョンごとに1行に簡略化したログを表示する。

- `git log --name-status`
変更されたファイルのファイル名とステータス（A：追加、M：変更、D：削除）を表示する。

- `git log --name-only`
変更があったファイルを表示する。

- `git log --grep ＜パターン＞`
パターンとマッチするコミットメッセージのログを表示する。正規表現が使用可能。

- `git log -S＜文字列＞ [--pickaxe-regex]`
コミットの差分を検索する。コミットメッセージやファイル名の検索ではなく差分そのものを検索する。
"--pickaxe-regex" オプションで正規表現が使用可能。

- `git log --author='＜author＞`
author（コードを書いた人）を指定してログを表示する。

- `git log --committer='＜committer＞`
committer（コミットした人）を指定してログを表示する。


### git log の他のオプション

|オプション|機能|
|:--------|:-------|
|--no-merges|マージコミットを除外する。|
|--reverse|表示順を逆にする。|


- `git checkout -- ＜パス＞`
ファイルを指定してステージする前のワークツリーの変更を元に戻す。

- `git show ＜リビジョンなど＞`
＜リビジョンなど＞の部分にリビジョンやタグを指定して詳細を表示する。

- `git show ＜リビジョンなど＞:＜パス＞`
ファイルを指定して表示する。


##Patching
- `git rebase -i ＜リビジョン＞`
複数のリビジョンをまとめる。[下の方] (#git-rebase--i) に少し詳しく書いた。  

- `git revert ＜リビジョン＞`
指定したリビジョンのコミットを打ち消すような差分を自動的に作成してコミットする。
`git reset` との違いは以下。
    - 指定したリビジョンがなくなるわけではなく新たにコミットして変更内容を取り消す（履歴が残る）。
    - 特定のコミット**だけ**を指定して編集内容を取り消せること。例えば `git revert HEAD~2` とした場合、HEAD~1 と HEAD~2 を取り消すのではなく、HEAD~2 だけを取り消す。


##Getting and Creating Projects
- `git init [＜ディレクトリ＞]`  
リポジトリを作成する。   
ディレクトリを指定した場合、そのディレクトリにリポジトリを作成する。ディレクトリが存在しない場合はディレクトリを作成してリポジトリを作る。


##Debuging
- `grep [-i] ＜検索する文字列＞ [-- ＜パス＞]` <br>
gitの管理対象のファイルを対象にしてgrepする。 <br>
`-i` オプションで大文字小文字区別なし。<br>
`-- ＜パス＞` でディレクトリを指定、`-- '*.拡張子'` で拡張子を指定。


##Setup and Config
- `git config [＜対象を指定するオプション＞] -l | --list`
設定ファイルにある設定を一覧表示する。

- `git config [＜対象を指定するオプション＞] ＜設定項目名＞`
設定ファイルにある指定した項目の値を表示する。

- `git config [＜対象を指定するオプション＞] ＜設定項目名＞ ＜値＞`
設定ファイルにある指定した項目の値を変更する。

- `git config [＜対象を指定するオプション＞] --unset ＜設定項目名＞`
設定を削除する。

設定ファイルについては[こちら](http://qiita.com/y_ito/items/7c99dd9c78119d428804#windows%E7%89%88git%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A0%B4%E6%89%80)を参照。

対象を指定するオプション（スコープ）は以下。
`--system`：systemの設定（そのPCでのGitの設定）
`--global`：globalの設定（ユーザ単位のGitの設定）
`--local`：localの設定（リポジトリ単位のGitの設定）

- `git config ＜対象を指定するオプション＞ ＜設定項目名＞ ＜値＞` <br>
設定を変更する。

###設定の優先度

設定はの優先度は以下。
高<----------------->低
local、global、system

###エイリアス
以下のコマンドでGitコマンド（`git` の後の `add` とか `commit` の部分）のエイリアスを設定できる。

- `git config --global alias.＜エイリアス＞ "＜Gitコマンドとオプション＞"`

例：

```shell-session
y_ito@note MINGW64 /c/work/git_test.git (BARE:master)
$ git config --global alias.l "log --oneline"

y_ito@note MINGW64 /c/work/git_test.git (BARE:master)
$ git l
cc0b403 first commit

y_ito@note MINGW64 /c/work/git_test.git (BARE:master)
$ git config --global alias.lf "log --oneline --name-only"

y_ito@note MINGW64 /c/work/git_test.git (BARE:master)
$ git lf
cc0b403 first commit
uchinaaguchi.txt

```

####自分が使っているエイリアス

| エイリアス | 動作 |
|:--|:--|
| al |エイリアスを一覧表示する。|
| l |`git log --oneline` |
| lo |1行で `git log --oneline` よりも少し詳しくコミットログを表示する。|
| lf |ファイルの追加・編集・削除の状況を表示する。|
| lg |コミットグラフを表示する。|

#####エイリアスの定義

- `git config --global alias.al "config --get-regexp alias."`

- `git config --global alias.l "log --oneline"`

- `git config --global alias.lo "log --oneline --pretty=format:'%h [%cd] %d %s <%an>' --date=format:'%Y-%m-%d %H:%M'"`

- `git config --global alias.lf "log --oneline --pretty=format:'%h [%cd] %d %s <%an>' --date=short --name-status"`

- `git config --global alias.lg "log --graph --date-order --all --pretty=format:'%h %Cred%d %Cgreen%ad %C(blue bold)%cn %Creset%s' --date=short"`


##その他
- `git --version`
gitのバージョンを表示する。  

- `git rev-parse [--short] ＜コミットハッシュ、タグ、HEADなど＞`
引数で渡したものが指しているリビジョンのコミットハッシュを表示する。
`--short` を付ける短縮したコミットハッシュ（先頭7文字）で表示する。
逆に `--short` を付けずに引数が短縮したコミットハッシュだとフルのコミットハッシュを表示する。

- `git ls-files [＜パス＞]`
gitが管理しているファイルの情報を表示する。逆に言えばgitの管理外のファイルは表示されない。
ワークツリーにファイルがなくてもgitが管理していれば表示される。パスは普通は絶対パスでもよい。

- `git update-index --skip-worktree ＜パス＞`
ファイルを一時的にgitの管理から外す。

- `git update-index --no-skip-worktree ＜パス＞`
ファイルをgitの管理に戻す。

- `git ls-files -v ＜パス＞`
ファイルがgitの管理下にあるか確認する。
`git update-index --skip-worktree` で一時的にgitの管理から外れている場合、先頭のタグが "S" となる。


## オプションの組み合わせ、gitコマンドと他のコマンドの組み合わせ

- `git log --oneline --name-status --diff-filter=DR ＜リビジョン＞..HEAD`

指定したリビジョン**より後**で削除したファイルを表示する（指定したリビジョンは含まない）。
フィルターが "D" だけではないのは "D" だけでは削除したファイルを取りこぼすことがあるから。理由はファイルの削除と追加が同じリビジョンにあると「リネームした」と認識されることがあるため（`git rm`したのになぜかRと認識される。なぜだ！！）。なのでリネームも加えて "DR" としてしている。

- `diff -u -3 <(git show <リビジョン>:<パス>) <パス>`

特定のファイルについて指定したリビジョンとワークツリーの差分を見る。


# git reset
`git reset [＜モード＞] [＜リビジョン＞]`

この書式の `git reset` はHEADを以前のリビジョンに戻す動作をする。
引数のリビジョンでHEADの戻し先を指定する。リビジョンを省略した場合、HEADはそのまま。

オプションのモードはワーキングツリーとステージングエリアをどうするかを指定する。
モード毎の動作を下表にまとめた。

|モード|動作|
|:------|:------------|
|--soft|ステージングエリア、ワークツリーともにそのまま。|
| (モードなし)|ステージングエリアは戻す。ワークツリーはそのまま。|
|--hard|ステージングエリア、ワークツリーともに戻す。|

以上から、例えば `git reset --soft` はHEADを変えないしワーキングツリーもステージングエリアも戻さないので、結局何も変更しない。


# git rebase -i
`git rebase -i ＜リビジョン＞`

このコマンドは複数のリビジョンをまとめるだけでなくいろいろなこと（コミットの分割など）もできる。
-i は --interactive としても同じで、対話的に処理することを指定するオプション。

## 複数のリビジョンを1つにまとめる
引数のリビジョンにはまとめたいリビジョンの中で一番古いものの1個前のリビジョンを指定する。例えばコミットの履歴が下記のようになっていて、リビジョンa93eaef（"commit C"）をリビジョン3289cc5（"commit A"）にまとめたい場合、32ca22d の1つ前の 62babdf または HEAD~4 と指定する。

```shell-session
$ git log --oneline --name-only
9269ac5 commit D
test02.txt
test03.txt
a93eaef commit C
test04.txt
6f0c598 commit B
test02.txt
test05.txt
3289cc5 commit A
test01.txt
test03.txt
62babdf first commit
test01.txt
test02.txt
test03.txt
test04.txt
test05.txt
```

`git rebase -i HEAD~4` を実行すると以下の内容でviが起動する。

```text
pick 3289cc5 commit A
pick 6f0c598 commit B
pick a93eaef commit C
pick 9269ac5 commit D

# Rebase 62babdf..9269ac5 onto 62babdf (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

"pick" で始まっている部分はコマンドの引数で指定したリビジョンの1つ後からからHEADまでのリビジョン。この部分を編集する。`git log` とは逆で古いものから新しいものの順番で並んでいるので注意。
それ以外の部分（空行と "#" で始まっている行）は編集する必要はない。
今回の場合、以下のように編集する。

1. 3行目の "pick a93eaef commit C" の行をカットする。
2. 2行目の上にカットした行の内容を挿入する。
3. 挿入した行の "pick" を "s" また "squash" に書き換える。

※重要※
行を削除してはいけない。例えば今回のrebaseで特に変更しないからと言って commit B や commit D の行を消したりすると、消した行のコミットがなかったことになる。

編集した結果はこうなる。

```text
pick 3289cc5 commit A
s a93eaef commit C
pick 6f0c598 commit B
pick 9269ac5 commit D
```
この内容を保存してviを終了する。すると今度はコミットメッセージ編集のために下記の内容でviが立ち上がる。

```text
# This is a combination of 2 commits.
# The first commit's message is:

commit A

# This is the commit message #2:

commit C

# Please enter the commit message for your changes. Lines starting
…
```

今回は リビジョン a93eaef のコミットメッセージを残さないことにして、以下のように編集する。

```text
# This is a combination of 2 commits.
# The first commit's message is:

commit A

# Please enter the commit message for your changes. Lines starting
…
```

この内容を保存してエディタを終了する。
コンフリクトがなければこれで2つのコミットを1つにまとめる処理は完了。
履歴を見るとリビジョン 62babdf より後のリビジョンが変わっている。”commit C" は ”commit A" に吸収されてなくなっている。”commit A"、”commit B"、”commit D" は残っているがコミットハッシュの値が変わっている。

```shell-session:
$ git log --oneline --name-only
b131e5f commit D
test02.txt
test03.txt
2b30c00 commit B
test02.txt
test05.txt
e84109c commit A
test01.txt
test03.txt
test04.txt
62babdf first commit
test01.txt
test02.txt
test03.txt
test04.txt
test05.txt
```

##コンフリクトした場合

###コンフリクトを解決する
手動でコンフリクトを解決し、`git add .` して `git rebase --continue` とする。
ただし、自分はgitについていまいちよくわかっていないのでおとなしくrebaseを中止してリビジョンの統合をあきらめることの方が多い気がする。

###rebaseを中止する
`git rebase --abort`

##過去のコミットのコミットログだけ編集する
[コミットログ操作 過去のコミットのコメントだけを修正したい | 逆引きGit | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/reference/log.html#sec4)
[git rebase についてまとめてみた reword-コミットメッセージをまとめて変更する - Qiita](http://qiita.com/KTakata/items/d33185fc0457c08654a5#reword-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)
[Gitのコミットメッセージをまとめて修正する - はらへり日記](http://sota1235.hatenablog.com/entry/2015/12/27/200739)

#エクスポート（アーカイブ）

##特定のリビジョンのエクスポート

- `git archive --format=zip [--prefix=＜ディレクトリ名＞/] [--worktree-attributes] ＜リビジョン＞ [＜パス＞] -o ＜出力ファイル名＞`

パスを指定すれば特定のファイルのみ・ディレクトリに限定してエクスポートすることができる。
`--worktree-attributes` については後述。

###アーカイブから除外するファイルの指定

gitで管理しているがアーカイブには入れたくないファイルがある場合 `.gitattributes` というファイルをワークツリーのルートに作り、

```
＜除外したいファイル＞ export-ignore
```

と記述する。そして `git archive` に `--worktree-attributes` オプションを付けて実行する。


##差分のエクスポート

- ```git archive --format=zip [--prefix=＜ディレクトリ名＞/] HEAD `git diff --diff-filter=d --name-only ＜リビジョン＞..HEAD` -o ＜出力ファイル名＞```

指定したリビジョン以降の変更ファイルをzipファイルにエクスポートする。
`--prefix=＜ディレクトリ名＞/` （最後にスラッシュを忘れるな！！）があると、zipに含まれるファイルすべてのパスの先頭に指定したディレクトリ名が付く。つまり展開すると指定した名前のディレクトリが作成されて、そこを基点として各ファイルが展開される。


#参考文献・参考ページ

##参考文献
Travis Swicegood 著、でびあんぐる 監訳 『入門git』 オーム社

##参考ページ
[Git - Reference](https://git-scm.com/docs)

[gitで空コミットするにはgit commit --allow-empty - Qiita](https://qiita.com/lni_T/items/36abcff16256282a1a6e)
[git commit --amend で，ちょっとしたミスをしれっと直す - すこしふしぎ．](http://ism1000ch.hatenablog.com/entry/2014/03/26/190939)

[git diff の使い方がほんの少し理解できた - murankの日記](http://d.hatena.ne.jp/murank/20110320/1300619118)
[git diffで空白差分を無視する | ハックノート](https://hacknote.jp/archives/25513/)

[Gitでレポジトリ管理ファイルをインデックスからのみ削除(ファイル自体は削除しない) | 69log](https://blog.kazu69.net/2012/05/31/git-repository-management-files-do-not-delete-the-file-itself-remove-from-index/)

[git-resetは結局何を戻すのか - Qiita](http://qiita.com/fnobi/items/ec036c1b5d7ee5a8517c)
[git reset がわからない - Qiita](http://qiita.com/annyamonnya/items/d845597606fbabaabcad)
[Git 戻す系の処理を自分の理解の為にまとめてみた - ロックとチュウーハイとこりんがるな日々](http://box406.hatenablog.com/entry/2014/04/23/215805)

[Stash | 逆引きGit | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/reference/stash.html)

[Git での Committer と Author の違いは？ - kz-engineer -SCRAP-](http://kz-engineer-scrap.hatenablog.com/entry/2016/04/05/032916)

[Git for Windows 2.xのシステムコンフィグファイルは2つある - Qiita](http://qiita.com/anqooqie/items/07367b2b5932f3acfc38)

[\[Windows\]gitの設定ファイルと最初の設定(ファイル名文字化け対策と個人識別情報) | Zero Configuration:](http://zero-config.com/windows/git-config.html)

[Gitの設定ファイル - なべ’s blog:](http://nave-kazu.hatenablog.com/entry/2015/06/03/000205)
[Gitの設定ファイル(git-config)のまとめ - soHTaro.com](http://sohtaro.com/blog/2017/06/01/git-config/)

[gitのコミットの歴史を改変する(git rebase) 1 / 2 · けんごのお屋敷:](http://tkengo.github.io/blog/2013/05/16/git-rebase-reference/)
[Gitの複数コミットをrebaseとsquashでまとめる方法 | iwb.jp](https://iwb.jp/git-commit-rebase-squash/)
[初心者でもわかる！リベースの使い方を解説します | Git編：一歩踏み出すフロントエンド入門](https://liginc.co.jp/web/tool/79390)
[git rebaseと仲良くなろう~part2 - Qiita](http://qiita.com/kkam0907/items/0c73c08df7d99edae09d)
[コミットログ操作 過去のコミットのコメントだけを修正したい | 逆引きGit | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/reference/log.html#sec4)
[git rebase についてまとめてみた - Qiita](http://qiita.com/KTakata/items/d33185fc0457c08654a5)

[gitで差分ファイルを抽出する - Qiita](http://qiita.com/kaminaly/items/28f9cb4e680deb700833)
[git archive -Gitで管理しているファイルをアーカイブ | Gitテックラボ | SMART 開発者のためのウェブマガジン](https://rfs.jp/server/git/gite-lab/git-archive.html)

[Git で コミットを無かったことにする方法 （git revert の使い方） - akiyoko blog](http://akiyoko.hatenablog.jp/entry/2014/08/21/220255)

[git log と git rebase の濃密な関係 - Qiita](https://qiita.com/jeffi7/items/6a045a7cae1c3cde729a)
[Git でブランチ間の差分を調べる | まくまく Git ノート](http://maku77.github.io/git/log/diff-between-branches.html)
[git の歴史の辿り方 · けんごのお屋敷](http://tkengo.github.io/blog/2014/02/10/how-to-track-git-history/)

[WindowsでGitを始めたらまず確認！Git Bashの設定&ショートカット | 株式会社グランフェアズ](http://www.granfairs.com/blog/staff/gitbash-setting-shortcut)
[よく使うgitコマンドのエイリアスを設定する - Qiita](http://qiita.com/nakamurau1@github/items/f971df9b9fdbfb949cca)

[ブランチの切り替えをしなくてよくなるコマンド git worktree がすごい！ - Qiita](http://qiita.com/shibukk/items/80430b54ecda7f36ca44)

[あまり知られていない便利なGitサブコマンド4選 - Qiita](https://qiita.com/cushy79/items/248659b5b814f1deceee)
[作業中のファイルをgit stashして、一部のファイルだけ戻す - kentana20 技忘録](http://kentana20.hatenablog.com/entry/2014/07/05/172717)

[git rev-parse でできること - Qiita](https://qiita.com/Alice1017/items/ad061f33c8d42d52e079)
[Gitで既に管理されているファイルをローカルで無視する方法 - Qiita](Gitで既に管理されているファイルをローカルで無視する方法 - Qiita)