Как делают repos (SVN, МЕРЗАВЕЦ) работа?

Я читал ПОЭТОМУ почти каждый день и главным образом существует поток об управлении исходным кодом. У меня есть несколько вопросов. Я собираюсь использовать SVN в качестве примера.

1) Существует команда (маленький, большой вопрос dosnt). Утром все проверяют код, чтобы начать работать. В дневном Человеке фиксации, в то время как человек B все еще работает над ним. Что происходит, когда человек B фиксирует? как человек B будет знать, что существует обновленный файл?

2) Я предполагаю, что ответ на первый вопрос "выполняется команда обновления, которая говорит Вам", хорошо, таким образом, человек B узнает, что файл они продолжали работать все утро в измененном. Когда они видят udpated файл, кажется, что человек A ПЕРЕПИСАЛ файл для лучшей производительности. Что делает человек B? Кажется там, что целый день был пустой тратой времени. Или если они фиксируют свою версию затем, это - пустая трата времени человека A?

3) Что такое ответвления?

спасибо, и если бы кто-либо знает неспециалистов, называет PDF или что-то, что объясняет это, который был бы потрясающим.

6
задан Jon Seigel 1 April 2010 в 03:10
поделиться

13 ответов

1) Если предположить, что есть центральный репозиторий (что характерно для SVN и CVS, но не обязательно для Git, Bazaar, Mercurial и т.д.), и человек A делает коммит (а затем push коммит, который просто передает диффы и сообщения о коммите в центральный репозиторий), то человек B должен обновить свою копию вручную.

2) В этом случае, да, кто-то потратит свое время впустую. Системы SCM (Source Control Management) не могут сделать ничего, чтобы вылечить команду от организационных проблем. Это, конечно, крайний случай. В большинстве случаев в каждом коммите будут только незначительные различия (определение "незначительные" здесь заключается в том, что любой конкретный файл не должен быть полностью или частично переписан), и если эти изменения не затрагивают раздел, над которым работает человек Б, программное обеспечение SCM сможет объединить эти коммиты в один рабочий файл.

Другой случай - когда два человека изменяют одну и ту же область одного и того же файла (скажем, функцию). Когда происходит такой конфликт, программное обеспечение SCM поможет вам выбрать, какие изменения вы будете использовать, или даже позволит вам использовать оба или ни одного.

3) Ветка - это строка истории коммитов:

feature->    /R-S-T
master->  A-B-C-D-E-F
bugfix->       \J-K-L-M

Здесь feature, master и bugfix - это ветки, а буквы - конкретные коммиты. Для ветви master самый новый коммит (самая последняя версия каждого файла) - F. С другой стороны, для ветви feature самый новый коммит - T и он включает только коммиты A и B из ветви master. Любые изменения, сделанные в коммитах C, D, E и F, не включаются в эту конкретную ветку. Это можно переписать так:

feature-> A-B-R-S-T
master->  A-B-C-D-E-F
bugfix->  A-B-C-J-K-L-M

Итак, ветви важны для разделения рабочего процесса на различные части и сосредоточения работы на определенных частях. Представьте, что ветка master - это место, где находится стабильный код, и представьте, что мы реализуем новую функцию на ветке feature, которая еще не готова к выпуску. Теперь представьте, что система плагинов изменилась, и важные исправления были зафиксированы в ветке master, и, поскольку реализуемая мной функция зависит от системы плагинов, мне нужно перенести эти фиксации (C - F) в ветку feature. Для этого нужно выдать команду rebase (здесь я использую Git в качестве руководства) вашему программному обеспечению SCM, чтобы:

feature->            /R-S-T
master->  A-B-C-D-E-F
bugfix->       \J-K-L-M

Итак, теперь вы закончили всю работу над веткой feature. Чтобы передать коммиты R, S и T в master, вы выполняете команду merge:

master->  A-B-C-D-E-F-R-S-T
bugfix->       \J-K-L-M

Это ветка basics. Есть много других интересных вещей, которые вы можете делать с ветками. Надеюсь, это не слишком длинно и поможет :P

5
ответ дан 8 December 2019 в 16:01
поделиться

1 && 2)
SVN: Когда B попытается сделать коммит, возникнет ошибка, говорящая о том, что у него нет последней версии кода. Ему нужно будет выполнить svn update и объединить изменения, сделанные человеком A, со своими собственными. Смотрите Как разрешить конфликты SVN.

GIT: Поскольку у вас есть собственный локальный репозиторий, вы можете свободно делать коммиты. Когда вы отправляете (git push) свои изменения в удаленный репозиторий, вам приходится объединяться. См. Разрешение конфликтов слияния в GIT

3) Ветвление Wiki Page

5
ответ дан 8 December 2019 в 16:01
поделиться

В качестве дополнительного примечания: если вы планируете полностью переписать файл, часто вежливо, чтобы члены команды, работающие над той же функцией, знали, чтобы избежать боли -in-the-tuckus сливается.

2
ответ дан 8 December 2019 в 16:01
поделиться

1 и 2 зависят от используемого вами контроля исходных текстов, но есть некий вид слияния, который должен быть выполнен. А ветви - это версии кода, которые были форкнуты из ствола (основной версии).

1
ответ дан 8 December 2019 в 16:01
поделиться

Я бы сказал, коммитите часто. И перед каждым коммитом обновляйтесь.

Я бы рекомендовал прочитать этот документ, он довольно хорошо объясняет различные возможные рабочие процессы централизованных и децентрализованных (гораздо лучших) систем контроля версий: http://wiki.bazaar.canonical.com/Workflows

0
ответ дан 8 December 2019 в 16:01
поделиться

Для этого можно использовать XStream . Вы можете работать без аннотаций, например:

XStream xstream = new XStream();
XStream xstream = new XStream(new DomDriver());
xstream.alias("person", Person.class);
xstream.alias("phonenumber", PhoneNumber.class);

надеюсь, что это поможет

EDIT: создать другой экземпляр XStream для другого вывода

Person demo = new Person("Chris");

XStream xStream = new XStream();
xStream.alias("person", Person.class);
System.out.println(xStream.toXML(demo));

XStream xStream2 = new XStream();
xStream2.alias("dev", Person.class);
System.out.println(xStream2.toXML(demo));

output:

<person>
  <name>Chris</name>
</person>
<dev>
  <name>Chris</name>
</dev>
-121--5044334-
  1. Человек B знает, что при запуске обновления или попытке фиксации на сервере происходит изменение.
  2. Этот процесс называется слиянием. Большинство систем очень умны и пытаются объединиться для вас. Однако иногда возникают конфликты, и в этом случае человека информируют и просят разрешить конфликт. Это произойдет, если лица A и B изменят одну и ту же строку кода в одном и том же файле.
-121--4195924-

Хорошо для Git, вы в основном копируете весь проект из «главной» ветви в свою собственную личную ветвь, где вы можете изменять и вносить изменения в свою личную ветвь, и если вы думаете, что это хорошо, вы можете объединить свою личную ветвь с главной.

0
ответ дан 8 December 2019 в 16:01
поделиться
0
ответ дан 8 December 2019 в 16:01
поделиться

То, что я говорю ниже, действительно для svn, поскольку git или mercurial немного отличаются (я бы сказал, проще).

1) Человек B должен обновить и объединить изменения в своей локальной копии, прежде чем зафиксировать -ing (она также может просто проверить ] если есть изменения). Если он просто попытается зафиксировать , она получит сообщение о том, что его локальная копия svn устарела.

2) У человека B некоторые проблемы, так как слияние не будет простым (SVN не будет управлять им автоматически, это вызовет конфликт ) ... если это действительно слишком сложно, B придется думаю, она снова изменится.

У этой проблемы нет решения. Некоторые системы управления версиями допускают какую-то блокировку, но это порождает другие проблемы (файл может оставаться заблокированным в течение длительного времени, и никто, кроме шкафчика, не может работать с ним в промежутке, даже для изменений, которые могут легко объединиться). Просто делайте почаще небольшие изменения и разговаривайте с другими кодировщиками (посредством реальной встречи, IRC, электронной почты или любым другим способом), чтобы этого не произошло.

3) Ветвление действительно полезно с распределенной системой контроля версий. Он существует в svn в искалеченной версии. Просто вы делаете копию текущего каталога текущего репо в другом каталоге, два каталога развиваются каждый со своим собственным жизненным циклом (скажем, один заморожен только для исправлений ошибок, а другой для новых функций и изменений), и в какой-то момент вы пытаетесь чтобы объединить изменения между двумя репозиториями, например, попытаться перенести исправление ошибок в ветку новых функций или перенести некоторые новые функции из новой ветки в старую.

0
ответ дан 8 December 2019 в 16:01
поделиться

Я думаю, что ваша самая большая проблема не в различиях в производительности или возможностях. Думаю, дело дойдет до документации. MSDN, вероятно, будет предоставлять функции на обоих языках, но большинство записей блога и т. д. будут в c #. Эти сообщения могут предложить реальные рекомендации по передовым практикам, советы и рекомендации, а также множество другой информации, на которую вы будете опираться в вашей практике разработки и большинство будет в c #.

-121--2907125-

Для сохранения:

NSMutableArray *array = [[NSMutableArray alloc] init];
[array writeToFile:[@"/path/to/file.plist"] atomically: TRUE];

Для получения:

NSMutableArray *array = [[NSMutableArray arrayWithContentsOfFile:[@"/path/to/file.plist"]] retain];
-121--3171108-
  1. В SVN B будет знать об изменении A, когда B попытается обновить его копию или вернуть. В GIT он узнает, когда пытается перенести изменения в свой локальный репозиторий или перенести их в главный. (На самом деле, я не знаю GIT, поэтому я продолжаю то, что я знаю о Mercurial.)

  2. В таком случае, у вас есть проблемы независимо от того, что вы делаете, и независимо от того, какой контроль версий вы используете. Единственное преимущество блокировки VCS заключается в том, что A или B будут знать, что другой работает над программой, но это может быть сделано другими способами. Правильно сделать так, чтобы все знали о происходящих больших изменениях и координировали свои действия оттуда. Однако на практике это происходит нечасто. В большинстве случаев, если A и B работают над файлом, их изменения легко и правильно объединяются.

  3. Ветвь - это другая «последняя версия», поэтому не всем приходится постоянно работать над одной и той же линией разработки кода.

Одним из способов использования ветвей является разработка функции или чего-то еще, которая займет длительное время, без путаницы с основной линией с частичными обязательствами.

Другой задачей является поддержка версий выпуска. Вместо доставки клиенту последней версии (которая может не полностью работать и может содержать функции, которые клиент не оплатил), чтобы исправить ошибку, исправить ошибку в ветви выпуска и отправить ее. Это намного менее разрушительно для клиента. (Просто убедитесь, что ошибка исправлена на головной версии, также)

0
ответ дан 8 December 2019 в 16:01
поделиться
  1. Человек B знает, что есть изменение, когда он запускает обновление или пытается зафиксировать на сервере.
  2. Этот процесс называется слиянием. Большинство систем очень умны и пытаются выполнить слияние за вас. Однако иногда возникают конфликты, и в этом случае человеку сообщают об этом и просят разрешить конфликт. Это произойдет, если человек A и B изменяют одну и ту же строку кода в одном и том же файле.
1
ответ дан 8 December 2019 в 16:01
поделиться
  1. Человек Б может сделать проверку модификаций из SVN. Я уверен, что существует инструмент, который проверяет изменения каждые несколько минут и предупреждает вас о них.
  2. Они объединяют изменения вместе.
  3. По сути, когда вы делаете разрушающее изменение, вы хотите взять свою рабочую копию и изменить её вне рабочей копии (trunk) всех остальных. Поэтому вы создаете ответвление. Таким образом, другие люди могут работать над веткой, если захотят, но в основном они могут работать в стволе, не беспокоясь об этом, а затем вы сливаете ветку, когда закончите с этим ломающим изменением
1
ответ дан 8 December 2019 в 16:01
поделиться

2) На этом этапе B должен объединить изменения, внесенные A, со своими собственными изменениями. Если они работали с разными частями кода в файле, инструмент управления версиями обычно может делать это автоматически. Если их изменения совпадают, это может стать довольно одиозной задачей, но это случается редко.

3) Ветвь похожа на копию части репозитория, с которой вы можете работать (фиксировать изменения) отдельно от основной линии разработки - это может быть полезно для любых целей, например когда у вас есть старые выпуски, для которых вы хотите исправить ошибки, не заставляя пользователей обновляться до текущей версии (это делают большинство крупных программных проектов).

0
ответ дан 8 December 2019 в 16:01
поделиться

Я не могу рекомендовать книгу Эрика Синка Source Control HOWTO. Она даст вам ответы на вопросы, которые вы ищете, и хорошее понимание контроля исходных текстов в целом.

0
ответ дан 8 December 2019 в 16:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: