-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.html
289 lines (255 loc) · 12.5 KB
/
index.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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=1024, user-scalable=no">
<title>Git Best Practices</title>
<link rel="stylesheet" media="screen" href="core/deck.core.css">
<link rel="stylesheet" media="screen" href="extensions/status/deck.status.css">
<link rel="stylesheet" media="screen" href="extensions/scale/deck.scale.css">
<link rel="stylesheet" media="screen" href="themes/style/swiss.css">
<link rel="stylesheet" media="screen" href="themes/transition/horizontal-slide.css">
<link rel="stylesheet" media="print" href="core/print.css">
<script src="assets/javascripts/modernizr.custom.js"></script>
</head>
<body>
<div class="deck-container">
<section class="slide">
<h1><small>Git: Лучшие практики</small></h1>
</section>
<section class="slide">
<h2>Вступление</h2>
<p class="slide">Ваш повседневный набор команд: <code>git commit</code>, <code>git pull</code> и <code>git push</code>?</p>
<p class="slide">Вас пугают команды <code>git amend</code> и <code>git rebase</code>?</p>
</section>
<section class="slide">
<h1><small>Попробуем исправиться</small></h1>
</section>
<section class="slide">
<h2>Почему история коммитов важна</h2>
<ul>
<li class="slide">История коммитов - это как оглавление в книге.</li>
<li class="slide">Помогает другим понимать содержимое и цель каждого коммита.</li>
</ul>
</section>
<section class="slide">
<h2>Лучшие практики при составлении коммитов</h2>
<ul>
<li class="slide">
<strong>Коммит должен содержать только те изменения, которые к нему относятся.</strong>
<p>
Исправляя две разные ошибки, вы должны разделить их в отдельные коммиты. <br />
Небольшие коммиты проще понять всем остальным.
</p>
</li>
<li class="slide">
<strong>Частые коммиты</strong>
<p>Это поможет вам создавать небольшие коммиты с одной определенной задачей.</p>
</li>
<li class="slide">
<strong>Не стоит коммитить незаконченный функционал.</strong>
<p>
Это значит - не нужно создавать коммит в конце рабочего дня лишь для того, чтобы "не потерять" свои изменения.<br />
И это вовсе не значит, что нужно коммитить всю задачу (feature) целиком. <br />
Нужно просто разбить ее на подзадачи.
</p>
</li>
<li class="slide">
<strong>Отдельная ветка для каждой задачи.</strong>
<p>Это поможет вам легко переключаться между задачами.</p>
</li>
</ul>
</section>
<section class="slide">
<h2>Перечитывайте перед тем, как коммитить</h2>
<p class="slide"><code>git diff</code> - разница в измененных файлах.</p>
<p class="slide"><code>git diff --cached</code> - разница в подготовленных для коммита файлах.</p>
</section>
<section class="slide">
<h2>Как составить хорошее описание коммита</h2>
<p class="slide">Используйте <code>git commit</code> без параметра <code>-m (--message)</code></p>
<p class="slide">
Заголовок коммита должен быть коротким описанием, начинающимся с заглавной буквы, не более 50 символов.<br />
Затем следует более детальное описание, отделенное от заголовка пустой строкой.<br />
Границы данного описания должны быть в пределах 72 символов.<br />
</p>
<p class="slide">
Пишите сообщения в повелительном наклонении: используя "fix", "change", "add" вместо "fixed", "changed", "added".<br />
Это соглашение совпадает с сообщениями, генерируемыми командами git merge и git revert.
</p>
</section>
<section class="slide">
<h2>Поэтапное добавление изменений</h2>
<p class="slide"><code>git add -p <filename></code></p>
<p class="slide">
<code>
y - stage this hunk<br />
n - do not stage this hunk<br />
q - quit; do not stage this hunk nor any of the remaining ones<br />
a - stage this hunk and all later hunks in the file<br />
d - do not stage this hunk nor any of the later hunks in the file<br />
g - select a hunk to go to<br />
/ - search for a hunk matching the given regex<br />
j - leave this hunk undecided, see next undecided hunk<br />
J - leave this hunk undecided, see next hunk<br />
k - leave this hunk undecided, see previous undecided hunk<br />
K - leave this hunk undecided, see previous hunk<br />
s - split the current hunk into smaller hunks<br />
e - manually edit the current hunk<br />
? - print help<br />
</code>
</p>
</section>
<section class="slide">
<h2>Слияние с fast forward и без</h2>
<p class="slide">
<strong>Fast Forward</strong> - переносит указатель в текущей ветке на последний коммит из целевой
<br />Поведение <code>git merge</code> по умолчанию
</p>
<p class="slide">
<strong>Без Fast Forward</strong> - явно создаст дополнительный коммит слияния.
<br /><code>git merge --no-ff</code>
</p>
</section>
<section class="slide">
<img src="assets/images/ff-noff.png" />
</section>
<section class="slide">
<h2>Git Rebase</h2>
<p>
Из справки о git: <br />
<blockquote>"git-rebase - Forward-port local commits to the updated upstream head"</blockquote>
</p>
</section>
<section class="slide"><h1><small>Достаточно понятное описание?</small></h1></section>
<section class="slide"><h1><small>Конечно, нет =)</small></h1></section>
<section class="slide">
<h2>Git Rebase</h2>
<p>
Позволяет переписывать историию несколькими способами. <br />
Такими, как: перенос коммитов в начало другой ветки, слияние коммитов и их изменение.
</p>
<div class="slide">
<p><code>git rebase master</code></p>
<p><img src="assets/images/git-rebase.png" /></p>
</div>
</section>
<section class="slide">
<h2>Git Rebase --interactive</h2>
<p><code>git rebase --interactive commits..range</code></p>
<pre>
<code>
pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B
# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
</code>
</pre>
</section>
<section class="slide">
<h2>Git Rebase - дополнительная информация</h2>
<p class="slide">Не рекомендуется применять rebase к уже опубликованным коммитам.</p>
<p class="slide"><code>git pull --rebase</code></p>
</section>
<section class="slide">
<h2>Как выглядит (мой) рабочий процесс</h2>
<ul>
<li class="slide">Для каждой основной задачи содается отдельная ветка, используя <code>git checkout -b имя-ветки</code></li>
<li class="slide">Создаются коммиты для каждой небольшой и независимой подзадачи</li>
<li class="slide">Если что-то забыли, можно подправить последний коммит, используя <code>git --amend</code></li>
<li class="slide">Если изменения нужно провести в нескольких коммитах, поменять их местами или объединить, используем <code>git rebase -i</code></li>
<li class="slide">Перед слиянием текущей ветки в основную, производим <code>git rebase имя-основной-ветки</code></li>
<li class="slide">Сливаем ветки, используя <code>git merge --no-ff имя-ветки</code>, находясь при этом в основной ветке</li>
</ul>
</section>
<section class="slide">
<h2>Псевдонимы</h2>
<pre>
<code>
# ~/.gitconfig
[alias]
st = status
co = checkout
aa = add --all
ff = flow feature
l = !~/.githelpers
dc = diff --cached
rc = rebase --continue
</code>
</pre>
</section>
<section class="slide">
<h2>Псевдонимы</h2>
<pre>
<code>
#!/bin/bash
HASH="%C(yellow)%h%C(reset)"
RELATIVE_TIME="%C(green)%ar%C(reset)"
AUTHOR="%C(bold blue)%an%C(reset)"
REFS="%C(red)%d%C(reset)"
SUBJECT="%s"
FORMAT="$HASH{$RELATIVE_TIME{$AUTHOR{$REFS $SUBJECT"
git log --graph --pretty="tformat:$FORMAT" $* | column -t -s '{' | less -FXRS
</code>
</pre>
</section>
<section class="slide">
<h2>Псевдонимы</h2>
<h3><code>git l</code></h3>
<img src="assets/images/git_log.png" />
</section>
<section class="slide">
<h2>Git Bisect</h2>
<p class="slide"><code>git bisect start</code></p>
<p class="slide"><code>git bisect bad # Помечаем текущую версию, как сломанную</code></p>
<p class="slide"><code>git bisect good v1.2.3 # Помечаем коммит с работающей версией</code></p>
<p class="slide"><code>... (git show)</code></p>
<p class="slide"><code>git bisect reset</code></p>
</section>
<section class="slide">
<h1>Вопросы</h1>
</section>
<section class="slide">
<h2>Полезные ссылки</h2>
<ul>
<li>http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html</li>
<li>http://mislav.uniqpath.com/2013/02/merge-vs-rebase/</li>
<li>https://www.atlassian.com/git/tutorials/rewriting-history</li>
<li>http://code.tutsplus.com/tutorials/git-tips-from-the-pros--net-29799</li>
<li>http://codeinthehole.com/writing/pull-requests-and-other-good-practices-for-teams-using-github/</li>
</ul>
</section>
<p class="deck-status" aria-role="status">
<span class="deck-status-current"></span>
/
<span class="deck-status-total"></span>
</p>
</div>
<script src="assets/javascripts/jquery.min.js"></script>
<script src="core/deck.core.js"></script>
<script src="extensions/status/deck.status.js"></script>
<script src="extensions/scale/deck.scale.js"></script>
<script>
$(function() {
$.deck('.slide');
$.deck('enableScale');
});
</script>
</body>
</html>