git log関係コマンド

#git reflogで履歴などを確認できる
https://gist.github.com/kymmt90/9c997726b638b316f9be07aa4e3eea5e
reflog とは
reflog（参照ログ）とは HEAD やブランチ先端の動きの履歴
各個人のローカルリポジトリに存在
ブランチの切り替え、新たに加えられた変更のプル、履歴の書き換え、あるいは単なる新規コミットの実行などを記録
git reflog で HEAD の移動履歴を、git reflog <ブランチ名> でそのブランチ先端が指していたコミットの一覧を確認可能
HEAD@{5}: HEAD の五つ前の状態を示す
$ git reflog
2079bc8 HEAD@{0}: clone: from ssh://ebauser@ik1-311-15561.vs.sakura.ne.jp:/var/www/html/ebacorp.xyz/eba-groupwork_ushijima

#git log -g で git log 風の出力で reflog が見られる
Reflog: HEAD@{0} (ushijima <ushijima@DESKTOP-VK55IR1.localdomain>)
Reflog message: clone: from ssh://ebauser@ik1-311-15561.vs.sakura.ne.jp:/var/www/html/ebacorp.xyz/eba-groupwork_ushijima
Author: ebauser <ebauser@ik1-311-15561.vs.sakura.ne.jp>
Date:   Sun Nov 4 01:09:51 2018 +0900

#git show HEAD@{0} でも確認可能(変更点も表示されるので分かりやすい)

commit 2079bc8b44df7cde51bb72ff6b4f5710e13bf64d
Author: ebauser <ebauser@ik1-311-15561.vs.sakura.ne.jp>
Date:   Sun Nov 4 01:09:51 2018 +0900

    再コミット

diff --git a/view/pc/chat_theme.html b/view/pc/chat_theme.html
index 357e3e5..0f503ca 100644
--- a/view/pc/chat_theme.html
+++ b/view/pc/chat_theme.html
@@ -154,10 +154,6 @@
                       <?php endforeach;?>
                     <?php endif;?>
                   <!-- ここまでループさせる -->
-                  <!-- <option value="27648518">Aさん (x.xxxxx@xxxxx.jp)</option>
-                  <option value="27648519">Bさん (x.xxxxx@xxxxx.jp)</option>
-                  <option value="27648520">Cさん (x.xxxxx@xxxxx.jp)</option>
-                  <option value="27648521">Dさん (x.xxxxx@xxxxx.jp)</option> -->
                 </select>
                 <p class="guide">複数選択できます。</p>
                 <!-- TODO 今回は、ひとまず不要(必要になったら実装) -->
ushijima@DESKTOP-VK55IR1:/mnt/c/Users/ushijima/Documents/eba-groupwork_ushijima$


#reflog をデータリカバリに使う
間違えて意図と異なるコミットへ git reset --hard して、必要なコミットを失った場合
git reflog か git log -g で reflog を見る
失ったコミットがあれば、git reset --hard HEAD@{<n>} でそのコミットへ HEAD を移動できる
git branch recover-branch HEAD@{<n>} すれば、そのコミットが先端のブランチを作成できる
かんたんなデータリカバリをやってみる
現在、master が次のようなログだとする。

```
af3cfdd Add d.txt
d8441e3 Add c.txt
aefb89f Add b.txt
2dace69 Add a.txt
```
#間違えて git reset --hard @^^ しちゃう。さらにターミナルとかをすべて閉じてしまって、もとの HEAD のハッシュ値もわからない。すると、ログは次のようになる。
```
aefb89f Add b.txt
2dace69 Add a.txt
```
#そのままでは d8441e3 より先に戻れないので、reflog を使う。
```
$ git reflog
aefb89f HEAD@{0}: reset: moving to @^^
af3cfdd HEAD@{1}: commit: Add d.txt
d8441e3 HEAD@{2}: commit: Add c.txt
aefb89f HEAD@{3}: commit: Add b.txt
2dace69 HEAD@{4}: commit (initial): Add a.txt
```
直前に reset したことや、それ以前に commit していたことがわかる。

af3cfdd に戻りたいので、次のコマンドを叩く。

```
$ git reset --hard HEAD@{1}
```
すると、HEAD がaf3cfdd に戻る。

```
$ git log
af3cfdd Add d.txt
d8441e3 Add c.txt
aefb89f Add b.txt
2dace69 Add a.txt
```



#git pull エラー

```
error: Could not read 28011e3f093de93236ee64bf2432e6d1f92ec0e9
warning: no common commits
remote: Counting objects: 1263, done.
remote: Compressing objects: 100% (1219/1219), done.
error: object file .git/objects/27/e68ccd1cb7192c8bda2418d198d90f1aff10a7 is empty
fatal: cannot read existing object info 27e68ccd1cb7192c8bda2418d198d90f1aff10a7
fatal: index-pack failed
```

#●経緯

状況としては、昨日は仕事場のPCで作業したあとにgit push、家に帰って追加作業した git push、で、今日、仕事場で上記のエラー。
つまり、リモートリポジトリが最新状態で、ローカルリポジトリの方が古い状態。
なので、リモートリポジトリからpullできるようにするのが今回の目標



#リポジトリが読み込めないなどのエラーが出る時に壊れたと思われる.gitをコピーする

```
cp -a .git .git-old
```

#リポジトリの正当性をチェックする(壊れていないかの確認) オプションの完全なチェックを実行するには--full

```
git fsck --full
```

#rmコマンドを使って、emptyのオブジェクトを削除します。
試しに一番上の6c2b8e42bdd36d9e47db64f56a85de6fa08e8cを消します。

```
rm .git/objects/27/e68ccd1cb7192c8bda2418d198d90f1aff10a7
```

#削除できているかの確認
```
git fsck --full
```
↑
emptyのエラーは、消えた

※まとめて消すと大変なのでまとめて消す時は、

```
find . -type f -empty -delete -print
```