Korean CJKmainfont changed
[gitmagic.git] / ru / multiplayer.txt
blobec03dad317c2da2298cc3b5c25c1f3a8d5ce7fd4
1 == Многопользовательский Git ==
3 Сначала я использовал Git для личного проекта, в котором был единственным разработчиком. Среди команд, относящихся к распределенным свойствам Git, мне были нужны только *pull* и *clone*, чтобы хранить один и тот же проект в разных местах.
5 Позднее я захотел опубликовать свой код при помощи Git и включать изменения помощников. Мне пришлось научиться управлять проектами, в которых участвуют многие люди по всему миру. К счастью, в этом сильная сторона Git и, возможно, сам смысл его существования.
7 === Кто я? ===
9 Каждый коммит содержит имя автора и адрес электронной почты, которые выводятся командой *git log*. По умолчанию Git использует системные настройки для заполнения этих полей. Чтобы установить их явно, введите
11   $ git config --global user.name "John
12 Doe"
13   $ git config --global user.email
14 johndoe@example.com
16 Чтобы установить эти параметры только для текущего хранилища, опустите флаг --global.
18 === Git через SSH, HTTP ===
20 Предположим, у вас есть SSH доступ к веб-серверу, но Git не установлен. Git может связываться через HTTP, хотя это и менее эффективно, чем его собственный протокол.
22 Скачайте, скомпилируйте, установите Git
23 в вашем аккаунте; создайте хранилище в
24 каталоге, доступном через web:
26  $ GIT_DIR=proj.git git init
27  $ cd proj.git
28  $ git --bare update-server-info
29  $ cp hooks/post-update.sample
30 hooks/post-update
32 Для старых версий Git команда копирования не сработает, и вы должны будете запустить
34  $ chmod a+x hooks/post-update
36 Теперь вы можете публиковать свои последние правки через SSH с любого клона:
38  $ git push
39 веб.сервер:/путь/к/proj.git master
41 и кто угодно сможет взять ваш проект с помощью
43  $ git clone http://веб.сервер/proj.git
45 === Git через что угодно ===
47 Хотите синхронизировать хранилища без серверов или вообще без сетевого подключения? Вынуждены импровизировать на ходу в непредвиденной ситуации? Мы видели, как <<makinghistory, *git fast-export* и *git fast-import* могут преобразовать хранилища в один файл и обратно>>. Посредством обмена такими файлами мы можем переносить хранилища git любыми доступными средствами, но есть более эффективный инструмент: *git bundle*.
49 Отправитель создает пакет (bundle):
51  $ git bundle create некий-файл HEAD
53 Затем передает «пакет», +некий-файл+, другой команде любыми средствами, как то: электронная почта, флешка, *xxd* печать и последующее распознавание текста, надиктовка битов по телефону, дымовые сигналы и так далее. Получатель восстанавливает коммиты из пакета, введя
55  $ git pull некий-файл
57 Получатель может сделать это даже в пустом хранилище. Несмотря на свой небольшой размер, +некий-файл+ содержит всё исходное хранилище Git.
59 В больших проектах для устранения излишков объема пакетируют только изменения, которых нет в других хранилищах. К примеру, пусть коммит «1b6d…» — последний общий для обеих групп:
61  $ git bundle create некий-файл HEAD ^1b6d
63 Если это делается часто, можно легко забыть, какой коммит был отправлен последним. Справка предлагает для решения этой проблемы использовать теги. А именно, после передачи пакета введите
65  $ git tag -f последний-пакет HEAD
67 и создавайте обновленные пакеты с помощью
69  $ git bundle create новый-пакет HEAD ^последний-пакет
71 === Патчи: общее применение ===
73 Патчи это тексты изменений, вполне понятные как человеку, так и компьютеру. Это делает их очень привлекательным форматом обмена. Патч можно послать разработчикам по электронной почте, независимо от того, какую систему управления версиями они используют. Вашим корреспондентам достаточно возможности читать электронную почту, чтобы увидеть ваши изменения. Точно так же, с Вашей стороны требуется лишь адрес электронной почты: нет нужды в настройке онлайн хранилища Git.
75 Вспомним из первой главы:
77  $ git diff 1b6d
79 выводит патч, который может быть вставлен в письмо для обсуждения. В Git хранилище введите
81  $ git apply < мой.patch
83 для применения патча.
85 В более формальных случаях , когда нужно сохранить имя автора и подписи, создавайте соответствующие патчи с заданной точки, набрав
87  $ git format-patch 1b6d
89 Полученные файлы могут быть отправлены с помощью *git-send-email* или вручную. Вы также можете указать диапазон коммитов:
91  $ git format-patch 1b6d..HEAD^^
93 На принимающей стороне сохраните письмо в файл и введите:
95  $ git am < email.txt
97 Это применит входящие исправления и создаст коммит, включающий имя автора и другую информацию.
99 С web-интерфейсом к электронной почте вам, возможно, потребуется нажать кнопку, чтобы посмотреть электронную почту в своем первоначальном виде перед сохранением патча в файл.
101 Для клиентов электронной почты, использующих mbox, есть небольшие отличия; но если вы используете один из них, то вы, по всей видимости, можете легко разобраться в этом без чтения описаний!
103 === Приносим извинения, мы переехали ===
105 После клонирования хранилища команды *git push* или *git pull* автоматически отправляют и получают его по первоначальному адресу. Каким образом Git это делает? Секрет кроется в настройках, заданных при создании клона. Давайте взглянем:
107  $ git config --list
109 Опция +remote.origin.url+ задает исходный адрес; origin — имя первоначального хранилища. Как и имя ветки master, это соглашение. Мы можем изменить или удалить это сокращённое имя, но как правило, нет причин для этого.
111 Если оригинальное хранилище переехало, можно обновить его адрес командой
113  $ git config remote.origin.url git://новый.url/proj.git
115 Опция +branch.master.merge+ задает удаленную ветку по умолчанию для *git pull*. В ходе первоначального клонирования она устанавливается на текущую ветку исходного хранилища, так что даже если HEAD исходного хранилища впоследствии переместится на другую ветку, pull будет верно следовать изначальной ветке.
117 Этот параметр обращается только к хранилищу, которое мы изначально клонировали и которое записано в параметре +branch.master.remote+. При выполнении pull из других хранилищ мы должны указать нужную ветку:
119  $ git pull git://пример.com/other.git master
121 Это объясняет, почему некоторых из наших предыдущих примеров push и pull не имели аргументов.
123 === Удаленные ветки ===
125 При клонировании хранилища вы также клонируете все его ветки. Вы можете не заметить этого, потому что Git скрывает их: вы должны запросить их явно. Это предотвращает противоречие между ветками в удаленном хранилище и вашими ветками, а также делает Git проще для начинающих.
127 Список удаленных веток можно посмотреть командой
129  $ git branch -r
131 Вы должны увидеть что-то вроде
133  origin/HEAD
134  origin/master
135  origin/experimental
137 Эти имена отвечают веткам и «голове» в удаленном хранилище; их можно использовать в обычных командах Git. Например, вы сделали много коммитов, и хотели бы сравнить текущее состояние с последней загруженной версией. Вы можете искать в журналах нужный SHA1 хеш, но гораздо легче набрать
139  $ git diff origin/HEAD
141 Также можно увидеть, для чего была создана ветка experimental:
143  $ git log origin/experimental
145 === Несколько удаленных хранилищ ===
147 Предположим, что над нашим проектом работают еще два разработчика, и мы хотим следить за обоими. Мы можем наблюдать более чем за одним хранилищем одновременно, вот так:
149  $ git remote add other git://пример.com/некое_хранилище.git
150  $ git pull other некая_ветка
152 Сейчас мы сделали слияние с веткой из второго хранилища. Теперь у нас есть легкий доступ ко всем веткам во всех хранилищах:
154  $ git diff origin/experimental^
155 other/некая_ветка~5
157 Но что если мы просто хотим сравнить их изменения, не затрагивая свою работу? Иными словами, мы хотим изучить чужие ветки, не давая их изменениям вторгаться в наш рабочий каталог. Тогда вместо pull наберите
159  $ git fetch # Перенести из origin, по
160 умолчанию.
161  $ git fetch other # Перенести от
162 второго программиста.
164 Так мы лишь переносим их историю. Хотя рабочий каталог остается нетронутыми, мы можем обратиться к любой ветке в любом хранилище команды, работающей с Git, так как теперь у нас есть локальная копия.
166 Держим в уме, что pull это просто *fetch*, а затем  *merge*. Обычно мы используем *pull*, потому что мы хотим влить к себе последний коммит после получения чужой ветки. Описанная ситуация — примечательное исключение.
168 О том, как отключить удаленные хранилища, игнорировать отдельные ветки и многом другом смотрите в *git help remote*.
170 === Мои Настройки ===
172 Я предпочитаю, чтобы люди, присоединяющиеся к моим проектам, создавали хранилища, из которых я смогу получать изменения с помощью pull. Некоторые хостинги Git позволяют создавать собственные форки проекта в одно касание.
174 После получения дерева из удаленного хранилища я запускаю команды Git для навигации и изучения изменений, в идеале хорошо организованных и описанных. Я делаю слияние со своими изменения и возможно вношу дальнейшие правки. Когда я доволен результатом, я заливаю изменения в главное хранилище.
176 Хотя со мной мало сотрудничают, я верю, что этот подход хорошо масштабируется. Смотрите http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[эту запись в блоге Линуса Торвальдса].
178 Оставаться в мире Git несколько удобнее, чем использовать файлы патчей, так как это избавляет меня от преобразования их в коммиты Git. Кроме того, Git управляет деталями вроде сохранения имени автора и адреса электронной почты, а также даты и времени, и просит авторов описывать свои изменения.