Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。
1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。
※前回記事のリポジトリ状態からの続きになっています。
前回記事へ | 目次へ:Git関連記事のまとめページ | 次回記事へ |
---|
実行例
(※ひとまず適当に変更の操作)
echo Sample-Added-15(for-gc) >> test1.txt
git commit -a -m "message5(for-gc)"
git log --oneline
↓
結果:
0bf814e (HEAD -> master) message5(for-gc)
94996a0 message4
20bbab7 message3
00cad71 message2
4ace194 message1
(※強制的に位置を戻して、コミットをアクセスできない状態にする)
git reset --hard 94996a0
git log --oneline
↓
結果:
94996a0 (HEAD -> master) message4
20bbab7 message3
00cad71 message2
4ace194 message1
※アクセスできないコミットはまだ存在する
git show 0bf814e --oneline -s
↓
結果:
0bf814e message5(for-gc)
-----
※アクセスできないと見なされたGitオブジェクト(コミット)を削除する
git gc
↓
結果:
Enumerating objects: 107, done.
Counting objects: 100% (107/107), done.
Delta compression using up to 8 threads
Compressing objects: 100% (93/93), done.
Writing objects: 100% (107/107), done.
Total 107 (delta 35), reused 0 (delta 0), pack-reused 0
※アクセスできないコミットはまだ存在する(予想に反して回収されない)
git show 0bf814e --oneline -s
↓
結果:
0bf814e message5(for-gc)
※アクセスできないコミットにまだ戻れる(予想に反して回収されない)
git reset --hard 0bf814e
git log --oneline
↓
結果:
0bf814e (HEAD -> master) message5(for-gc)
94996a0 message4
20bbab7 message3
00cad71 message2
4ace194 message1
参考:
Git ファイルの履歴を完全に削除する
https://gist.github.com/ktx2207/3167fa69531bdd6b44f1
(※強制的に位置を戻して、コミットをアクセスできない状態にする)
git reset --hard 94996a0
git log --oneline
↓
結果:
94996a0 (HEAD -> master) message4
20bbab7 message3
00cad71 message2
4ace194 message1
※まずこれまでの操作履歴が入ったreflogを削除
git reflog expire --expire=now --all
※リポジトリから全てのアクセスできないコミットを削除
git gc --aggressive --prune=now
↓
結果:
Enumerating objects: 65, done.
Counting objects: 100% (65/65), done.
Delta compression using up to 8 threads
Compressing objects: 100% (53/53), done.
Writing objects: 100% (65/65), done.
Total 65 (delta 17), reused 47 (delta 0), pack-reused 0
※reflogに残った作業履歴分を削除する必要がある(参照が残っているとアクセス可能となる為)
※--prune=<date> 日付より古いオブジェクトを削除(デフォルトは2週間前)
※アクセスできないコミットが参照出来なくなっている
git show 0bf814e --oneline -s
↓
結果:
fatal: ambiguous argument '0bf814e': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
※アクセスできないコミットに戻れなくなる
git reset --hard 0bf814e
↓
結果:
fatal: ambiguous argument '0bf814e': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
(※削除OK)
-----
※注意: tagが付いていると、参照されているのでアクセス可能となり、git gcではコミットが削除されない。tagを削除してから、git gcを実施する必要がある。
※注意: stashからの参照履歴があると(ref/stash等)、参照されているのでアクセス可能となり、git gcではコミットが削除されない。stashを削除してから、git gcを実施する必要がある。
-----
(※始めの状態に戻す)
git reset --hard 94996a0
git log --oneline
↓
結果:
94996a0 (HEAD -> master) message4
20bbab7 message3
00cad71 message2
4ace194 message1
環境
Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。