Nodeでgitのラッパーを書く(3)---reflog

# 概要
前回までで一応、add、commitをしてgithubにpushすることをgitjsのインターフェイスを使っておこなった。
そしてreflogなるものが存在するらしくこれを使うと過去のバージョンへの復帰などが行えるらしいのでreflogを取得できるようにする。

## reflogとは

```
b720dd0 HEAD@{0}: commit: [deleted] auto message by gitjs
e1c108d HEAD@{1}: commit: Add tools for start
5d51567 HEAD@{2}: commit: Deleted
d8c0d0b HEAD@{3}: commit: Modified
e8e0ad4 HEAD@{4}: commit: Add diff module
240d30f HEAD@{5}: commit: Modified
1643790 HEAD@{6}: commit: Add diff module
3f0c7d0 HEAD@{7}: commit: [modify][add] auto message by gitjs
91d1f10 HEAD@{8}: commit: Add sample for git.status
b432e40 HEAD@{9}: commit: [modify][add] auto message by gitjs
d6adfa8 HEAD@{10}: commit: Modified
d067ded HEAD@{11}: commit: Add git/add module
82b6f6f HEAD@{12}: commit: Add git/add module
64b0dd3 HEAD@{13}: commit: Test for git.add
846d7b1 HEAD@{14}: commit: [modify] auto message by gitjs
e5c6a51 HEAD@{15}: commit: [add] auto message by gitjs
ab607a9 HEAD@{16}: commit: [modify][add] auto message by gitjs
064a678 HEAD@{17}: commit: [modify] auto message by gitjs
896c4a5 HEAD@{18}: reset: moving to HEAD^
9ff57dc HEAD@{19}: reset: moving to HEAD^
9beb3a2 HEAD@{20}: reset: moving to HEAD^
da805f1 HEAD@{21}: reset: moving to HEAD^
11a9d84 HEAD@{22}: commit: [modify] auto message by gitjs
da805f1 HEAD@{23}: commit: [modify] auto message by gitjs
9beb3a2 HEAD@{24}: commit: [modify] auto message by gitjs
9ff57dc HEAD@{25}: reset: moving to HEAD^
c42f07d HEAD@{26}: reset: moving to HEAD^
5b8c989 HEAD@{27}: commit: [modify] auto message by gitjs
c42f07d HEAD@{28}: commit: [modify][add]
9ff57dc HEAD@{29}: reset: moving to HEAD^
675f032 HEAD@{30}: commit: test
9ff57dc HEAD@{31}: commit: Add remote
896c4a5 HEAD@{32}: commit (initial): first commit
```
こんな感じのやつ、resetとかで巻き戻した履歴まで入っている。
`HEAD@{X}`のXがいわゆるヘッド値と呼ばれるやつである、これは現在を0としているので**固定**ではない。
これを使って`reset`とかできるけど使ってみてお世話にならないような開発をしたいと思う...。
とはいえ取ってこれないと不便なので

## 取得
```js:git/reflog/all.js
const exec=require('child_process').execSync;

const reflog=()=>{
    const arr2D=exec('git reflog --all').toString().split('\n').filter(a=>{ return a.length!==0 })
          .map(a=>{ return a.split(' ').filter(a=>{ return a.length!==0 }); })

    const result=new Array(arr2D.length);
    for( const arr of arr2D ){
        const num=parseInt(arr[1].slice(arr[1].lastIndexOf('{')+1, arr[1].lastIndexOf('}')));
        const branch=arr[1].slice(arr[1].lastIndexOf('/')+1, arr[1].lastIndexOf('@'));

        result[num]={
            hash: arr[0],
            'branch': branch,
            type: arr[2].replace(':', ''),
        }
        if( result[num].type==='commit' ){
            if( arr[3]==='(initial):' ){
                result[num].isInitial=true;
                result[num].comment=arr.slice(4).reduce((a, b)=>{ return a+' '+b; });
            }
            else{
                result[num].moveTo=0;
                result[num].comment=arr.slice(3).reduce((a, b)=>{ return a+' '+b; });
            }
        }
        else if( result[num].type==='reset' ){
            result[num].moveTo=arr.pop().replace('HEAD', '').length;
        }
        else throw new Error('m(_ _)m '+result[num].type+' is not supported\nPlease ask us.'); 
    }
    return result;
}

module.exports=reflog;
```
のように取得する。返り値は現在のヘッド値をキーの配列にした。
reflog自体、緊急用なのでresetとかはあんまり必要がなさそうな気がする。
後は`fetch`、`marge`、`pull`とかだろうけどこの辺も定期作業で返り値を使って何かするというようなものでもなさそうな気がする。confrictは起きたことがないし完全には対応は不可能だと思うので諦める。

# ここまで書いてみて
緊急対応とかは豊富なgitコマンドとオプション群を頼りに少しずつ解決していくしかなさそう。
ラッパーを書いてもそうならないための情報収集ツールぐらいにしかならないのかもしれない。
しかし、一度インターフェースを通すことで好ましくないものを落としたり情報を追加したりはできます。
後は使い方次第だと思います。