-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtour.ru.html
464 lines (346 loc) · 27.1 KB
/
tour.ru.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Иллюстрированное руководство по Git на Windows</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>Иллюстрированное руководство по Git на Windows</h1>
<h2 id="translations">Переводы</h2>
<p>Это руководство так же доступно на других языках:
<ul>
<li><a href="tour.html">English</a></li>
</ul>
</p>
<h2 id="about">О документе</h2>
<p>Этот документ предназначен для того что бы показать что
использование git на Windows не сложный процесс.В этом руководстве,
я создам хранилище (repository), сделаю несколько фиксаций (commits),
создам ветвь (branch), солью (merge) ветки, осуществлю поиск в истории
фиксаций, опубликую (push) изменения на удалённом сервере, and pull
from a remote server. Большинство из этого будет выполнено с помощью
GUI программ.</p>
<p>Несмотря на то что данное руководство предназначено для Windows, git
GUI работает так же на всех платформах. Поэтому пользователи git на
других платформах могут найти представленную здесь информацию так-же
полезной.</p>
<p>Если у вас есть какие-либо комментарии об этом руководстве, не
стесняйтесь <a href="mailto:nathanj@insightbb.com">обращаться к
автору</a> или <a href="mailto:kron82@gmail.com">переводчику</a>.</p>
<h2 id="putty">Загрузка PuTTY</h2>
<p>Несмотря на то что вы можете использовать SSH программу поставляемую
с git, я предпочитаю использовать PuTTY Agent что бы хранить мои SSH
ключи. Если вы до сих пор не имеет из, скачайте их
<span class="tt">putty.exe</span>, <span class="tt">plink.exe</span>,
<span class="tt">pageant.exe</span>, и <span class="tt">puttygen.exe</span>
с <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">
сайта PuTTY</a>.</p>
<p>Позже в этом руководстве, вы используем эти программы для безопасной
публикации наших изменений на удалённом сервере.</p>
<h2 id="installing">Установка git</h2>
<p>Для начала, скачайте <a
href="http://code.google.com/p/msysgit/downloads/list">msysgit</a>.
Тут вы скачаете единый исполняемый файл, который установит git систему
целиком. При прохождении шагов установочной программы, вы можете захотеть
отметить опцию интеграции с Windows Explorer, когда вы совершаете правый
щелчок мыши на папке.</p>
<p><img src="images/install.png" /></p>
<p>Так как мы будем использовать PuTTY как наш SSH клиент, выберите
<em>Use PLink</em> и заполните путь до скачанной <span class="tt">
plink.exe</span> программы.</p>
<p><img src="images/26.png" /></p>
<p>Продолжите нажатием <em>Next</em> пока установка не завершится.</p>
<h2 id="creating">Создание хранилища</h2>
<p><img src="images/01.png" /></p>
<p>Что бы создать хранилище, сначала создайте папку в которой ваш проект
будет жить. Далее, правый щелчок мышки на этой папке и выберете <em>Git
GUI Here</em>. Так-как в папке пока что не содержится git хранилища вам
будет показан диалог создания.</p>
<p><img src="images/02.png" /></p>
<p>Выбор <em>Create New Repository</em> приводит нас к следующему
диалогу.</p>
<p><img src="images/03.png" /></p>
<p>Заполните путь к вашей новой директории и щёлкните <em>Create</em>.
Далее вы увидите главный интерфейс git gui, который в дальнейшем будет
показываться когда вы будете делать правый щелчок на вашей папке и
выбирать <em>Git GUI Here</em>.</p>
<p><img src="images/04.png" /></p>
<p>Теперь когда хранилище создано, вам надо сообщить git-у кто вы
такой, что бы сообщении фиксации (commit message) был отмечен
правильный автор. Что бы сделать это, выберете <i>Edit →
Options</i>.</p>
<p><img src="images/25.png" /></p>
<p>В диалоге опций расположены 2 варианта на выбор. С левой стороны
диалога опции которые влияют только на это хранилище, в то время как
правая сторона содержит глобальные опции применяемые ко всем хранилищам.
Значения по умолчанию приемлемы, так что заполните только имя
пользователя и email, пока что. Если у вас есть любимый шрифт, вы
можете выставить его сейчас, так же.</p>
<h2 id="committing">Фиксация изменений (commiting)</h2>
<p>Теперь, когда хранилище было создано, пора создать что нибудь
для фиксации. Для этого примера я создал файл <span class="tt">main.c
</span> со следующим содержимым:
<pre>
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello world!\n");
return 0;
}
</pre>
<p>Щелчок на кнопку <em>Rescan</em> в git gui заставит его искать
новые, измененные и удалённые файлы в директории. На следующем
скриншоте git gui нашёл новый файл (удивительно, я знаю).</p>
<p><img src="images/09.png" /></p>
<p>Что бы добавить этот файл в фиксацию, щёлкните на иконке слева от
имени файла. Файл будет перемещён с <em>Unstaged Changes</em> панели на
<em>Staged Changes</em> панель. Теперь мы можем добавить сообщение
фиксации (commit message) и зафиксировать изменения <em>Commit</em>
кнопкой.</p>
<p><img src="images/10.png" /></p>
<p>Говорить 'hello world' это конечно хорошо, но я хочу что бы моя
программа была более персонализирована. Давайте скажем 'hello'
пользователю. Вот как будет выглядеть код:</p>
<pre>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char name[255];
printf("Enter your name: ");
fgets(name, 255, stdin);
printf("length = %d\n", strlen(name)); /* debug line */
name[strlen(name)-1] = '\0'; /* remove the newline at the end */
printf("Hello %s!\n", name);
return 0;
}
</pre>
<p>У меня были проблемы с тем что новая линия печаталась после имени
пользователя, поэтому я добавил отладочную линию кода, что бы помочь
себе найти причину. Я бы хотел зафиксировать изменение без этой
отладочной линии, но я хочу сохранить эту линию в моей рабочей копии
что бы продолжить отладку. С git gui это не проблема. Сначала щёлкните
<em>Rescan</em> для поиска изменений. Далее щёлкните на иконке слева от
файла что бы подготовить (stage) изменения к фиксации. Затем правый
щелчок на отладочной линии и выберите <em>Unstage Line From Commit
</em>.</p>
<p><img src="images/11.png" /></p>
<p>Теперь отладочная линия не была подготовлена (unstaged) к фиксации,
в то время как остальные изменения были. Осталось только заполнить
сообщение фиксации и зафиксировать изменения щёлкнув по <em>Commit
</em>.</p>
<p><img src="images/12.png" /></p>
<h2 id="branching">Ветвление (branching)</h2>
<p>Теперь, давайте предположим что мы хотим начать добавлять новые
возможности в нашу следующую большую версию программы. Но мы так же
хотим сохранить стабильную версию в которой исправлять ошибки. Что бы
сделать это мы создадим ветку (branch) для наших новый разработок. Что
бы создать новую ветку в git gui выберете <i>Branch → Create</i>.
Большая возможность какую я хочу добавить это возможность спросить
пользователя его фамилию, поэтому я назову ветку <span class="tt">
lastname</span>. Опции по умолчанию подходят без изменений, так что
просто введите имя и щёлкните <em>Create</em>.</p>
<p><img src="images/14.png" /></p>
<p>Теперь когда я в <span class="tt">lastname</span> ветке, я могу
делать мои новые модификации:</p>
<pre>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char first[255], last[255];
printf("Enter your first name: ");
fgets(first, 255, stdin);
first[strlen(first)-1] = '\0'; /* remove the newline at the end */
printf("Now enter your last name: ");
gets(last); /* buffer overflow? what's that? */
printf("Hello %s %s!\n", first, last);
return 0;
}
</pre>
<p>Теперь я могу зафиксировать изменения. Замете что я фиксирую
изменения используя другое имя. Мы рассмотрим это позже. Обычно вы
всегда будете использовать одно и тоже имя для фиксаций.</p>
<p><img src="images/15.png" /></p>
<p>Между тем, пользователь проинформировал нас что не показ запятой
после прямого обращения к кому-то это серьёзная ошибка. Что бы
исправить её в нашей стабильной ветке, вы сначала должны переключится
назад на неё. Это достигается используя <i>Branch → Checkout</i>.
<p><img src="images/16.png" /></p>
<p>Теперь мы можем исправить нашу большую ошибку.</p>
<p><img src="images/17.png" /></p>
<p>Если мы выберем <i>Repository → Visualize All Branch
History</i>, мы увидим как складывается наша история.</p>
<p><img src="images/18.png" /></p>
<h2 id="merging">Слияние (merging)</h2>
<p>После напряжённой работы мы решили что наша <span class="tt">lastname
</span> ветка достаточно стабильна что бы влить её в <span class="tt">
master</span> ветку. Что бы выполнить слияние, используйте <i>Merge
→ Local Merge</i>.</p>
<p><img src="images/19.png" /></p>
<p>Так как две разных фиксации делали два разных изменения на одной и
той же линии, происходит конфликт (conflict).</p>
<p><img src="images/20.png" /></p>
<p><img src="images/21.png" /></p>
<p>Конфликт может быть разрешён используя любой текстовый редактор.
После разрешения конфликта, подготовьте изменения щёлкнув на иконке
файла и зафиксируйте слияние щёлкнув по <em>Commit</em> кнопке.</p>
<p><img src="images/22.png" /></p>
<h2 id="history">Просмотр истории</h2>
<p>Файл <span class="tt">main.c</span> становится немного большим,
поэтому я решил вынести код, спрашивающий имя пользователя в отдельную
функцию. Пока я это делал, я решил вынести функцию в отдельный файл.
Хранилище теперь содержит файлы <span class="tt">main.c</span>, <span
class="tt">askname.c</span>, и <span class="tt">askname.h</span>.</p>
<pre>
/* main.c */
#include <stdio.h>
#include "askname.h"
int main(int argc, char **argv)
{
char first[255], last[255];
askname(first, last);
printf("Hello, %s %s!\n", first, last);
return 0;
}
</pre>
<pre>
/* askname.c */
#include <stdio.h>
#include <string.h>
void askname(char *first, char *last)
{
printf("Enter your first name: ");
fgets(first, 255, stdin);
first[strlen(first)-1] = '\0'; /* remove the newline at the end */
printf("Now enter your last name: ");
gets(last); /* buffer overflow? what's that? */
}
</pre>
<pre>
/* askname.h */
void askname(char *first, char *last);
</pre>
<p><img src="images/23.png" /></p>
<p>История хранилища может быть просмотрена и изучена выбрав <i>
Repository → Visualize All Branch History</i>. На следующем
скриншоте я пытаюсь найти в какой фиксации была добавлена <span
class="tt">last</span> переменная, ищя все фиксации в которых было
добавлено или убрано слово <em>last</em>. Фиксации, которые подходят
под условия поиска отмечены жирным шрифтом, что бы быстро и легко
обнаружить нужную фиксацию.</p>
<p><img src="images/27.png" /></p>
<p>Через пару дней, кто-то просматривая наш код увидел что <span
class="tt">gets</span> функция может вызвать переполнение буфера.
Будучи любителем показывать пальцем, этот человек решает запустить git
blame что бы увидеть кто последний раз редактировал эту линию кода.
Проблема в том что Боб, тот кто зафиксировал эту линию в хранилище, а
я последний кто трогал её когда я переместил строку в другой файл.
Очевидно, я не виноват (конечно же). Но так ли умен git что бы
обнаружить это? Да, это так.</p>
<p>Что бы запустить blame, выберете <i>Repository → Browse
master's Files</i>. Из дерева которое появится дважды щёлкните на файле
с интересующей строкой, который в данном случае <span class="tt">
askname.c</span>. Наведённая мышка на интересующую линию показывает нам
подсказку, которая говорит нам всё что нам надо знать.</p>
<p><img src="images/24.png" /></p>
<p>Здесь мы можем видеть что эта линия была зафиксирована Бобом в
фиксации <span class="tt">f6c0</span>, а затем я её переместил в её
новое месторасположение в фиксации <span class="tt">b312</span>.
<h2 id="pushing">Публикация изменений (pushing) на удалённом сервере</h2>
<p>Прежде чем публиковать изменения на удалённом сервере, вам надо
сначала создать пару SSH ключей, публичный и приватный. Используя
SSH вы сможете безопасно идентифицироваться на сервере что вы это тот,
за кого вы себя выдаёте. Создание пары ключей простой процесс. Начните
с запуска программы <span class="tt">puttygen.exe</span>, скачанной ранее.
Далее щёлкните кнопку <em>Generate</em> для генерации ключей. После
обработки в течение нескольких секунд щёлкните <em>Save private key</em>
кнопку, что бы сохранить ваш новый приватный ключ. Скопируйте публичный
ключ в буфер обмена подготавливаясь к следующему шагу. Я рекомендую не
нажимать <em>Save public key</em> кнопку, потому что файл сохраняется
в нестандартном формате; попытки использовать его с другими программами
могут вызвать проблемы.</p>
<p><img src="images/32.png" /></p>
<p>Теперь, когда ключи готовы, удалённый сервер должен знать про
них. Если вы захотите использовать <a href="http://github.com/">github
</a> что бы держать свой код, откройте страницу учётной записи и
вставьте свой публичный ключ.</p>
<p><img src="images/33.png" /></p>
<p>Теперь github получил наш публичный ключ, но у нас до сих пор нет
ключа github-а. Что бы исправить это, запустите <span class="tt">
putty.exe</span>, присоединитесь к <span class="tt">github.com</span>,
и нажмите <em>Yes</em>, что бы принять публичный ключ github-a. Вы
можете спокойно закрыть окно, которое откроется после принятия ключа.
</p>
<p><img src="images/34.png" /></p>
<p><img src="images/35.png" /></p>
<p>Нам нужно что бы наш приватный ключ был загружен для использования с
нашим публичным ключом, так что запустите <span class="tt">pageant.exe
</span>. Эта программа создаст иконку в вашем системном лотке. Двойной
щелчок на иконке откроет окно в которое можно будет вставить приватный
ключ. Когда приватный ключ будет добавлен, агент будет на фоне
предоставлять аутентификацию когда надо.</p>
<p><img src="images/36.png" /></p>
<p>Теперь когда наш клиент и сервер могут идентифицировать друг-друга,
пришло время публиковать! <i>Remote → Push</i> откроет диалог
публикации. Наберите адрес публикации проекта и щёлкните <em>Push</em>,
это вышлет изменения.</p>
<p><img src="images/37.png" /></p>
<p><img src="images/38.png" /></p>
<p>Конечно, набирание каждый раз адреса может стать довольно надоедливым,
если нам придётся делать это постоянно, при каждой публикации. Вместо
этого git позволяет нам ассоциировать длинные адреса используя remotes.
Git gui в текущий момент (конец 2009 года) не поддерживает добавление
внешних, поэтому должна быть использована командная строка. Щёлкните
правой кнопкой на папке хранилища и выберите <i>Git Bash Here</i>.
В строке введите следующую команду:</p>
<pre>
git remote add github git@github.com:nathanj/example.git
</pre>
<p>Примечание: После добавления внешнего, перезапустите git gui, что бы
он смог узнать новый внешний.</p>
<p>Теперь внешний <span class="tt">github</span> ассоциирован с адресом
<span class="tt">git@github.com:nathanj/example.git</span>. Теперь, при
показе диалога публикации в git gui показывается выпадающий список
сохранённых внешних.</p>
<p><img src="images/39.png" /></p>
<h2 id="pulling">Получение изменений (pulling) с удалённого сервера</h2>
<p>Из-за того что наш код такой полезный, несколько человек скачали его
и теперь используют нашу программу. А один человек, Фред, даже решил
форкнуть наш проект и добавить его собственные изменения. Теперь когда
он добавил свой код, он хотел бы что бы мы перетянули его изменения в
своё хранилище. Что бы сделать это, сначала добавим ещё один внешний.</p>
<pre>
git remote add fred ssh://fred@192.168.2.67/home/fred/example
</pre>
<p>Теперь мы можем получить изменения Фреда, используя <i>Remote →
Fetch from → fred</i>.
<p><img src="images/40.png" /></p>
<p>После скачивания, изменения Фреда были добавлены в наше локальное
хранилище в <span class="tt">remotes/fred/master</span> ветку. Мы можем
использовать gitk что бы визуализировать изменения которые сделал Фред.
</p>
<p><img src="images/41.png" /></p>
<p>Если нам нравятся все изменения Фреда, мы можем сделать обычное
слияние как было показано выше. Но всё же в этом случае, мне нравится
только одно изменение Фреда. Что бы влить только одно из изменений
Фреда, щёлкните правой кнопкой мыши на выбранной фиксации и выберите
<i>Cherry-pick this commit</i>. Фиксация будет влита в текущую ветку.
</p>
<p><img src="images/42.png" /></p>
<p><img src="images/43.png" /></p>
<p>Теперь мы можем опубликовать изменение Фреда в нашем хранилище на
github-е, что бы все могли видеть и использовать его.</p>
<p><img src="images/45.png" /></p>
<h2 id="conclusion">Заключение</h2>
<p>В этому руководстве, я показал как выполнить большинство обычных
задач в git используя GUI программу. Я надеюсь что это руководство
показало, что это не только возможно но и легко использовать git на
Windows, без использования командной строки Windows для большинства
операций.</p>
<p>Если у вас есть какие-либо комментарии об этом руководстве, не
стесняйтесь <a href="mailto:nathanj@insightbb.com">обращаться к автору
</a> или <a href="mailto:kron82@gmail.com">переводчику</a>.</p>
</body>
</html>