blob: 0ca400d181475e244f6fdcb55d5df94cd415211e [file] [log] [blame]
Junio C Hamano7d06a8a2008-10-20 05:42:331<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4<head>
Junio C Hamano9d971152012-12-19 00:43:115<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
Junio C Hamanoc14e6ad2014-10-31 20:25:536<meta name="generator" content="AsciiDoc 8.6.9" />
Junio C Hamano103b5722011-01-31 05:03:457<title>gitworkflows(7)</title>
Junio C Hamano7d06a8a2008-10-20 05:42:338<style type="text/css">
Junio C Hamano9d971152012-12-19 00:43:119/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
10
11/* Default font. */
12body {
13 font-family: Georgia,serif;
14}
15
16/* Title font. */
17h1, h2, h3, h4, h5, h6,
18div.title, caption.title,
19thead, p.table.header,
20#toctitle,
21#author, #revnumber, #revdate, #revremark,
22#footer {
23 font-family: Arial,Helvetica,sans-serif;
Junio C Hamano7d06a8a2008-10-20 05:42:3324}
25
26body {
27 margin: 1em 5% 1em 5%;
28}
29
30a {
31 color: blue;
32 text-decoration: underline;
33}
34a:visited {
35 color: fuchsia;
36}
37
38em {
39 font-style: italic;
Junio C Hamano103b5722011-01-31 05:03:4540 color: navy;
Junio C Hamano7d06a8a2008-10-20 05:42:3341}
42
43strong {
44 font-weight: bold;
Junio C Hamano103b5722011-01-31 05:03:4545 color: #083194;
Junio C Hamano7d06a8a2008-10-20 05:42:3346}
47
Junio C Hamano7d06a8a2008-10-20 05:42:3348h1, h2, h3, h4, h5, h6 {
49 color: #527bbd;
Junio C Hamano7d06a8a2008-10-20 05:42:3350 margin-top: 1.2em;
51 margin-bottom: 0.5em;
52 line-height: 1.3;
53}
54
55h1, h2, h3 {
56 border-bottom: 2px solid silver;
57}
58h2 {
59 padding-top: 0.5em;
60}
61h3 {
62 float: left;
63}
64h3 + * {
65 clear: left;
66}
Junio C Hamano9d971152012-12-19 00:43:1167h5 {
68 font-size: 1.0em;
69}
Junio C Hamano7d06a8a2008-10-20 05:42:3370
71div.sectionbody {
Junio C Hamano7d06a8a2008-10-20 05:42:3372 margin-left: 0;
73}
74
75hr {
76 border: 1px solid silver;
77}
78
79p {
80 margin-top: 0.5em;
81 margin-bottom: 0.5em;
82}
83
Junio C Hamano103b5722011-01-31 05:03:4584ul, ol, li > p {
85 margin-top: 0;
86}
Junio C Hamano9d971152012-12-19 00:43:1187ul > li { color: #aaa; }
88ul > li > * { color: black; }
Junio C Hamano103b5722011-01-31 05:03:4589
Junio C Hamanoc14e6ad2014-10-31 20:25:5390.monospaced, code, pre {
91 font-family: "Courier New", Courier, monospace;
92 font-size: inherit;
93 color: navy;
Junio C Hamano7d06a8a2008-10-20 05:42:3394 padding: 0;
95 margin: 0;
96}
Junio C Hamanoc14e6ad2014-10-31 20:25:5397pre {
98 white-space: pre-wrap;
99}
Junio C Hamano7d06a8a2008-10-20 05:42:33100
Junio C Hamano9d971152012-12-19 00:43:11101#author {
Junio C Hamano7d06a8a2008-10-20 05:42:33102 color: #527bbd;
Junio C Hamano7d06a8a2008-10-20 05:42:33103 font-weight: bold;
104 font-size: 1.1em;
105}
Junio C Hamano9d971152012-12-19 00:43:11106#email {
Junio C Hamano7d06a8a2008-10-20 05:42:33107}
Junio C Hamano9d971152012-12-19 00:43:11108#revnumber, #revdate, #revremark {
Junio C Hamano7d06a8a2008-10-20 05:42:33109}
110
Junio C Hamano9d971152012-12-19 00:43:11111#footer {
Junio C Hamano7d06a8a2008-10-20 05:42:33112 font-size: small;
113 border-top: 2px solid silver;
114 padding-top: 0.5em;
115 margin-top: 4.0em;
116}
Junio C Hamano9d971152012-12-19 00:43:11117#footer-text {
Junio C Hamano7d06a8a2008-10-20 05:42:33118 float: left;
119 padding-bottom: 0.5em;
120}
Junio C Hamano9d971152012-12-19 00:43:11121#footer-badges {
Junio C Hamano7d06a8a2008-10-20 05:42:33122 float: right;
123 padding-bottom: 0.5em;
124}
125
Junio C Hamano9d971152012-12-19 00:43:11126#preamble {
Junio C Hamano103b5722011-01-31 05:03:45127 margin-top: 1.5em;
128 margin-bottom: 1.5em;
129}
Junio C Hamano9d971152012-12-19 00:43:11130div.imageblock, div.exampleblock, div.verseblock,
Junio C Hamano7d06a8a2008-10-20 05:42:33131div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
132div.admonitionblock {
Junio C Hamano7bd050f2011-09-22 06:32:22133 margin-top: 1.0em;
Junio C Hamano7d06a8a2008-10-20 05:42:33134 margin-bottom: 1.5em;
135}
136div.admonitionblock {
Junio C Hamano7bd050f2011-09-22 06:32:22137 margin-top: 2.0em;
138 margin-bottom: 2.0em;
139 margin-right: 10%;
140 color: #606060;
Junio C Hamano7d06a8a2008-10-20 05:42:33141}
142
143div.content { /* Block element content. */
144 padding: 0;
145}
146
147/* Block element titles. */
148div.title, caption.title {
Junio C Hamano103b5722011-01-31 05:03:45149 color: #527bbd;
Junio C Hamano7d06a8a2008-10-20 05:42:33150 font-weight: bold;
151 text-align: left;
152 margin-top: 1.0em;
153 margin-bottom: 0.5em;
154}
155div.title + * {
156 margin-top: 0;
157}
158
159td div.title:first-child {
160 margin-top: 0.0em;
161}
162div.content div.title:first-child {
163 margin-top: 0.0em;
164}
165div.content + div.title {
166 margin-top: 0.0em;
167}
168
169div.sidebarblock > div.content {
170 background: #ffffee;
Junio C Hamano9d971152012-12-19 00:43:11171 border: 1px solid #dddddd;
172 border-left: 4px solid #f0f0f0;
Junio C Hamano7d06a8a2008-10-20 05:42:33173 padding: 0.5em;
174}
175
Junio C Hamano7d06a8a2008-10-20 05:42:33176div.listingblock > div.content {
Junio C Hamano9d971152012-12-19 00:43:11177 border: 1px solid #dddddd;
178 border-left: 5px solid #f0f0f0;
179 background: #f8f8f8;
Junio C Hamano7d06a8a2008-10-20 05:42:33180 padding: 0.5em;
181}
182
Junio C Hamano7bd050f2011-09-22 06:32:22183div.quoteblock, div.verseblock {
184 padding-left: 1.0em;
185 margin-left: 1.0em;
Junio C Hamano103b5722011-01-31 05:03:45186 margin-right: 10%;
Junio C Hamano9d971152012-12-19 00:43:11187 border-left: 5px solid #f0f0f0;
188 color: #888;
Junio C Hamano7d06a8a2008-10-20 05:42:33189}
Junio C Hamano7bd050f2011-09-22 06:32:22190
Junio C Hamano103b5722011-01-31 05:03:45191div.quoteblock > div.attribution {
192 padding-top: 0.5em;
Junio C Hamano7d06a8a2008-10-20 05:42:33193 text-align: right;
194}
Junio C Hamano103b5722011-01-31 05:03:45195
Junio C Hamano9d971152012-12-19 00:43:11196div.verseblock > pre.content {
197 font-family: inherit;
198 font-size: inherit;
Junio C Hamano103b5722011-01-31 05:03:45199}
200div.verseblock > div.attribution {
201 padding-top: 0.75em;
202 text-align: left;
203}
204/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
Junio C Hamano7d06a8a2008-10-20 05:42:33205div.verseblock + div.attribution {
206 text-align: left;
207}
208
209div.admonitionblock .icon {
210 vertical-align: top;
211 font-size: 1.1em;
212 font-weight: bold;
213 text-decoration: underline;
214 color: #527bbd;
215 padding-right: 0.5em;
216}
217div.admonitionblock td.content {
218 padding-left: 0.5em;
Junio C Hamano7bd050f2011-09-22 06:32:22219 border-left: 3px solid #dddddd;
Junio C Hamano7d06a8a2008-10-20 05:42:33220}
221
222div.exampleblock > div.content {
Junio C Hamano7bd050f2011-09-22 06:32:22223 border-left: 3px solid #dddddd;
224 padding-left: 0.5em;
Junio C Hamano7d06a8a2008-10-20 05:42:33225}
226
Junio C Hamano7d06a8a2008-10-20 05:42:33227div.imageblock div.content { padding-left: 0; }
Junio C Hamanoc14e6ad2014-10-31 20:25:53228span.image img { border-style: none; vertical-align: text-bottom; }
Junio C Hamano103b5722011-01-31 05:03:45229a.image:visited { color: white; }
Junio C Hamano7d06a8a2008-10-20 05:42:33230
231dl {
232 margin-top: 0.8em;
233 margin-bottom: 0.8em;
234}
235dt {
236 margin-top: 0.5em;
237 margin-bottom: 0;
Junio C Hamano103b5722011-01-31 05:03:45238 font-style: normal;
239 color: navy;
Junio C Hamano7d06a8a2008-10-20 05:42:33240}
241dd > *:first-child {
Junio C Hamano103b5722011-01-31 05:03:45242 margin-top: 0.1em;
Junio C Hamano7d06a8a2008-10-20 05:42:33243}
244
245ul, ol {
246 list-style-position: outside;
247}
Junio C Hamano103b5722011-01-31 05:03:45248ol.arabic {
249 list-style-type: decimal;
250}
251ol.loweralpha {
Junio C Hamano7d06a8a2008-10-20 05:42:33252 list-style-type: lower-alpha;
253}
Junio C Hamano103b5722011-01-31 05:03:45254ol.upperalpha {
255 list-style-type: upper-alpha;
256}
257ol.lowerroman {
258 list-style-type: lower-roman;
259}
260ol.upperroman {
261 list-style-type: upper-roman;
262}
263
264div.compact ul, div.compact ol,
265div.compact p, div.compact p,
266div.compact div, div.compact div {
267 margin-top: 0.1em;
268 margin-bottom: 0.1em;
269}
Junio C Hamano7d06a8a2008-10-20 05:42:33270
Junio C Hamano7d06a8a2008-10-20 05:42:33271tfoot {
272 font-weight: bold;
273}
Junio C Hamano103b5722011-01-31 05:03:45274td > div.verse {
275 white-space: pre;
276}
Junio C Hamano103b5722011-01-31 05:03:45277
278div.hdlist {
Junio C Hamano7d06a8a2008-10-20 05:42:33279 margin-top: 0.8em;
280 margin-bottom: 0.8em;
281}
Junio C Hamano103b5722011-01-31 05:03:45282div.hdlist tr {
283 padding-bottom: 15px;
Junio C Hamano7d06a8a2008-10-20 05:42:33284}
Junio C Hamano103b5722011-01-31 05:03:45285dt.hdlist1.strong, td.hdlist1.strong {
286 font-weight: bold;
287}
288td.hdlist1 {
Junio C Hamano7d06a8a2008-10-20 05:42:33289 vertical-align: top;
Junio C Hamano103b5722011-01-31 05:03:45290 font-style: normal;
Junio C Hamano7d06a8a2008-10-20 05:42:33291 padding-right: 0.8em;
Junio C Hamano103b5722011-01-31 05:03:45292 color: navy;
Junio C Hamano7d06a8a2008-10-20 05:42:33293}
Junio C Hamano103b5722011-01-31 05:03:45294td.hdlist2 {
Junio C Hamano7d06a8a2008-10-20 05:42:33295 vertical-align: top;
296}
Junio C Hamano103b5722011-01-31 05:03:45297div.hdlist.compact tr {
298 margin: 0;
299 padding-bottom: 0;
300}
301
302.comment {
303 background: yellow;
304}
Junio C Hamano7d06a8a2008-10-20 05:42:33305
Junio C Hamano7bd050f2011-09-22 06:32:22306.footnote, .footnoteref {
307 font-size: 0.8em;
308}
309
310span.footnote, span.footnoteref {
311 vertical-align: super;
312}
313
314#footnotes {
315 margin: 20px 0 20px 0;
316 padding: 7px 0 0 0;
317}
318
319#footnotes div.footnote {
320 margin: 0 0 5px 0;
321}
322
323#footnotes hr {
324 border: none;
325 border-top: 1px solid silver;
326 height: 1px;
327 text-align: left;
328 margin-left: 0;
329 width: 20%;
330 min-width: 100px;
331}
332
Junio C Hamano9d971152012-12-19 00:43:11333div.colist td {
334 padding-right: 0.5em;
335 padding-bottom: 0.3em;
336 vertical-align: top;
337}
338div.colist td img {
339 margin-top: 0.3em;
Junio C Hamano7d06a8a2008-10-20 05:42:33340}
341
Junio C Hamano9d971152012-12-19 00:43:11342@media print {
343 #footer-badges { display: none; }
344}
345
346#toc {
Junio C Hamano7bd050f2011-09-22 06:32:22347 margin-bottom: 2.5em;
348}
349
Junio C Hamano9d971152012-12-19 00:43:11350#toctitle {
Junio C Hamano7d06a8a2008-10-20 05:42:33351 color: #527bbd;
Junio C Hamano7d06a8a2008-10-20 05:42:33352 font-size: 1.1em;
353 font-weight: bold;
354 margin-top: 1.0em;
355 margin-bottom: 0.1em;
356}
357
Junio C Hamanoc14e6ad2014-10-31 20:25:53358div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
Junio C Hamano7d06a8a2008-10-20 05:42:33359 margin-top: 0;
360 margin-bottom: 0;
361}
362div.toclevel2 {
363 margin-left: 2em;
364 font-size: 0.9em;
365}
366div.toclevel3 {
367 margin-left: 4em;
368 font-size: 0.9em;
369}
370div.toclevel4 {
371 margin-left: 6em;
372 font-size: 0.9em;
373}
Junio C Hamano9d971152012-12-19 00:43:11374
375span.aqua { color: aqua; }
376span.black { color: black; }
377span.blue { color: blue; }
378span.fuchsia { color: fuchsia; }
379span.gray { color: gray; }
380span.green { color: green; }
381span.lime { color: lime; }
382span.maroon { color: maroon; }
383span.navy { color: navy; }
384span.olive { color: olive; }
385span.purple { color: purple; }
386span.red { color: red; }
387span.silver { color: silver; }
388span.teal { color: teal; }
389span.white { color: white; }
390span.yellow { color: yellow; }
391
392span.aqua-background { background: aqua; }
393span.black-background { background: black; }
394span.blue-background { background: blue; }
395span.fuchsia-background { background: fuchsia; }
396span.gray-background { background: gray; }
397span.green-background { background: green; }
398span.lime-background { background: lime; }
399span.maroon-background { background: maroon; }
400span.navy-background { background: navy; }
401span.olive-background { background: olive; }
402span.purple-background { background: purple; }
403span.red-background { background: red; }
404span.silver-background { background: silver; }
405span.teal-background { background: teal; }
406span.white-background { background: white; }
407span.yellow-background { background: yellow; }
408
409span.big { font-size: 2em; }
410span.small { font-size: 0.6em; }
411
412span.underline { text-decoration: underline; }
413span.overline { text-decoration: overline; }
414span.line-through { text-decoration: line-through; }
415
Junio C Hamanoc14e6ad2014-10-31 20:25:53416div.unbreakable { page-break-inside: avoid; }
417
Junio C Hamano9d971152012-12-19 00:43:11418
419/*
420 * xhtml11 specific
421 *
422 * */
423
424div.tableblock {
425 margin-top: 1.0em;
426 margin-bottom: 1.5em;
427}
428div.tableblock > table {
429 border: 3px solid #527bbd;
430}
431thead, p.table.header {
432 font-weight: bold;
433 color: #527bbd;
434}
435p.table {
436 margin-top: 0;
437}
438/* Because the table frame attribute is overriden by CSS in most browsers. */
439div.tableblock > table[frame="void"] {
440 border-style: none;
441}
442div.tableblock > table[frame="hsides"] {
443 border-left-style: none;
444 border-right-style: none;
445}
446div.tableblock > table[frame="vsides"] {
447 border-top-style: none;
448 border-bottom-style: none;
449}
450
451
452/*
453 * html5 specific
454 *
455 * */
456
457table.tableblock {
458 margin-top: 1.0em;
459 margin-bottom: 1.5em;
460}
461thead, p.tableblock.header {
462 font-weight: bold;
463 color: #527bbd;
464}
465p.tableblock {
466 margin-top: 0;
467}
468table.tableblock {
469 border-width: 3px;
470 border-spacing: 0px;
471 border-style: solid;
472 border-color: #527bbd;
473 border-collapse: collapse;
474}
475th.tableblock, td.tableblock {
476 border-width: 1px;
477 padding: 4px;
478 border-style: solid;
479 border-color: #527bbd;
480}
481
482table.tableblock.frame-topbot {
483 border-left-style: hidden;
484 border-right-style: hidden;
485}
486table.tableblock.frame-sides {
487 border-top-style: hidden;
488 border-bottom-style: hidden;
489}
490table.tableblock.frame-none {
491 border-style: hidden;
492}
493
494th.tableblock.halign-left, td.tableblock.halign-left {
495 text-align: left;
496}
497th.tableblock.halign-center, td.tableblock.halign-center {
498 text-align: center;
499}
500th.tableblock.halign-right, td.tableblock.halign-right {
501 text-align: right;
502}
503
504th.tableblock.valign-top, td.tableblock.valign-top {
505 vertical-align: top;
506}
507th.tableblock.valign-middle, td.tableblock.valign-middle {
508 vertical-align: middle;
509}
510th.tableblock.valign-bottom, td.tableblock.valign-bottom {
511 vertical-align: bottom;
512}
513
514
515/*
516 * manpage specific
517 *
518 * */
519
520body.manpage h1 {
Junio C Hamano103b5722011-01-31 05:03:45521 padding-top: 0.5em;
522 padding-bottom: 0.5em;
523 border-top: 2px solid silver;
524 border-bottom: 2px solid silver;
525}
Junio C Hamano9d971152012-12-19 00:43:11526body.manpage h2 {
Junio C Hamano103b5722011-01-31 05:03:45527 border-style: none;
528}
Junio C Hamano9d971152012-12-19 00:43:11529body.manpage div.sectionbody {
530 margin-left: 3em;
Junio C Hamano103b5722011-01-31 05:03:45531}
532
533@media print {
Junio C Hamano9d971152012-12-19 00:43:11534 body.manpage div#toc { display: none; }
Junio C Hamano103b5722011-01-31 05:03:45535}
Junio C Hamanoc14e6ad2014-10-31 20:25:53536
537
Junio C Hamano7d06a8a2008-10-20 05:42:33538</style>
Junio C Hamano7bd050f2011-09-22 06:32:22539<script type="text/javascript">
540/*<![CDATA[*/
Junio C Hamano7bd050f2011-09-22 06:32:22541var asciidoc = { // Namespace.
542
543/////////////////////////////////////////////////////////////////////
544// Table Of Contents generator
545/////////////////////////////////////////////////////////////////////
546
547/* Author: Mihai Bazon, September 2002
548 * http://students.infoiasi.ro/~mishoo
549 *
550 * Table Of Content generator
551 * Version: 0.4
552 *
553 * Feel free to use this script under the terms of the GNU General Public
554 * License, as long as you do not remove or alter this notice.
555 */
556
557 /* modified by Troy D. Hanson, September 2006. License: GPL */
558 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
559
560// toclevels = 1..4.
561toc: function (toclevels) {
562
563 function getText(el) {
564 var text = "";
565 for (var i = el.firstChild; i != null; i = i.nextSibling) {
566 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
567 text += i.data;
568 else if (i.firstChild != null)
569 text += getText(i);
570 }
571 return text;
572 }
573
574 function TocEntry(el, text, toclevel) {
575 this.element = el;
576 this.text = text;
577 this.toclevel = toclevel;
578 }
579
580 function tocEntries(el, toclevels) {
581 var result = new Array;
Junio C Hamanoc14e6ad2014-10-31 20:25:53582 var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
Junio C Hamano7bd050f2011-09-22 06:32:22583 // Function that scans the DOM tree for header elements (the DOM2
584 // nodeIterator API would be a better technique but not supported by all
585 // browsers).
586 var iterate = function (el) {
587 for (var i = el.firstChild; i != null; i = i.nextSibling) {
588 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
589 var mo = re.exec(i.tagName);
590 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
591 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
592 }
593 iterate(i);
594 }
595 }
596 }
597 iterate(el);
598 return result;
599 }
600
601 var toc = document.getElementById("toc");
Junio C Hamano9d971152012-12-19 00:43:11602 if (!toc) {
603 return;
604 }
605
606 // Delete existing TOC entries in case we're reloading the TOC.
607 var tocEntriesToRemove = [];
608 var i;
609 for (i = 0; i < toc.childNodes.length; i++) {
610 var entry = toc.childNodes[i];
Junio C Hamanoc14e6ad2014-10-31 20:25:53611 if (entry.nodeName.toLowerCase() == 'div'
Junio C Hamano9d971152012-12-19 00:43:11612 && entry.getAttribute("class")
613 && entry.getAttribute("class").match(/^toclevel/))
614 tocEntriesToRemove.push(entry);
615 }
616 for (i = 0; i < tocEntriesToRemove.length; i++) {
617 toc.removeChild(tocEntriesToRemove[i]);
618 }
619
620 // Rebuild TOC entries.
Junio C Hamano7bd050f2011-09-22 06:32:22621 var entries = tocEntries(document.getElementById("content"), toclevels);
622 for (var i = 0; i < entries.length; ++i) {
623 var entry = entries[i];
624 if (entry.element.id == "")
625 entry.element.id = "_toc_" + i;
626 var a = document.createElement("a");
627 a.href = "#" + entry.element.id;
628 a.appendChild(document.createTextNode(entry.text));
629 var div = document.createElement("div");
630 div.appendChild(a);
631 div.className = "toclevel" + entry.toclevel;
632 toc.appendChild(div);
633 }
634 if (entries.length == 0)
635 toc.parentNode.removeChild(toc);
636},
637
638
639/////////////////////////////////////////////////////////////////////
640// Footnotes generator
641/////////////////////////////////////////////////////////////////////
642
643/* Based on footnote generation code from:
644 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
645 */
646
647footnotes: function () {
Junio C Hamano9d971152012-12-19 00:43:11648 // Delete existing footnote entries in case we're reloading the footnodes.
649 var i;
Junio C Hamano7bd050f2011-09-22 06:32:22650 var noteholder = document.getElementById("footnotes");
Junio C Hamano9d971152012-12-19 00:43:11651 if (!noteholder) {
652 return;
653 }
654 var entriesToRemove = [];
655 for (i = 0; i < noteholder.childNodes.length; i++) {
656 var entry = noteholder.childNodes[i];
Junio C Hamanoc14e6ad2014-10-31 20:25:53657 if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
Junio C Hamano9d971152012-12-19 00:43:11658 entriesToRemove.push(entry);
659 }
660 for (i = 0; i < entriesToRemove.length; i++) {
661 noteholder.removeChild(entriesToRemove[i]);
662 }
663
664 // Rebuild footnote entries.
665 var cont = document.getElementById("content");
Junio C Hamano7bd050f2011-09-22 06:32:22666 var spans = cont.getElementsByTagName("span");
667 var refs = {};
668 var n = 0;
669 for (i=0; i<spans.length; i++) {
670 if (spans[i].className == "footnote") {
671 n++;
Junio C Hamano9d971152012-12-19 00:43:11672 var note = spans[i].getAttribute("data-note");
673 if (!note) {
674 // Use [\s\S] in place of . so multi-line matches work.
675 // Because JavaScript has no s (dotall) regex flag.
676 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
677 spans[i].innerHTML =
678 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
679 "' title='View footnote' class='footnote'>" + n + "</a>]";
680 spans[i].setAttribute("data-note", note);
681 }
Junio C Hamano7bd050f2011-09-22 06:32:22682 noteholder.innerHTML +=
683 "<div class='footnote' id='_footnote_" + n + "'>" +
684 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
685 n + "</a>. " + note + "</div>";
Junio C Hamano7bd050f2011-09-22 06:32:22686 var id =spans[i].getAttribute("id");
687 if (id != null) refs["#"+id] = n;
688 }
689 }
690 if (n == 0)
691 noteholder.parentNode.removeChild(noteholder);
692 else {
693 // Process footnoterefs.
694 for (i=0; i<spans.length; i++) {
695 if (spans[i].className == "footnoteref") {
696 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
697 href = href.match(/#.*/)[0]; // Because IE return full URL.
698 n = refs[href];
699 spans[i].innerHTML =
700 "[<a href='#_footnote_" + n +
701 "' title='View footnote' class='footnote'>" + n + "</a>]";
702 }
703 }
704 }
Junio C Hamano9d971152012-12-19 00:43:11705},
706
707install: function(toclevels) {
708 var timerId;
709
710 function reinstall() {
711 asciidoc.footnotes();
712 if (toclevels) {
713 asciidoc.toc(toclevels);
714 }
715 }
716
717 function reinstallAndRemoveTimer() {
718 clearInterval(timerId);
719 reinstall();
720 }
721
722 timerId = setInterval(reinstall, 500);
723 if (document.addEventListener)
724 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
725 else
726 window.onload = reinstallAndRemoveTimer;
Junio C Hamano7bd050f2011-09-22 06:32:22727}
728
729}
Junio C Hamano9d971152012-12-19 00:43:11730asciidoc.install();
Junio C Hamano7bd050f2011-09-22 06:32:22731/*]]>*/
732</script>
Junio C Hamano7d06a8a2008-10-20 05:42:33733</head>
Junio C Hamano9d971152012-12-19 00:43:11734<body class="manpage">
Junio C Hamano7d06a8a2008-10-20 05:42:33735<div id="header">
736<h1>
737gitworkflows(7) Manual Page
738</h1>
739<h2>NAME</h2>
740<div class="sectionbody">
741<p>gitworkflows -
Junio C Hamano076ffcc2013-02-06 05:13:21742 An overview of recommended workflows with Git
Junio C Hamano7d06a8a2008-10-20 05:42:33743</p>
744</div>
745</div>
Junio C Hamano7bd050f2011-09-22 06:32:22746<div id="content">
Junio C Hamano9d971152012-12-19 00:43:11747<div class="sect1">
Junio C Hamano103b5722011-01-31 05:03:45748<h2 id="_synopsis">SYNOPSIS</h2>
Junio C Hamano7d06a8a2008-10-20 05:42:33749<div class="sectionbody">
Junio C Hamano15567bc2011-07-23 00:51:59750<div class="verseblock">
Junio C Hamano9d971152012-12-19 00:43:11751<pre class="content">git *</pre>
752<div class="attribution">
Junio C Hamano15567bc2011-07-23 00:51:59753</div></div>
Junio C Hamano7d06a8a2008-10-20 05:42:33754</div>
Junio C Hamano9d971152012-12-19 00:43:11755</div>
756<div class="sect1">
Junio C Hamano7d06a8a2008-10-20 05:42:33757<h2 id="_description">DESCRIPTION</h2>
758<div class="sectionbody">
Junio C Hamano103b5722011-01-31 05:03:45759<div class="paragraph"><p>This document attempts to write down and motivate some of the workflow
Junio C Hamanoc14e6ad2014-10-31 20:25:53760elements used for <code>git.git</code> itself. Many ideas apply in general,
Junio C Hamano7d06a8a2008-10-20 05:42:33761though the full workflow is rarely required for smaller projects with
762fewer people involved.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45763<div class="paragraph"><p>We formulate a set of <em>rules</em> for quick reference, while the prose
Junio C Hamano7d06a8a2008-10-20 05:42:33764tries to motivate each of them. Do not always take them literally;
765you should value good reasons for your actions higher than manpages
766such as this one.</p></div>
767</div>
Junio C Hamano9d971152012-12-19 00:43:11768</div>
769<div class="sect1">
Junio C Hamano7d06a8a2008-10-20 05:42:33770<h2 id="_separate_changes">SEPARATE CHANGES</h2>
771<div class="sectionbody">
Junio C Hamano103b5722011-01-31 05:03:45772<div class="paragraph"><p>As a general rule, you should try to split your changes into small
Junio C Hamano7d06a8a2008-10-20 05:42:33773logical steps, and commit each of them. They should be consistent,
774working independently of any later commits, pass the test suite, etc.
775This makes the review process much easier, and the history much more
776useful for later inspection and analysis, for example with
Junio C Hamanoa28a9202012-06-21 07:08:23777<a href="git-blame.html">git-blame(1)</a> and <a href="git-bisect.html">git-bisect(1)</a>.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45778<div class="paragraph"><p>To achieve this, try to split your work into small steps from the very
Junio C Hamano7d06a8a2008-10-20 05:42:33779beginning. It is always easier to squash a few commits together than
Junio C Hamano103b5722011-01-31 05:03:45780to split one big commit into several. Don&#8217;t be afraid of making too
Junio C Hamano7d06a8a2008-10-20 05:42:33781small or imperfect steps along the way. You can always go back later
Junio C Hamanoc14e6ad2014-10-31 20:25:53782and edit the commits with <code>git rebase --interactive</code> before you
783publish them. You can use <code>git stash save --keep-index</code> to run the
Junio C Hamano7d06a8a2008-10-20 05:42:33784test suite independent of other uncommitted changes; see the EXAMPLES
Junio C Hamanoa28a9202012-06-21 07:08:23785section of <a href="git-stash.html">git-stash(1)</a>.</p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:33786</div>
Junio C Hamano9d971152012-12-19 00:43:11787</div>
788<div class="sect1">
Junio C Hamano7d06a8a2008-10-20 05:42:33789<h2 id="_managing_branches">MANAGING BRANCHES</h2>
790<div class="sectionbody">
Junio C Hamano103b5722011-01-31 05:03:45791<div class="paragraph"><p>There are two main tools that can be used to include changes from one
Junio C Hamanoa28a9202012-06-21 07:08:23792branch on another: <a href="git-merge.html">git-merge(1)</a> and
793<a href="git-cherry-pick.html">git-cherry-pick(1)</a>.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45794<div class="paragraph"><p>Merges have many advantages, so we try to solve as many problems as
Junio C Hamano7d06a8a2008-10-20 05:42:33795possible with merges alone. Cherry-picking is still occasionally
796useful; see "Merging upwards" below for an example.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45797<div class="paragraph"><p>Most importantly, merging works at the branch level, while
Junio C Hamano7d06a8a2008-10-20 05:42:33798cherry-picking works at the commit level. This means that a merge can
799carry over the changes from 1, 10, or 1000 commits with equal ease,
800which in turn means the workflow scales much better to a large number
801of contributors (and contributions). Merges are also easier to
802understand because a merge commit is a "promise" that all changes from
803all its parents are now included.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45804<div class="paragraph"><p>There is a tradeoff of course: merges require a more careful branch
Junio C Hamano7d06a8a2008-10-20 05:42:33805management. The following subsections discuss the important points.</p></div>
Junio C Hamano9d971152012-12-19 00:43:11806<div class="sect2">
807<h3 id="_graduation">Graduation</h3>
Junio C Hamano103b5722011-01-31 05:03:45808<div class="paragraph"><p>As a given feature goes from experimental to stable, it also
Junio C Hamano7d06a8a2008-10-20 05:42:33809"graduates" between the corresponding branches of the software.
Junio C Hamanoc14e6ad2014-10-31 20:25:53810<code>git.git</code> uses the following <em>integration branches</em>:</p></div>
Junio C Hamano103b5722011-01-31 05:03:45811<div class="ulist"><ul>
Junio C Hamano7d06a8a2008-10-20 05:42:33812<li>
813<p>
814<em>maint</em> tracks the commits that should go into the next "maintenance
815 release", i.e., update of the last released stable version;
816</p>
817</li>
818<li>
819<p>
820<em>master</em> tracks the commits that should go into the next release;
821</p>
822</li>
823<li>
824<p>
825<em>next</em> is intended as a testing branch for topics being tested for
826 stability for master.
827</p>
828</li>
829</ul></div>
Junio C Hamano103b5722011-01-31 05:03:45830<div class="paragraph"><p>There is a fourth official branch that is used slightly differently:</p></div>
831<div class="ulist"><ul>
Junio C Hamano7d06a8a2008-10-20 05:42:33832<li>
833<p>
834<em>pu</em> (proposed updates) is an integration branch for things that are
835 not quite ready for inclusion yet (see "Integration Branches"
836 below).
837</p>
838</li>
839</ul></div>
Junio C Hamano103b5722011-01-31 05:03:45840<div class="paragraph"><p>Each of the four branches is usually a direct descendant of the one
Junio C Hamano7d06a8a2008-10-20 05:42:33841above it.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45842<div class="paragraph"><p>Conceptually, the feature enters at an unstable branch (usually <em>next</em>
Junio C Hamano7d06a8a2008-10-20 05:42:33843or <em>pu</em>), and "graduates" to <em>master</em> for the next release once it is
844considered stable enough.</p></div>
Junio C Hamano9d971152012-12-19 00:43:11845</div>
846<div class="sect2">
847<h3 id="_merging_upwards">Merging upwards</h3>
Junio C Hamano103b5722011-01-31 05:03:45848<div class="paragraph"><p>The "downwards graduation" discussed above cannot be done by actually
Junio C Hamano7d06a8a2008-10-20 05:42:33849merging downwards, however, since that would merge <em>all</em> changes on
850the unstable branch into the stable one. Hence the following:</p></div>
851<div class="exampleblock">
852<div class="title">Rule: Merge upwards</div>
Junio C Hamano9d971152012-12-19 00:43:11853<div class="content">
Junio C Hamano103b5722011-01-31 05:03:45854<div class="paragraph"><p>Always commit your fixes to the oldest supported branch that require
Junio C Hamano7d06a8a2008-10-20 05:42:33855them. Then (periodically) merge the integration branches upwards into each
856other.</p></div>
857</div></div>
Junio C Hamano103b5722011-01-31 05:03:45858<div class="paragraph"><p>This gives a very controlled flow of fixes. If you notice that you
Junio C Hamano7d06a8a2008-10-20 05:42:33859have applied a fix to e.g. <em>master</em> that is also required in <em>maint</em>,
Junio C Hamanoa28a9202012-06-21 07:08:23860you will need to cherry-pick it (using <a href="git-cherry-pick.html">git-cherry-pick(1)</a>)
Junio C Hamano7d06a8a2008-10-20 05:42:33861downwards. This will happen a few times and is nothing to worry about
862unless you do it very frequently.</p></div>
Junio C Hamano9d971152012-12-19 00:43:11863</div>
864<div class="sect2">
865<h3 id="_topic_branches">Topic branches</h3>
Junio C Hamano103b5722011-01-31 05:03:45866<div class="paragraph"><p>Any nontrivial feature will require several patches to implement, and
Junio C Hamano7d06a8a2008-10-20 05:42:33867may get extra bugfixes or improvements during its lifetime.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45868<div class="paragraph"><p>Committing everything directly on the integration branches leads to many
Junio C Hamano7d06a8a2008-10-20 05:42:33869problems: Bad commits cannot be undone, so they must be reverted one
870by one, which creates confusing histories and further error potential
871when you forget to revert part of a group of changes. Working in
872parallel mixes up the changes, creating further confusion.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45873<div class="paragraph"><p>Use of "topic branches" solves these problems. The name is pretty
Junio C Hamano7d06a8a2008-10-20 05:42:33874self explanatory, with a caveat that comes from the "merge upwards"
875rule above:</p></div>
876<div class="exampleblock">
877<div class="title">Rule: Topic branches</div>
Junio C Hamano9d971152012-12-19 00:43:11878<div class="content">
Junio C Hamano103b5722011-01-31 05:03:45879<div class="paragraph"><p>Make a side branch for every topic (feature, bugfix, &#8230;). Fork it off
Junio C Hamano7d06a8a2008-10-20 05:42:33880at the oldest integration branch that you will eventually want to merge it
881into.</p></div>
882</div></div>
Junio C Hamano103b5722011-01-31 05:03:45883<div class="paragraph"><p>Many things can then be done very naturally:</p></div>
884<div class="ulist"><ul>
Junio C Hamano7d06a8a2008-10-20 05:42:33885<li>
886<p>
887To get the feature/bugfix into an integration branch, simply merge
888 it. If the topic has evolved further in the meantime, merge again.
889 (Note that you do not necessarily have to merge it to the oldest
890 integration branch first. For example, you can first merge a bugfix
891 to <em>next</em>, give it some testing time, and merge to <em>maint</em> when you
892 know it is stable.)
893</p>
894</li>
895<li>
896<p>
897If you find you need new features from the branch <em>other</em> to continue
898 working on your topic, merge <em>other</em> to <em>topic</em>. (However, do not
899 do this "just habitually", see below.)
900</p>
901</li>
902<li>
903<p>
904If you find you forked off the wrong branch and want to move it
Junio C Hamanoa28a9202012-06-21 07:08:23905 "back in time", use <a href="git-rebase.html">git-rebase(1)</a>.
Junio C Hamano7d06a8a2008-10-20 05:42:33906</p>
907</li>
908</ul></div>
Junio C Hamano103b5722011-01-31 05:03:45909<div class="paragraph"><p>Note that the last point clashes with the other two: a topic that has
Junio C Hamano7d06a8a2008-10-20 05:42:33910been merged elsewhere should not be rebased. See the section on
Junio C Hamanoa28a9202012-06-21 07:08:23911RECOVERING FROM UPSTREAM REBASE in <a href="git-rebase.html">git-rebase(1)</a>.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45912<div class="paragraph"><p>We should point out that "habitually" (regularly for no real reason)
913merging an integration branch into your topics&#8201;&#8212;&#8201;and by extension,
914merging anything upstream into anything downstream on a regular basis&#8201;&#8212;&#8201;is frowned upon:</p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:33915<div class="exampleblock">
916<div class="title">Rule: Merge to downstream only at well-defined points</div>
Junio C Hamano9d971152012-12-19 00:43:11917<div class="content">
Junio C Hamano103b5722011-01-31 05:03:45918<div class="paragraph"><p>Do not merge to downstream except with a good reason: upstream API
Junio C Hamano7d06a8a2008-10-20 05:42:33919changes affect your branch; your branch no longer merges to upstream
920cleanly; etc.</p></div>
921</div></div>
Junio C Hamano103b5722011-01-31 05:03:45922<div class="paragraph"><p>Otherwise, the topic that was merged to suddenly contains more than a
Junio C Hamano7d06a8a2008-10-20 05:42:33923single (well-separated) change. The many resulting small merges will
924greatly clutter up history. Anyone who later investigates the history
925of a file will have to find out whether that merge affected the topic
926in development. An upstream might even inadvertently be merged into a
927"more stable" branch. And so on.</p></div>
Junio C Hamano9d971152012-12-19 00:43:11928</div>
929<div class="sect2">
930<h3 id="_throw_away_integration">Throw-away integration</h3>
Junio C Hamano103b5722011-01-31 05:03:45931<div class="paragraph"><p>If you followed the last paragraph, you will now have many small topic
Junio C Hamano7d06a8a2008-10-20 05:42:33932branches, and occasionally wonder how they interact. Perhaps the
933result of merging them does not even work? But on the other hand, we
934want to avoid merging them anywhere "stable" because such merges
935cannot easily be undone.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45936<div class="paragraph"><p>The solution, of course, is to make a merge that we can undo: merge
Junio C Hamano7d06a8a2008-10-20 05:42:33937into a throw-away branch.</p></div>
938<div class="exampleblock">
939<div class="title">Rule: Throw-away integration branches</div>
Junio C Hamano9d971152012-12-19 00:43:11940<div class="content">
Junio C Hamano103b5722011-01-31 05:03:45941<div class="paragraph"><p>To test the interaction of several topics, merge them into a
Junio C Hamano7d06a8a2008-10-20 05:42:33942throw-away branch. You must never base any work on such a branch!</p></div>
943</div></div>
Junio C Hamano103b5722011-01-31 05:03:45944<div class="paragraph"><p>If you make it (very) clear that this branch is going to be deleted
Junio C Hamano7d06a8a2008-10-20 05:42:33945right after the testing, you can even publish this branch, for example
946to give the testers a chance to work with it, or other developers a
Junio C Hamanoc14e6ad2014-10-31 20:25:53947chance to see if their in-progress work will be compatible. <code>git.git</code>
Junio C Hamano7d06a8a2008-10-20 05:42:33948has such an official throw-away integration branch called <em>pu</em>.</p></div>
Junio C Hamano9d971152012-12-19 00:43:11949</div>
950<div class="sect2">
951<h3 id="_branch_management_for_a_release">Branch management for a release</h3>
Junio C Hamano103b5722011-01-31 05:03:45952<div class="paragraph"><p>Assuming you are using the merge approach discussed above, when you
Junio C Hamano3b70d3c2009-11-21 17:37:37953are releasing your project you will need to do some additional branch
954management work.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45955<div class="paragraph"><p>A feature release is created from the <em>master</em> branch, since <em>master</em>
Junio C Hamano3b70d3c2009-11-21 17:37:37956tracks the commits that should go into the next feature release.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45957<div class="paragraph"><p>The <em>master</em> branch is supposed to be a superset of <em>maint</em>. If this
Junio C Hamano3b70d3c2009-11-21 17:37:37958condition does not hold, then <em>maint</em> contains some commits that
959are not included on <em>master</em>. The fixes represented by those commits
960will therefore not be included in your feature release.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45961<div class="paragraph"><p>To verify that <em>master</em> is indeed a superset of <em>maint</em>, use git log:</p></div>
Junio C Hamano3b70d3c2009-11-21 17:37:37962<div class="exampleblock">
963<div class="title">Recipe: Verify <em>master</em> is a superset of <em>maint</em></div>
Junio C Hamano9d971152012-12-19 00:43:11964<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53965<div class="paragraph"><p><code>git log master..maint</code></p></div>
Junio C Hamano3b70d3c2009-11-21 17:37:37966</div></div>
Junio C Hamano103b5722011-01-31 05:03:45967<div class="paragraph"><p>This command should not list any commits. Otherwise, check out
Junio C Hamano3b70d3c2009-11-21 17:37:37968<em>master</em> and merge <em>maint</em> into it.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45969<div class="paragraph"><p>Now you can proceed with the creation of the feature release. Apply a
Junio C Hamano3b70d3c2009-11-21 17:37:37970tag to the tip of <em>master</em> indicating the release version:</p></div>
971<div class="exampleblock">
972<div class="title">Recipe: Release tagging</div>
Junio C Hamano9d971152012-12-19 00:43:11973<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53974<div class="paragraph"><p><code>git tag -s -m "Git X.Y.Z" vX.Y.Z master</code></p></div>
Junio C Hamano3b70d3c2009-11-21 17:37:37975</div></div>
Junio C Hamano076ffcc2013-02-06 05:13:21976<div class="paragraph"><p>You need to push the new tag to a public Git server (see
Junio C Hamano3b70d3c2009-11-21 17:37:37977"DISTRIBUTED WORKFLOWS" below). This makes the tag available to
978others tracking your project. The push could also trigger a
979post-update hook to perform release-related items such as building
980release tarballs and preformatted documentation pages.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45981<div class="paragraph"><p>Similarly, for a maintenance release, <em>maint</em> is tracking the commits
Junio C Hamano3b70d3c2009-11-21 17:37:37982to be released. Therefore, in the steps above simply tag and push
983<em>maint</em> rather than <em>master</em>.</p></div>
Junio C Hamano9d971152012-12-19 00:43:11984</div>
985<div class="sect2">
986<h3 id="_maintenance_branch_management_after_a_feature_release">Maintenance branch management after a feature release</h3>
Junio C Hamano103b5722011-01-31 05:03:45987<div class="paragraph"><p>After a feature release, you need to manage your maintenance branches.</p></div>
988<div class="paragraph"><p>First, if you wish to continue to release maintenance fixes for the
Junio C Hamano3b70d3c2009-11-21 17:37:37989feature release made before the recent one, then you must create
990another branch to track commits for that previous release.</p></div>
Junio C Hamano103b5722011-01-31 05:03:45991<div class="paragraph"><p>To do this, the current maintenance branch is copied to another branch
Junio C Hamano3b70d3c2009-11-21 17:37:37992named with the previous release version number (e.g. maint-X.Y.(Z-1)
993where X.Y.Z is the current release).</p></div>
994<div class="exampleblock">
995<div class="title">Recipe: Copy maint</div>
Junio C Hamano9d971152012-12-19 00:43:11996<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53997<div class="paragraph"><p><code>git branch maint-X.Y.(Z-1) maint</code></p></div>
Junio C Hamano3b70d3c2009-11-21 17:37:37998</div></div>
Junio C Hamano103b5722011-01-31 05:03:45999<div class="paragraph"><p>The <em>maint</em> branch should now be fast-forwarded to the newly released
Junio C Hamano3b70d3c2009-11-21 17:37:371000code so that maintenance fixes can be tracked for the current release:</p></div>
1001<div class="exampleblock">
1002<div class="title">Recipe: Update maint to new release</div>
Junio C Hamano9d971152012-12-19 00:43:111003<div class="content">
Junio C Hamano103b5722011-01-31 05:03:451004<div class="ulist"><ul>
Junio C Hamano3b70d3c2009-11-21 17:37:371005<li>
1006<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:531007<code>git checkout maint</code>
Junio C Hamano3b70d3c2009-11-21 17:37:371008</p>
1009</li>
1010<li>
1011<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:531012<code>git merge --ff-only master</code>
Junio C Hamano3b70d3c2009-11-21 17:37:371013</p>
1014</li>
1015</ul></div>
1016</div></div>
Junio C Hamano103b5722011-01-31 05:03:451017<div class="paragraph"><p>If the merge fails because it is not a fast-forward, then it is
Junio C Hamano3b70d3c2009-11-21 17:37:371018possible some fixes on <em>maint</em> were missed in the feature release.
1019This will not happen if the content of the branches was verified as
1020described in the previous section.</p></div>
Junio C Hamano9d971152012-12-19 00:43:111021</div>
1022<div class="sect2">
1023<h3 id="_branch_management_for_next_and_pu_after_a_feature_release">Branch management for next and pu after a feature release</h3>
Junio C Hamano103b5722011-01-31 05:03:451024<div class="paragraph"><p>After a feature release, the integration branch <em>next</em> may optionally be
Junio C Hamano3b70d3c2009-11-21 17:37:371025rewound and rebuilt from the tip of <em>master</em> using the surviving
1026topics on <em>next</em>:</p></div>
1027<div class="exampleblock">
1028<div class="title">Recipe: Rewind and rebuild next</div>
Junio C Hamano9d971152012-12-19 00:43:111029<div class="content">
Junio C Hamano103b5722011-01-31 05:03:451030<div class="ulist"><ul>
Junio C Hamano3b70d3c2009-11-21 17:37:371031<li>
1032<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:531033<code>git checkout next</code>
Junio C Hamano3b70d3c2009-11-21 17:37:371034</p>
1035</li>
1036<li>
1037<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:531038<code>git reset --hard master</code>
Junio C Hamano3b70d3c2009-11-21 17:37:371039</p>
1040</li>
1041<li>
1042<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:531043<code>git merge ai/topic_in_next1</code>
Junio C Hamano3b70d3c2009-11-21 17:37:371044</p>
1045</li>
1046<li>
1047<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:531048<code>git merge ai/topic_in_next2</code>
Junio C Hamano3b70d3c2009-11-21 17:37:371049</p>
1050</li>
1051<li>
1052<p>
1053&#8230;
1054</p>
1055</li>
1056</ul></div>
1057</div></div>
Junio C Hamano103b5722011-01-31 05:03:451058<div class="paragraph"><p>The advantage of doing this is that the history of <em>next</em> will be
Junio C Hamano3b70d3c2009-11-21 17:37:371059clean. For example, some topics merged into <em>next</em> may have initially
1060looked promising, but were later found to be undesirable or premature.
1061In such a case, the topic is reverted out of <em>next</em> but the fact
1062remains in the history that it was once merged and reverted. By
1063recreating <em>next</em>, you give another incarnation of such topics a clean
1064slate to retry, and a feature release is a good point in history to do
1065so.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451066<div class="paragraph"><p>If you do this, then you should make a public announcement indicating
Junio C Hamano3b70d3c2009-11-21 17:37:371067that <em>next</em> was rewound and rebuilt.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451068<div class="paragraph"><p>The same rewind and rebuild process may be followed for <em>pu</em>. A public
Junio C Hamano3b70d3c2009-11-21 17:37:371069announcement is not necessary since <em>pu</em> is a throw-away branch, as
1070described above.</p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331071</div>
Junio C Hamano9d971152012-12-19 00:43:111072</div>
1073</div>
1074<div class="sect1">
Junio C Hamano7d06a8a2008-10-20 05:42:331075<h2 id="_distributed_workflows">DISTRIBUTED WORKFLOWS</h2>
1076<div class="sectionbody">
Junio C Hamano103b5722011-01-31 05:03:451077<div class="paragraph"><p>After the last section, you should know how to manage topics. In
Junio C Hamano7d06a8a2008-10-20 05:42:331078general, you will not be the only person working on the project, so
1079you will have to share your work.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451080<div class="paragraph"><p>Roughly speaking, there are two important workflows: merge and patch.
Junio C Hamano7d06a8a2008-10-20 05:42:331081The important difference is that the merge workflow can propagate full
1082history, including merges, while patches cannot. Both workflows can
Junio C Hamanoc14e6ad2014-10-31 20:25:531083be used in parallel: in <code>git.git</code>, only subsystem maintainers use
Junio C Hamano7d06a8a2008-10-20 05:42:331084the merge workflow, while everyone else sends patches.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451085<div class="paragraph"><p>Note that the maintainer(s) may impose restrictions, such as
Junio C Hamano7d06a8a2008-10-20 05:42:331086"Signed-off-by" requirements, that all commits/patches submitted for
Junio C Hamano103b5722011-01-31 05:03:451087inclusion must adhere to. Consult your project&#8217;s documentation for
Junio C Hamano7d06a8a2008-10-20 05:42:331088more information.</p></div>
Junio C Hamano9d971152012-12-19 00:43:111089<div class="sect2">
1090<h3 id="_merge_workflow">Merge workflow</h3>
Junio C Hamano103b5722011-01-31 05:03:451091<div class="paragraph"><p>The merge workflow works by copying branches between upstream and
Junio C Hamano7d06a8a2008-10-20 05:42:331092downstream. Upstream can merge contributions into the official
1093history; downstream base their work on the official history.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451094<div class="paragraph"><p>There are three main tools that can be used for this:</p></div>
1095<div class="ulist"><ul>
Junio C Hamano7d06a8a2008-10-20 05:42:331096<li>
1097<p>
Junio C Hamanoa28a9202012-06-21 07:08:231098<a href="git-push.html">git-push(1)</a> copies your branches to a remote repository,
Junio C Hamano7d06a8a2008-10-20 05:42:331099 usually to one that can be read by all involved parties;
1100</p>
1101</li>
1102<li>
1103<p>
Junio C Hamanoa28a9202012-06-21 07:08:231104<a href="git-fetch.html">git-fetch(1)</a> that copies remote branches to your repository;
Junio C Hamano7d06a8a2008-10-20 05:42:331105 and
1106</p>
1107</li>
1108<li>
1109<p>
Junio C Hamanoa28a9202012-06-21 07:08:231110<a href="git-pull.html">git-pull(1)</a> that does fetch and merge in one go.
Junio C Hamano7d06a8a2008-10-20 05:42:331111</p>
1112</li>
1113</ul></div>
Junio C Hamano103b5722011-01-31 05:03:451114<div class="paragraph"><p>Note the last point. Do <em>not</em> use <em>git pull</em> unless you actually want
Junio C Hamano7d06a8a2008-10-20 05:42:331115to merge the remote branch.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451116<div class="paragraph"><p>Getting changes out is easy:</p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331117<div class="exampleblock">
1118<div class="title">Recipe: Push/pull: Publishing branches/topics</div>
Junio C Hamano9d971152012-12-19 00:43:111119<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531120<div class="paragraph"><p><code>git push &lt;remote&gt; &lt;branch&gt;</code> and tell everyone where they can fetch
Junio C Hamano7d06a8a2008-10-20 05:42:331121from.</p></div>
1122</div></div>
Junio C Hamano103b5722011-01-31 05:03:451123<div class="paragraph"><p>You will still have to tell people by other means, such as mail. (Git
Junio C Hamanoa28a9202012-06-21 07:08:231124provides the <a href="git-request-pull.html">git-request-pull(1)</a> to send preformatted pull
Junio C Hamano7d06a8a2008-10-20 05:42:331125requests to upstream maintainers to simplify this task.)</p></div>
Junio C Hamano103b5722011-01-31 05:03:451126<div class="paragraph"><p>If you just want to get the newest copies of the integration branches,
Junio C Hamano7d06a8a2008-10-20 05:42:331127staying up to date is easy too:</p></div>
1128<div class="exampleblock">
1129<div class="title">Recipe: Push/pull: Staying up to date</div>
Junio C Hamano9d971152012-12-19 00:43:111130<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531131<div class="paragraph"><p>Use <code>git fetch &lt;remote&gt;</code> or <code>git remote update</code> to stay up to date.</p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331132</div></div>
Junio C Hamano103b5722011-01-31 05:03:451133<div class="paragraph"><p>Then simply fork your topic branches from the stable remotes as
Junio C Hamano7d06a8a2008-10-20 05:42:331134explained earlier.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451135<div class="paragraph"><p>If you are a maintainer and would like to merge other people&#8217;s topic
Junio C Hamano7d06a8a2008-10-20 05:42:331136branches to the integration branches, they will typically send a
1137request to do so by mail. Such a request looks like</p></div>
1138<div class="listingblock">
1139<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531140<pre><code>Please pull from
1141 &lt;url&gt; &lt;branch&gt;</code></pre>
Junio C Hamano7d06a8a2008-10-20 05:42:331142</div></div>
Junio C Hamano103b5722011-01-31 05:03:451143<div class="paragraph"><p>In that case, <em>git pull</em> can do the fetch and merge in one go, as
Junio C Hamano7d06a8a2008-10-20 05:42:331144follows.</p></div>
1145<div class="exampleblock">
1146<div class="title">Recipe: Push/pull: Merging remote topics</div>
Junio C Hamano9d971152012-12-19 00:43:111147<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531148<div class="paragraph"><p><code>git pull &lt;url&gt; &lt;branch&gt;</code></p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331149</div></div>
Junio C Hamano103b5722011-01-31 05:03:451150<div class="paragraph"><p>Occasionally, the maintainer may get merge conflicts when he tries to
Junio C Hamano7d06a8a2008-10-20 05:42:331151pull changes from downstream. In this case, he can ask downstream to
1152do the merge and resolve the conflicts themselves (perhaps they will
1153know better how to resolve them). It is one of the rare cases where
1154downstream <em>should</em> merge from upstream.</p></div>
Junio C Hamano9d971152012-12-19 00:43:111155</div>
1156<div class="sect2">
1157<h3 id="_patch_workflow">Patch workflow</h3>
Junio C Hamano103b5722011-01-31 05:03:451158<div class="paragraph"><p>If you are a contributor that sends changes upstream in the form of
Junio C Hamano7d06a8a2008-10-20 05:42:331159emails, you should use topic branches as usual (see above). Then use
Junio C Hamanoa28a9202012-06-21 07:08:231160<a href="git-format-patch.html">git-format-patch(1)</a> to generate the corresponding emails
Junio C Hamano7d06a8a2008-10-20 05:42:331161(highly recommended over manually formatting them because it makes the
Junio C Hamano103b5722011-01-31 05:03:451162maintainer&#8217;s life easier).</p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331163<div class="exampleblock">
1164<div class="title">Recipe: format-patch/am: Publishing branches/topics</div>
Junio C Hamano9d971152012-12-19 00:43:111165<div class="content">
Junio C Hamano103b5722011-01-31 05:03:451166<div class="ulist"><ul>
Junio C Hamano7d06a8a2008-10-20 05:42:331167<li>
1168<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:531169<code>git format-patch -M upstream..topic</code> to turn them into preformatted
Junio C Hamano7d06a8a2008-10-20 05:42:331170 patch files
1171</p>
1172</li>
1173<li>
1174<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:531175<code>git send-email --to=&lt;recipient&gt; &lt;patches&gt;</code>
Junio C Hamano7d06a8a2008-10-20 05:42:331176</p>
1177</li>
1178</ul></div>
1179</div></div>
Junio C Hamanoa28a9202012-06-21 07:08:231180<div class="paragraph"><p>See the <a href="git-format-patch.html">git-format-patch(1)</a> and <a href="git-send-email.html">git-send-email(1)</a>
Junio C Hamano7d06a8a2008-10-20 05:42:331181manpages for further usage notes.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451182<div class="paragraph"><p>If the maintainer tells you that your patch no longer applies to the
Junio C Hamano7d06a8a2008-10-20 05:42:331183current upstream, you will have to rebase your topic (you cannot use a
1184merge because you cannot format-patch merges):</p></div>
1185<div class="exampleblock">
1186<div class="title">Recipe: format-patch/am: Keeping topics up to date</div>
Junio C Hamano9d971152012-12-19 00:43:111187<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531188<div class="paragraph"><p><code>git pull --rebase &lt;url&gt; &lt;branch&gt;</code></p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331189</div></div>
Junio C Hamano103b5722011-01-31 05:03:451190<div class="paragraph"><p>You can then fix the conflicts during the rebase. Presumably you have
Junio C Hamano7d06a8a2008-10-20 05:42:331191not published your topic other than by mail, so rebasing it is not a
1192problem.</p></div>
Junio C Hamano103b5722011-01-31 05:03:451193<div class="paragraph"><p>If you receive such a patch series (as maintainer, or perhaps as a
Junio C Hamano7d06a8a2008-10-20 05:42:331194reader of the mailing list it was sent to), save the mails to files,
Junio C Hamano1aa40d22010-01-21 17:46:431195create a new topic branch and use <em>git am</em> to import the commits:</p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331196<div class="exampleblock">
1197<div class="title">Recipe: format-patch/am: Importing patches</div>
Junio C Hamano9d971152012-12-19 00:43:111198<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531199<div class="paragraph"><p><code>git am &lt; patch</code></p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331200</div></div>
Junio C Hamano103b5722011-01-31 05:03:451201<div class="paragraph"><p>One feature worth pointing out is the three-way merge, which can help
Junio C Hamanoc14e6ad2014-10-31 20:25:531202if you get conflicts: <code>git am -3</code> will use index information contained
Junio C Hamanoa28a9202012-06-21 07:08:231203in patches to figure out the merge base. See <a href="git-am.html">git-am(1)</a> for
Junio C Hamano7d06a8a2008-10-20 05:42:331204other options.</p></div>
1205</div>
Junio C Hamano9d971152012-12-19 00:43:111206</div>
1207</div>
1208<div class="sect1">
Junio C Hamano7d06a8a2008-10-20 05:42:331209<h2 id="_see_also">SEE ALSO</h2>
1210<div class="sectionbody">
Junio C Hamanoa28a9202012-06-21 07:08:231211<div class="paragraph"><p><a href="gittutorial.html">gittutorial(7)</a>,
1212<a href="git-push.html">git-push(1)</a>,
1213<a href="git-pull.html">git-pull(1)</a>,
1214<a href="git-merge.html">git-merge(1)</a>,
1215<a href="git-rebase.html">git-rebase(1)</a>,
1216<a href="git-format-patch.html">git-format-patch(1)</a>,
1217<a href="git-send-email.html">git-send-email(1)</a>,
1218<a href="git-am.html">git-am(1)</a></p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331219</div>
Junio C Hamano9d971152012-12-19 00:43:111220</div>
1221<div class="sect1">
Junio C Hamano7d06a8a2008-10-20 05:42:331222<h2 id="_git">GIT</h2>
1223<div class="sectionbody">
Junio C Hamanoa28a9202012-06-21 07:08:231224<div class="paragraph"><p>Part of the <a href="git.html">git(1)</a> suite.</p></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331225</div>
Junio C Hamano7bd050f2011-09-22 06:32:221226</div>
Junio C Hamano9d971152012-12-19 00:43:111227</div>
Junio C Hamano7bd050f2011-09-22 06:32:221228<div id="footnotes"><hr /></div>
Junio C Hamano7d06a8a2008-10-20 05:42:331229<div id="footer">
1230<div id="footer-text">
Junio C Hamano683a8612013-08-23 20:50:091231Last updated 2013-08-20 08:40:27 PDT
Junio C Hamano7d06a8a2008-10-20 05:42:331232</div>
1233</div>
1234</body>
1235</html>