バッチ処理でgitから情報を取得してくるメモ

必要に応じて追記していきます。追加の依頼は大歓迎です。

.gitフォルダを取得
-------------------

トップだと相対フォルダで帰ってきて、別のフォルダだと絶対パスで返ってくるっぽい。

```sh
$ git rev-parse --git-dir
/Users/myname/work/repository/.git
```

ワークフォルダのトップのディレクトリを表示
-------------------

```sh
$ git rev-parse --show-toplevel
/Users/myname/work/repository
```

現在いるブランチ名を取得
-------------------

```sh
$ git symbolic-ref --short HEAD
master
$ git symbolic-ref HEAD
refs/heads/master
```

リモートの確認
----------------

大抵はoriginだけだろうから問題はないだろうけど、僕はpull requestを送る時用に別のものを(prという名前で)設定することがあったりするので、その全部を列挙してみたいことも。

```sh
$ git remote
origin
pr
```

`-v` を付けると、より詳細に出るけど、fetchとpusｈで別に設定できたりするのかな・・・

```sh
$ git remote -v
origin	git@github.com:WebAssembly/binaryen.git (fetch)
origin	git@github.com:WebAssembly/binaryen.git (push)
pr	git@github.com:shibukawa/binaryen.git (fetch)
pr	git@github.com:shibukawa/binaryen.git (push)
```

現在のブランチのremote名を確認する

```sh
$ git config --get branch.master.remote
origin
```

URLだけ取り出したいときはこれ。originのところにgit remoteで取ってきた名前を入れればよい。

```sh
$ git config --get remote.origin.url                                                                                                                 git@github.com:WebAssembly/binaryen.git
```

コンフリクト
--------------

コンフリクトした特定のファイルの変更履歴を見る

* ``--merge`` を付けると、ancestor以降のログが出るっぽい。
* ``--graph`` を付けると、つながりがある所は線が表示される。下記の図はリモート側で2回連続コミットしている。
* ``--boundary`` を付けると、共通祖先も表示。付けないと、それより後のみ。

```sh
$ git log --merge --graph --boundary test.png
* commit 2ed1557d6014eef1aaaa9b5993d20c9d4ba1bf12
| Author: Yoshiki Shibukawa <yoshiki@shibu.jp>
| Date:   Thu Jul 21 16:10:41 2016 +0900
| 
|     fix again
|  
* commit 7269cd9582347ef06980cfb76e0f42c730fdb994
| Author: Yoshiki Shibukawa <yoshiki@shibu.jp>
| Date:   Tue Jul 12 12:31:41 2016 +0900
| 
|     edit in other repository
|    
| * commit 3ab69796745c72b89eec17f9e945fb7427cd8c4c
|/  Author: Yoshiki Shibukawa <yoshiki@shibu.jp>
|   Date:   Tue Jul 12 12:32:30 2016 +0900
|   
|     edit at original repository
|  
o commit a5fbd6df978a45ca1ef92c41de4b0012c03d672e
  Author: Yoshiki Shibukawa <yoshiki@shibu.jp>
  Date:   Thu Jun 23 14:34:40 2016 +0900
  
      Common parent
```

1は共通祖先、2は自分、3はマージしたいブランチ上のblobのハッシュを表示

```sh
$ git ls-files -u test.png
100755 bc65a2570121339bd646e084e86f2a3757253963 1	test.png
100755 bcde1857845783dddc4886675b2fb8522a055d05 2	test.png
100755 371535216e97ce39407b441f149d6014114c19a7 3	test.png
```

上記の数値を使って特定のステージのファイルを書き出すことも可能

```sh
$ git show :2:test.png > test.ours.png
```

マージしたいファイルの最終更新者・日時などをしりたい

```sh
$ git log MERGE_HEAD -1 test.png
commit 2ed1557d6014eef1aaaa9b5993d20c9d4ba1bf12
Author: Yoshiki Shibukawa <yoshiki@shibu.jp>
Date:   Thu Jul 21 16:10:41 2016 +0900

    fix again
```

手元のファイルの最終更新者・日時などをしりたい

```sh
$ git log ORIG_HEAD -1 test.png
commit 3ab69796745c72b89eec17f9e945fb7427cd8c4c
Author: Yoshiki Shibukawa <yoshiki@shibu.jp>
Date:   Tue Jul 12 12:32:30 2016 +0900

  edit at original repository
```

ファイルの更新日時を取得
------------------------

http://qiita.com/yuya_takeyama/items/f06ab1d8e92c8077c714

gitブランチを変更日時順に取得
---------------------------

Rubyを使っているけど

http://qiita.com/kppn/items/3ecedcb247fc13db582f

gitのワークのステータスを確認
---------------------------

[git statusを利用したリポジトリ情報のプロンプト表示](http://int128.hatenablog.com/entry/2015/07/15/003851)

```shell-session
$ git status --porcelain
```
``-z`` を付けると行区切りじゃなくてnull区切りになるっぽいので、プログラムでの処理のしやすさはさらにアップしそう。

[ここ](https://www.kernel.org/pub/software/scm/git/docs/git-status.html)にはステータスのとりうる組み合わせが書かれている。UUだと両方が変更してコンフリクト。

```
X          Y     Meaning
-------------------------------------------------
          [MD]   not updated
M        [ MD]   updated in index
A        [ MD]   added to index
D         [ M]   deleted from index
R        [ MD]   renamed in index
C        [ MD]   copied in index
[MARC]           index and work tree matches
[ MARC]     M    work tree changed since index
[ MARC]     D    deleted in work tree
-------------------------------------------------
D           D    unmerged, both deleted
A           U    unmerged, added by us
U           D    unmerged, deleted by them
U           A    unmerged, added by them
D           U    unmerged, deleted by us
A           A    unmerged, both added
U           U    unmerged, both modified
-------------------------------------------------
?           ?    untracked
!           !    ignored
-------------------------------------------------
```

削除されたファイル一覧を取得
-------------------------

http://stackoverflow.com/questions/6017987/how-can-i-list-all-the-deleted-files-in-a-git-repository

```shell-session
$ git log --diff-filter=D --summary
```

特定のコミットに含まれるファイルを復元
----------------------------------

http://qiita.com/UmedaTakefumi/items/af2e38068616d982f489

↑の場合、削除したタイミングではすでに実態がないため、

```shell-session
$ git show ハッシュ^:ファイルのパス
```

で復元可能。