#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 @@
-
<!-- <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@{} でそのコミットへ HEAD を移動できる
git branch recover-branch HEAD@{} すれば、そのコミットが先端のブランチを作成できる
かんたんなデータリカバリをやってみる
現在、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