Git не выполняет «инкрементное резервное копирование». Это делает «совершает». Коммит, как правило, состоит из га sh (воспринимается как адрес), который позволяет вам, среди прочего,
- предыдущий адрес фиксации (ха sh)
- автор коммита
- дерево во время коммита
Последнее, как правило, наиболее интересное, так как дерево эффективно описывает всю иерархию каталогов / файлов при использовании того же ха sh -> система контента ! (На самом деле, git был описан как VCS, построенный поверх файлово-адресуемой файловой системы. Далее, git экономит некоторое пространство (я полагаю), когда файлы в деревьях не различаются, потому что их адреса одинаковы, и поэтому требуется только один объект в базе данных git.)
Для вас все это означает
- Хватит думать о git как о программном обеспечении для резервного копирования; это программное обеспечение для контроля версий, и понимание хотя бы части базовой модели поможет вам в этом. @torek написал много SO ответов на этот счет, и есть несколько хороших разговоров.
- Удаление истории означает создание совершенно нового коммита, который указывает на коммит, отличный от предыдущего.
Я могу придумать несколько разных способов достижения (2). Первый - git rebase -i @~2
(при условии, что у вас есть только два коммита), а затем удалите первый, как в рецепте ребазирования. Это говорит git переписать историю, но пропустить первый коммит. Я ожидаю, что это потерпит неудачу, но я был бы готов ошибаться.
Другой альтернативой является git filter-branch
, и есть сотни целых rnet страниц, которые охватывают, как использовать его для удаления определенных файлов из всей истории.
Впоследствии git gc
должен помочь сэкономить некоторое пространство, но делать это только тогда, когда вы уверены, что все сработало.