2014-10-07 2 views
1

Я совершил A, B, C и D, и мне нужно просто сохранить последний, который является D. Я вижу, что один из способов: git rebase -i --root, так как вы можете выбрать и сквош совершает.git rebase для сохранения последнего фиксации

Хотя я не понимаю разницы между выборкой и сквошем, это заставило меня задуматься, что, поскольку коммиты являются инкрементальными, то фиксация D включает в себя все изменения между ними, почему вы должны пройти через git rebase для хранения наиболее недавняя фиксация, а не просто удаление остальных коммитов?

Или я пропустил что-то принципиальное о git? Можете ли вы совершить сделки, которые не связаны между собой? i.e когда-нибудь использовать commit B, а в другой ситуации использовать последнюю фиксацию D?

ответ

6

git commits на самом деле не инкрементны, каждая фиксация содержит все дерево. Только пользовательский интерфейс представляет собой фиксацию в терминах различий от своего родителя. В этом смысле у вас нет , чтобы пройти git rebase, чтобы сохранить последнюю фиксацию и отбросить остальную часть, вы также можете использовать команду сантехника git commit-tree для создания фиксации. Полный эквивалент перебазирования будет линия, как это:

git reset --hard $(git commit-tree HEAD: -m message) 

Это плотная линия делает следующее:

  • HEAD: относится к объекту дерева, содержащемуся в текущей голове фиксации.

  • git commit-tree TREE -m MESSAGE создает новое соглашение без родителя, содержащее указанное дерево, в нашем случае дерево HEAD. Его результатом является SHA1 вновь созданного фиксации.

  • git reset --hard COMMIT сбрасывает текущую ветку и рабочее дерево к указанному фиксации, в этом случае вновь созданный root совершает.

Создание коммитов без истории обескуражено git, потому что такие фиксации затрудняют работу git с данными. Команды, подобные git annotate и git merge, сильно зависят от истории, и без этих git гораздо менее полезный инструмент.

Смежные вопросы