drBatty писал(а): ↑23.09.2011 07:59
В hg всё проще - есть ОДНА ревизия без родителей - первая. Все остальные ревизии имеют одного или двух родителей - всё очень просто, и наглядно. Причём ничего не отрывается, и не удаляется. Потому граф всегда связан, и имеет простую топологию (даже в сложных проектах например в firefox)
Лично мне требовалось склеить два проекта, которые начинались как независимые. Получилось без проблем, в итоге — два коммита «без родителей», точнее, с «нулевым родителем» — он всегда один, не хранится и обычно не показывается нигде.
Вообще, git устроен на удивление просто. Есть граф коммитов. Коммиты находятся под управлением сборщика мусора. Коммиты ссылаются друг на друга (на родителей). Есть «якоря», которые держат некоторые коммиты, чтобы gc их не удалил. На 0-м уровне приближения все «якоря» по сути одинаковы и хранятся в .git/refs. Есть особенная ссылка HEAD — это коммит, на основе которого делается текущая модификация в working dir. Если изменеия working dir будут закоммичены, нынешний HEAD станет родителем нового коммита и HEAD переместится на новый коммит. HEAD можно переставить на абсолютно любой коммит в графе и «наращивать» его с этого места. Кроме того, HEAD можно связать с любым якорем, тогда при очередном коммите этот якорь будет перемещаться на новый коммит. Собственно, на этом всё.
Итого, имеем 4 сущности, которые нужно понимать для работы с git: commit, ref (якорь), HEAD, working dir.
На следующем уровне приближения «якоря» немного различаются: есть heads (для пользователя — branches), есть tags, есть отдельный якорь для stash, есть якоря для импортированных репозиториев (remotes), могут быть еще любые другие, которые создают/используют скрипты пользователя. Пользовательские команды не позволяют связать HEAD с тегом, но низкоуровневые команды позволяют это сделать. Например, после
git symbolic-ref HEAD refs/tags/tag git будет обновлять тег tag при коммитах как и любой другой якорь. Собственно, различие проявляется лишь на более высоких уровнях абстракции, которые суть частность для определенного стиля работы. Например, на том же базовом движке git'а построена система для совершенно другого workflow: stgit.
drBatty писал(а): ↑23.09.2011 07:59
граф всегда связан, и имеет простую топологию (даже в сложных проектах например в firefox)
А зачем нужна простая топология? Почему граф должен быть связан? Мне эти требования абсолютно чужды. Т.е. я, конечно, понимаю — эстетика и всё такое, но если эта эстетика будет мешать мне дело делать, то ну ее в…