0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Git] 動作を試す 実行例24:gcでガベージコレクション(履歴を完全に削除する)

Posted at

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等は不使用。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?