Ответы других людей верны, но я хотел конкретно ответить на ваши вопросы
Теперь, какой смысл клонировать все это?
Теперь у вас есть свой личный репозиторий. Это ускоряет выполнение многих операций, потому что они локальные, но также позволяет вам вносить изменения, которые являются частными, пока вы не захотите поделиться ими.
Удар в результате этого заключается в том, что разработчики могут отделить «регистрацию» от публикации своей работы. Это означает, что вы не получаете большие периоды времени, когда ничего не проверено, потому что «оно не готово к публикации».
Когда Dev A меняет RootViewController, Dev B хочет продолжить работу на основе этого изменения. Или нет? Но как Dev B когда-нибудь получит это изменение?
Когда Dev A рад поделиться своими изменениями , он может либо:
- «подтолкни» его изменения к исходному репо, которое они оба клонировали. Затем Dev B может «вытянуть» их из исходного репо.
- «служить» его репо, так что Dev B может «вытянуть» прямо из него.
- «связать» свои изменения в файл, который можно отправить Деву Б. Затем он может «разложить» их в своем репо.
- ... возможно, некоторые другие методы, которые я забыл.
Клонируя все это каждый день?
Клонирование выполняется только для создания новой копии хранилища. Думайте "svn co".
Обычно вы «вытягиваете» наборы изменений в репозиторий, немного похоже на «svn update»
Как насчет его собственных изменений? Есть ли какая-нибудь операция супер слияния, которая объединяет все клоны в один большой суперклон, который каждый должен время от времени заменять своим отдельным клоном?
Когда наборы изменений вносятся в репо (например, с помощью 'pull'), они будут существовать в другой ветви. Говорят, что хранилище имеет несколько «голов», которые являются открытыми концами ветвей. Объединяя эти главы, он получит единственную версию, которая содержит изменения из обеих веток. Dev B может продолжить работу над этим. Вы бы получили график, который выглядел примерно так:
До слияния:
/----o----o Head 'Dev A'
----O Central
\----o----o Head 'Dev B'
После слияния:
/----o----o---
----O Central \
\----o----o----o Head 'Dev B'
Это объединение может показаться большой дополнительной работой, но поскольку Mercurial использует информацию о том, когда разработчики разделяются, а не просто «разделяет» две головы, это довольно умно. В общем, конфликты слияний редки.
Может быть, Dev A выполняет еще какую-то работу, а затем публикует данные в центральном репо (Примечание: ранее Dev B получал изменения Dev A непосредственно от него. Возможно, B работает над функцией, основанной на коде A, и ему нужна бета-версия кода рано). Вы можете получить график, подобный следующему:
Dev A /----o----o----o----o----o----o----o--\
/ \ \ \
----O Central \ \ o--\ /-o
\ \ \ \ /
Dev B \----o----o----o----o----o----o----o----o----o----o
Dev B сделал несколько снимков кода Dev A во время разработки, и когда Dev A опубликовал свой окончательный код в центральном хранилище, Dev B смог получить дополнительные изменения, объединиться с ними и вытолкнуть все свои возвращается к центральному репо тоже. Поскольку Mercurial знал о снимках кода B, которые имелся в коде А, он не запутался, когда вытащил из центрального репо. Он просто сказал: «О, я уже кое-что получил».
Итак, для меня две убийственные функции DVCS:
- Регистрация больше не означает публикацию.
- Разработчики могут делиться кодом контролируемым образом, не проходя через центральное хранилище и, следовательно, публикуя.
Ух ты, это долго, но надеюсь, это поможет.