Я бы хотел, чтобы мой рабочий процесс выглядел на концептуальном уровне:
- Я ненадолго взломал мою новую функцию
- Я заметил опечатку в комментарии
- Я меняю это
- Поскольку опечатка совершенно не связана ни с чем другим, я внес это изменение в кучу исправлений комментариев
- Я продолжаю работать над кодом
- Я понимаю, что мне нужно конкретизировать несколько полезных функций
- Я так и делаю
- Я положил это изменение в собственную кучу
- Шаги 2, 3 и 4 повторяются в течение дня
- Я заканчиваю новую функцию и помещаю изменения для этой функции в стопку
- Я добавляю хорошие патчи вверх по течению: один с новой функцией, несколько для других твиков и один с кучей исправлений комментариев, если накопилось достаточно
Поскольку я и ленивый, и перфекционист, я хочу иметь возможность делать некоторые вещи не по порядку: я могу исправить опечатку, но забыть положить ее в стопку исправлений комментариев; когда я готовлю вышестоящие патчи (я использую git-svn, так что я должен быть довольно осторожен с ними), я в этот момент вытащу исправления комментариев. Я мог бы забыть отделить вещи полностью до самого конца. Но я мог / также / совершил некоторые кучи по пути (извините, метафора разрушается ...).
Это все равно, что просто использовать наборы изменений Eclipse с SVN, только у меня могут быть разные изменения в одном и том же файле в разных кучах (необходимость разделить изменения на разные коммиты - это то, что побудило меня перейти на git-svn, на самом деле ... ), а с Git я могу получить полную историю изменений, экспериментальные ветки и все остальное, но все же сделать хороший, аккуратный патч.
Я только недавно начал с Git после того, как давно хотел, и я до сих пор очень счастлив. Однако самый большой способ, которым описанный выше рабочий процесс на самом деле не отображается в Git, заключается в том, что «мусорное ведро» не может быть просто локальной ветвью, поскольку рабочее дерево всегда отражает только состояние одной ветки. Или, может быть, индекс Git - это «куча», и я хочу иметь как-то более одного (эффективно).
Я могу придумать несколько способов приблизить то, что я хочу (может быть, творческое использование stash? Запутанные танцы stash-checkout-merge?), Но мое понимание Git недостаточно твердое, чтобы быть уверенным в том, как лучше поставить все части вместе. Говорят, что Git - это скорее инструментарий, чем VCS, поэтому я думаю, что вопрос сводится к следующему: как мне построить эту штуку с помощью этих инструментов?