-
Notifications
You must be signed in to change notification settings - Fork 0
/
a-successful-git-branching-model.html
450 lines (397 loc) · 24.9 KB
/
a-successful-git-branching-model.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
<!DOCTYPE html>
<html lang="en"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>A successful Git branching model » nvie.com</title>
<meta http-equiv="X-UA-Compatible" content="ie=edge,chrome=1">
<meta name="generator" content="iron">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="a-successful-git-branching-model_files/css.css">
<link rel="stylesheet" type="text/css" href="a-successful-git-branching-model_files/main.css">
<link href="https://nvie.com/img/favicon.ico" rel="shortcut icon" type="image/x-icon">
<link rel="alternate" type="application/atom+xml" href="https://feeds.feedburner.com/nvie">
<meta name="description" content="In this post I present a Git branching strategy for developing and releasing software as I’ve used it in many of my projects, and which has turned out to be very successful.">
<meta property="og:description" content="In this post I present a Git branching strategy for developing and releasing software as I’ve used it in many of my projects, and which has turned out to be very successful.">
<meta property="og:title" content="A successful Git branching model">
<meta property="og:type" content="nvie:blog:post">
<meta property="og:image" content="http://nvie.com/img/[email protected]">
<meta property="og:url" content="http://nvie.com/posts/a-successful-git-branching-model/">
<meta property="og:site_name" content="nvie.com">
<meta property="og:locale" content="en_US">
</head>
<body class="post">
<div class="site-container">
<div class="site-header">
<nav>
<ul>
<li><a href="https://nvie.com/">Home</a></li>
<li><a href="https://nvie.com/posts/">Posts</a></li>
<li><a href="https://nvie.com/about/">About</a></li>
</ul>
</nav>
<header>
<h1>A successful Git branching model</h1>
</header>
</div>
<article>
<blockquote class="callout">
👉 Latest post:<br class="mobile-only"> "<a href="https://nvie.com/posts/git-power-tools/"><strong>Git power tools for daily use</strong></a>"
</blockquote>
<div class="meta">
<img src="a-successful-git-branching-model_files/nvie-small2x.jpg" style="border-radius: 5px" width="48">
By <a href="https://nvie.com/about/">Vincent Driessen</a><br>
on Tuesday, January 05, 2010
</div>
<div class="post">
<div id="carbonads-container">
<script async="" type="text/javascript" src="a-successful-git-branching-model_files/carbon.js" id="_carbonads_js"></script>
</div>
<p>In this post I present the development model that I’ve introduced for some of
my projects (both at work and private) about a year ago, and which has turned
out to be very successful. I’ve been meaning to write about it for a while now,
but I’ve never really found the time to do so thoroughly, until now. I won’t
talk about any of the projects’ details, merely about the branching strategy
and release management.</p>
<p class="centered"><img alt="" src="a-successful-git-branching-model_files/git-model2x.png" width="575"></p>
<h2 id="why-git">Why git? <a href="#why-git" rel="bookmark" class="permalink">¶</a></h2>
<p>For a thorough discussion on the pros and cons of Git compared to centralized
source code control systems, see the
<a href="http://git.or.cz/gitwiki/GitSvnComparsion">web</a>. There are plenty of flame
wars going on there. As a developer, I prefer Git above all other tools around
today. Git really changed the way developers think of merging and branching.
From the classic CVS/Subversion world I came from, merging/branching has always
been considered a bit scary (“beware of merge conflicts, they bite you!”) and
something you only do every once in a while.</p>
<p>But with Git, these actions are extremely cheap and simple, and they are
considered one of the core parts of your <em>daily</em> workflow, really. For example,
in CVS/Subversion <a href="http://svnbook.red-bean.com/">books</a>, branching and merging
is first discussed in the later chapters (for advanced users), while in
<a href="http://book.git-scm.com/">every</a>
<a href="http://pragprog.com/titles/tsgit/pragmatic-version-control-using-git">Git</a>
<a href="http://github.com/progit/progit">book</a>, it’s already covered in chapter
3 (basics).</p>
<p>As a consequence of its simplicity and repetitive nature, branching and merging
are no longer something to be afraid of. Version control tools are supposed to
assist in branching/merging more than anything else.</p>
<p>Enough about the tools, let’s head onto the development model. The model that
I’m going to present here is essentially no more than a set of procedures that
every team member has to follow in order to come to a managed software
development process.</p>
<h2 id="decentralized-but-centralized">Decentralized but centralized <a href="#decentralized-but-centralized" rel="bookmark" class="permalink">¶</a></h2>
<p>The repository setup that we use and that works well with this branching model,
is that with a central “truth” repo. Note that this repo is only <em>considered</em>
to be the central one (since Git is a DVCS, there is no such thing as a central
repo at a technical level). We will refer to this repo as <code>origin</code>, since this
name is familiar to all Git users.</p>
<p class="centered"><img alt="" src="a-successful-git-branching-model_files/centr-decentr2x.png" width="487"></p>
<p>Each developer pulls and pushes to origin. But besides the centralized
push-pull relationships, each developer may also pull changes from other peers
to form sub teams. For example, this might be useful to work together with two
or more developers on a big new feature, before pushing the work in progress to
<code>origin</code> prematurely. In the figure above, there are subteams of Alice and Bob,
Alice and David, and Clair and David.</p>
<p>Technically, this means nothing more than that Alice has defined a Git remote,
named <code>bob</code>, pointing to Bob’s repository, and vice versa.</p>
<h2 id="the-main-branches">The main branches <a href="#the-main-branches" rel="bookmark" class="permalink">¶</a></h2>
<p><img alt="" class="right" src="a-successful-git-branching-model_files/main-branches2x.png" width="267"></p>
<p>At the core, the development model is greatly inspired by existing models out
there. The central repo holds two main branches with an infinite lifetime:</p>
<ul>
<li><code>master</code></li>
<li><code>develop</code></li>
</ul>
<p>The <code>master</code> branch at <code>origin</code> should be familiar to every Git user. Parallel
to the <code>master</code> branch, another branch exists called <code>develop</code>.</p>
<p>We consider <code>origin/master</code> to be the main branch where the source code of
<code>HEAD</code> always reflects a <em>production-ready</em> state.</p>
<p>We consider <code>origin/develop</code> to be the main branch where the source code of
<code>HEAD</code> always reflects a state with the latest delivered development changes
for the next release. Some would call this the “integration branch”. This is
where any automatic nightly builds are built from.</p>
<p>When the source code in the <code>develop</code> branch reaches a stable point and is
ready to be released, all of the changes should be merged back into <code>master</code>
somehow and then tagged with a release number. How this is done in detail will
be discussed further on.</p>
<p>Therefore, each time when changes are merged back into <code>master</code>, this is a new
production release <em>by definition</em>. We tend to be very strict at this, so that
theoretically, we could use a Git hook script to automatically build and
roll-out our software to our production servers everytime there was a commit on
<code>master</code>.</p>
<h2 id="supporting-branches">Supporting branches <a href="#supporting-branches" rel="bookmark" class="permalink">¶</a></h2>
<p>Next to the main branches <code>master</code> and <code>develop</code>, our development model uses
a variety of supporting branches to aid parallel development between team
members, ease tracking of features, prepare for production releases and to
assist in quickly fixing live production problems. Unlike the main branches,
these branches always have a limited life time, since they will be removed
eventually.</p>
<p>The different types of branches we may use are:</p>
<ul>
<li>Feature branches</li>
<li>Release branches</li>
<li>Hotfix branches</li>
</ul>
<p>Each of these branches have a specific purpose and are bound to strict rules as
to which branches may be their originating branch and which branches must be
their merge targets. We will walk through them in a minute.</p>
<p>By no means are these branches “special” from a technical perspective. The
branch types are categorized by how we <em>use</em> them. They are of course plain old
Git branches.</p>
<h3 id="feature-branches">Feature branches <a href="#feature-branches" rel="bookmark" class="permalink">¶</a></h3>
<p><img alt="" class="right" src="a-successful-git-branching-model_files/fb2x.png" width="133"></p>
<dl>
<dt>May branch off from:</dt>
<dd><code>develop</code> </dd>
<dt>Must merge back into:</dt>
<dd><code>develop</code> </dd>
<dt>Branch naming convention:</dt>
<dd>anything except <code>master</code>, <code>develop</code>, <code>release-*</code>, or <code>hotfix-*</code></dd>
</dl>
<p>Feature branches (or sometimes called topic branches) are used to develop new
features for the upcoming or a distant future release. When starting
development of a feature, the target release in which this feature will be
incorporated may well be unknown at that point. The essence of a feature branch
is that it exists as long as the feature is in development, but will eventually
be merged back into <code>develop</code> (to definitely add the new feature to the
upcoming release) or discarded (in case of a disappointing experiment).</p>
<p>Feature branches typically exist in developer repos only, not in <code>origin</code>.</p>
<h4 id="creating-a-feature-branch">Creating a feature branch <a href="#creating-a-feature-branch" rel="bookmark" class="permalink">¶</a></h4>
<p>When starting work on a new feature, branch off from the <code>develop</code> branch.</p>
<div class="codehilite"><pre><span class="gp">$</span> git checkout -b myfeature develop
<span class="go">Switched to a new branch "myfeature"</span>
</pre></div>
<h4 id="incorporating-a-finished-feature-on-develop">Incorporating a finished feature on develop <a href="#incorporating-a-finished-feature-on-develop" rel="bookmark" class="permalink">¶</a></h4>
<p>Finished features may be merged into the <code>develop</code> branch to definitely add
them to the upcoming release:</p>
<div class="codehilite"><pre><span class="gp">$</span> git checkout develop
<span class="go">Switched to branch 'develop'</span>
<span class="gp">$</span> git merge --no-ff myfeature
<span class="go">Updating ea1b82a..05e9557</span>
<span class="go">(Summary of changes)</span>
<span class="gp">$</span> git branch -d myfeature
<span class="go">Deleted branch myfeature (was 05e9557).</span>
<span class="gp">$</span> git push origin develop
</pre></div>
<p>The <code>--no-ff</code> flag causes the merge to always create a new commit object, even
if the merge could be performed with a fast-forward. This avoids losing
information about the historical existence of a feature branch and groups
together all commits that together added the feature. Compare:</p>
<p class="centered"><img alt="" src="a-successful-git-branching-model_files/merge-without-ff2x.png" width="478"></p>
<p>In the latter case, it is impossible to see from the Git history which of the
commit objects together have implemented a feature—you would have to manually
read all the log messages. Reverting a whole feature (i.e. a group of commits),
is a true headache in the latter situation, whereas it is easily done if the
<code>--no-ff</code> flag was used.</p>
<p>Yes, it will create a few more (empty) commit objects, but the gain is much
bigger than the cost.</p>
<h3 id="release-branches">Release branches <a href="#release-branches" rel="bookmark" class="permalink">¶</a></h3>
<dl>
<dt>May branch off from:</dt>
<dd><code>develop</code></dd>
<dt>Must merge back into:</dt>
<dd><code>develop</code> and <code>master</code></dd>
<dt>Branch naming convention:</dt>
<dd><code>release-*</code></dd>
</dl>
<p>Release branches support preparation of a new production release. They allow
for last-minute dotting of i’s and crossing t’s. Furthermore, they allow for
minor bug fixes and preparing meta-data for a release (version number, build
dates, etc.). By doing all of this work on a release branch, the <code>develop</code>
branch is cleared to receive features for the next big release.</p>
<p>The key moment to branch off a new release branch from <code>develop</code> is when
develop (almost) reflects the desired state of the new release. At least all
features that are targeted for the release-to-be-built must be merged in to
<code>develop</code> at this point in time. All features targeted at future releases may
not—they must wait until after the release branch is branched off.</p>
<p>It is exactly at the start of a release branch that the upcoming release gets
assigned a version number—not any earlier. Up until that moment, the <code>develop</code>
branch reflected changes for the “next release”, but it is unclear whether that
“next release” will eventually become 0.3 or 1.0, until the release branch is
started. That decision is made on the start of the release branch and is
carried out by the project’s rules on version number bumping.</p>
<h4 id="creating-a-release-branch">Creating a release branch <a href="#creating-a-release-branch" rel="bookmark" class="permalink">¶</a></h4>
<p>Release branches are created from the <code>develop</code> branch. For example, say
version 1.1.5 is the current production release and we have a big release
coming up. The state of <code>develop</code> is ready for the “next release” and we have
decided that this will become version 1.2 (rather than 1.1.6 or 2.0). So we
branch off and give the release branch a name reflecting the new version
number:</p>
<div class="codehilite"><pre><span class="gp">$</span> git checkout -b release-1.2 develop
<span class="go">Switched to a new branch "release-1.2"</span>
<span class="gp">$</span> ./bump-version.sh 1.2
<span class="go">Files modified successfully, version bumped to 1.2.</span>
<span class="gp">$</span> git commit -a -m <span class="s2">"Bumped version number to 1.2"</span>
<span class="go">[release-1.2 74d9424] Bumped version number to 1.2</span>
<span class="go">1 files changed, 1 insertions(+), 1 deletions(-)</span>
</pre></div>
<p>After creating a new branch and switching to it, we bump the version number.
Here, <code>bump-version.sh</code> is a fictional shell script that changes some files in
the working copy to reflect the new version. (This can of course be a manual
change—the point being that <em>some</em> files change.) Then, the bumped version
number is committed.</p>
<p>This new branch may exist there for a while, until the release may be rolled
out definitely. During that time, bug fixes may be applied in this branch
(rather than on the <code>develop</code> branch). Adding large new features here is
strictly prohibited. They must be merged into <code>develop</code>, and therefore, wait
for the next big release.</p>
<h4 id="finishing-a-release-branch">Finishing a release branch <a href="#finishing-a-release-branch" rel="bookmark" class="permalink">¶</a></h4>
<p>When the state of the release branch is ready to become a real release, some
actions need to be carried out. First, the release branch is merged into
<code>master</code> (since every commit on <code>master</code> is a new release <em>by definition</em>,
remember). Next, that commit on <code>master</code> must be tagged for easy future
reference to this historical version. Finally, the changes made on the release
branch need to be merged back into <code>develop</code>, so that future releases also
contain these bug fixes.</p>
<p>The first two steps in Git:</p>
<div class="codehilite"><pre><span class="gp">$</span> git checkout master
<span class="go">Switched to branch 'master'</span>
<span class="gp">$</span> git merge --no-ff release-1.2
<span class="go">Merge made by recursive.</span>
<span class="go">(Summary of changes)</span>
<span class="gp">$</span> git tag -a 1.2
</pre></div>
<p>The release is now done, and tagged for future reference. </p>
<blockquote>
<p><strong>Edit:</strong> You might as well want to use the <code>-s</code> or <code>-u <key></code> flags to sign
your tag cryptographically.</p>
</blockquote>
<p>To keep the changes made in the release branch, we need to merge those back
into <code>develop</code>, though. In Git:</p>
<div class="codehilite"><pre><span class="gp">$</span> git checkout develop
<span class="go">Switched to branch 'develop'</span>
<span class="gp">$</span> git merge --no-ff release-1.2
<span class="go">Merge made by recursive.</span>
<span class="go">(Summary of changes)</span>
</pre></div>
<p>This step may well lead to a merge conflict (probably even, since we have
changed the version number). If so, fix it and commit.</p>
<p>Now we are really done and the release branch may be removed, since we don’t
need it anymore:</p>
<div class="codehilite"><pre><span class="gp">$</span> git branch -d release-1.2
<span class="go">Deleted branch release-1.2 (was ff452fe).</span>
</pre></div>
<h3 id="hotfix-branches">Hotfix branches <a href="#hotfix-branches" rel="bookmark" class="permalink">¶</a></h3>
<p><img alt="" class="right" src="a-successful-git-branching-model_files/hotfix-branches2x.png" width="316"></p>
<dl>
<dt>May branch off from:</dt>
<dd><code>master</code></dd>
<dt>Must merge back into:</dt>
<dd><code>develop</code> and <code>master</code></dd>
<dt>Branch naming convention:</dt>
<dd><code>hotfix-*</code></dd>
</dl>
<p>Hotfix branches are very much like release branches in that they are also meant
to prepare for a new production release, albeit unplanned. They arise from the
necessity to act immediately upon an undesired state of a live production
version. When a critical bug in a production version must be resolved
immediately, a hotfix branch may be branched off from the corresponding tag on
the master branch that marks the production version.</p>
<p>The essence is that work of team members (on the <code>develop</code> branch) can
continue, while another person is preparing a quick production fix.</p>
<h4 id="creating-the-hotfix-branch">Creating the hotfix branch <a href="#creating-the-hotfix-branch" rel="bookmark" class="permalink">¶</a></h4>
<p>Hotfix branches are created from the <code>master</code> branch. For example, say version
1.2 is the current production release running live and causing troubles due to
a severe bug. But changes on <code>develop</code> are yet unstable. We may then branch off
a hotfix branch and start fixing the problem:</p>
<div class="codehilite"><pre><span class="gp">$</span> git checkout -b hotfix-1.2.1 master
<span class="go">Switched to a new branch "hotfix-1.2.1"</span>
<span class="gp">$</span> ./bump-version.sh 1.2.1
<span class="go">Files modified successfully, version bumped to 1.2.1.</span>
<span class="gp">$</span> git commit -a -m <span class="s2">"Bumped version number to 1.2.1"</span>
<span class="go">[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1</span>
<span class="go">1 files changed, 1 insertions(+), 1 deletions(-)</span>
</pre></div>
<p>Don’t forget to bump the version number after branching off!</p>
<p>Then, fix the bug and commit the fix in one or more separate commits.</p>
<div class="codehilite"><pre><span class="gp">$</span> git commit -m <span class="s2">"Fixed severe production problem"</span>
<span class="go">[hotfix-1.2.1 abbe5d6] Fixed severe production problem</span>
<span class="go">5 files changed, 32 insertions(+), 17 deletions(-)</span>
</pre></div>
<h4 id="finishing-a-hotfix-branch">Finishing a hotfix branch <a href="#finishing-a-hotfix-branch" rel="bookmark" class="permalink">¶</a></h4>
<p>When finished, the bugfix needs to be merged back into <code>master</code>, but also needs
to be merged back into <code>develop</code>, in order to safeguard that the bugfix is
included in the next release as well. This is completely similar to how release
branches are finished.</p>
<p>First, update <code>master</code> and tag the release.</p>
<div class="codehilite"><pre><span class="gp">$</span> git checkout master
<span class="go">Switched to branch 'master'</span>
<span class="gp">$</span> git merge --no-ff hotfix-1.2.1
<span class="go">Merge made by recursive.</span>
<span class="go">(Summary of changes)</span>
<span class="gp">$</span> git tag -a 1.2.1
</pre></div>
<blockquote>
<p><strong>Edit:</strong> You might as well want to use the <code>-s</code> or <code>-u <key></code> flags to sign
your tag cryptographically.</p>
</blockquote>
<p>Next, include the bugfix in <code>develop</code>, too:</p>
<div class="codehilite"><pre><span class="gp">$</span> git checkout develop
<span class="go">Switched to branch 'develop'</span>
<span class="gp">$</span> git merge --no-ff hotfix-1.2.1
<span class="go">Merge made by recursive.</span>
<span class="go">(Summary of changes)</span>
</pre></div>
<p>The one exception to the rule here is that, <strong>when a release branch currently
exists, the hotfix changes need to be merged into that release branch, instead
of <code>develop</code></strong>. Back-merging the bugfix into the release branch will eventually
result in the bugfix being merged into <code>develop</code> too, when the release branch
is finished. (If work in <code>develop</code> immediately requires this bugfix and cannot
wait for the release branch to be finished, you may safely merge the bugfix
into <code>develop</code> now already as well.)</p>
<p>Finally, remove the temporary branch:</p>
<div class="codehilite"><pre><span class="gp">$</span> git branch -d hotfix-1.2.1
<span class="go">Deleted branch hotfix-1.2.1 (was abbe5d6).</span>
</pre></div>
<h2 id="summary">Summary <a href="#summary" rel="bookmark" class="permalink">¶</a></h2>
<p>While there is nothing really shocking new to this branching model, the “big
picture” figure that this post began with has turned out to be tremendously
useful in our projects. It forms an elegant mental model that is easy to
comprehend and allows team members to develop a shared understanding of the
branching and releasing processes.</p>
<p>A high-quality PDF version of the figure is provided here. Go ahead and hang it
on the wall for quick reference at any time.</p>
<p><strong>Update:</strong> And for anyone who requested it: here’s the
<a href="http://github.com/downloads/nvie/gitflow/Git-branching-model-src.key.zip">gitflow-model.src.key</a> of the main diagram image (Apple Keynote).</p>
<p class="centered"><a href="https://nvie.com/files/Git-branching-model.pdf"><img alt="" src="a-successful-git-branching-model_files/pdf2x.png" width="128"></a><br>
<a href="https://nvie.com/files/Git-branching-model.pdf">Git-branching-model.pdf</a></p>
<h2>Other posts on this blog</h2>
<ul>
<li><a href="https://nvie.com/posts/git-power-tools/"><strong>Git power tools for daily use</strong></a></li>
<li><a href="https://nvie.com/posts/introducing-decoders/"><strong>An intro to decoders</strong></a></li>
<li><a href="https://nvie.com/posts/why-you-should-consider-technical-debt-to-be-real-debt/"><strong>Technical debt is real debt</strong></a></li>
<li><a href="https://nvie.com/posts/beautiful-code/"><strong>Beautiful code</strong></a></li>
<li><a href="https://nvie.com/posts/beautiful-map/"><strong>Beautiful map</strong></a></li>
</ul>
</div>
<p>If you want to get in touch, I'm <a href="http://twitter.com/nvie">@nvie</a> on Twitter.</p>
</article>
<footer>
<div id="footer">
<p>
Vincent Driessen is an independent software engineer and consultant from
the Netherlands.
</p>
</div>
</footer></div>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-7780973-1");
pageTracker._initData();
pageTracker._trackPageview();
</script>
<script type="text/javascript">
var _gauges = _gauges || [];
(function() {
var t = document.createElement('script');
t.type = 'text/javascript';
t.async = true;
t.id = 'gauges-tracker';
t.setAttribute('data-site-id', '50693215613f5d378200002c');
t.src = '//secure.gaug.es/track.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(t, s);
})();
</script>
</body></html>