Autogenerated HTML docs for v1.7.5
[git/jnareb-git.git] / howto / using-merge-subtree.html
blob6125957afb93c49552dd0ab4438f7cceb846d518
1 <!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>
5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6 <meta name="generator" content="AsciiDoc 8.4.5" />
7 <title>How to use the subtree merge strategy</title>
8 <style type="text/css">
9 /* Debug borders */
10 p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
12 border: 1px solid red;
16 body {
17 margin: 1em 5% 1em 5%;
20 a {
21 color: blue;
22 text-decoration: underline;
24 a:visited {
25 color: fuchsia;
28 em {
29 font-style: italic;
30 color: navy;
33 strong {
34 font-weight: bold;
35 color: #083194;
38 tt {
39 color: navy;
42 h1, h2, h3, h4, h5, h6 {
43 color: #527bbd;
44 font-family: sans-serif;
45 margin-top: 1.2em;
46 margin-bottom: 0.5em;
47 line-height: 1.3;
50 h1, h2, h3 {
51 border-bottom: 2px solid silver;
53 h2 {
54 padding-top: 0.5em;
56 h3 {
57 float: left;
59 h3 + * {
60 clear: left;
63 div.sectionbody {
64 font-family: serif;
65 margin-left: 0;
68 hr {
69 border: 1px solid silver;
72 p {
73 margin-top: 0.5em;
74 margin-bottom: 0.5em;
77 ul, ol, li > p {
78 margin-top: 0;
81 pre {
82 padding: 0;
83 margin: 0;
86 span#author {
87 color: #527bbd;
88 font-family: sans-serif;
89 font-weight: bold;
90 font-size: 1.1em;
92 span#email {
94 span#revnumber, span#revdate, span#revremark {
95 font-family: sans-serif;
98 div#footer {
99 font-family: sans-serif;
100 font-size: small;
101 border-top: 2px solid silver;
102 padding-top: 0.5em;
103 margin-top: 4.0em;
105 div#footer-text {
106 float: left;
107 padding-bottom: 0.5em;
109 div#footer-badges {
110 float: right;
111 padding-bottom: 0.5em;
114 div#preamble {
115 margin-top: 1.5em;
116 margin-bottom: 1.5em;
118 div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
119 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
120 div.admonitionblock {
121 margin-top: 1.5em;
122 margin-bottom: 1.5em;
124 div.admonitionblock {
125 margin-top: 2.5em;
126 margin-bottom: 2.5em;
129 div.content { /* Block element content. */
130 padding: 0;
133 /* Block element titles. */
134 div.title, caption.title {
135 color: #527bbd;
136 font-family: sans-serif;
137 font-weight: bold;
138 text-align: left;
139 margin-top: 1.0em;
140 margin-bottom: 0.5em;
142 div.title + * {
143 margin-top: 0;
146 td div.title:first-child {
147 margin-top: 0.0em;
149 div.content div.title:first-child {
150 margin-top: 0.0em;
152 div.content + div.title {
153 margin-top: 0.0em;
156 div.sidebarblock > div.content {
157 background: #ffffee;
158 border: 1px solid silver;
159 padding: 0.5em;
162 div.listingblock > div.content {
163 border: 1px solid silver;
164 background: #f4f4f4;
165 padding: 0.5em;
168 div.quoteblock {
169 padding-left: 2.0em;
170 margin-right: 10%;
172 div.quoteblock > div.attribution {
173 padding-top: 0.5em;
174 text-align: right;
177 div.verseblock {
178 padding-left: 2.0em;
179 margin-right: 10%;
181 div.verseblock > div.content {
182 white-space: pre;
184 div.verseblock > div.attribution {
185 padding-top: 0.75em;
186 text-align: left;
188 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
189 div.verseblock + div.attribution {
190 text-align: left;
193 div.admonitionblock .icon {
194 vertical-align: top;
195 font-size: 1.1em;
196 font-weight: bold;
197 text-decoration: underline;
198 color: #527bbd;
199 padding-right: 0.5em;
201 div.admonitionblock td.content {
202 padding-left: 0.5em;
203 border-left: 2px solid silver;
206 div.exampleblock > div.content {
207 border-left: 2px solid silver;
208 padding: 0.5em;
211 div.imageblock div.content { padding-left: 0; }
212 span.image img { border-style: none; }
213 a.image:visited { color: white; }
215 dl {
216 margin-top: 0.8em;
217 margin-bottom: 0.8em;
219 dt {
220 margin-top: 0.5em;
221 margin-bottom: 0;
222 font-style: normal;
223 color: navy;
225 dd > *:first-child {
226 margin-top: 0.1em;
229 ul, ol {
230 list-style-position: outside;
232 ol.arabic {
233 list-style-type: decimal;
235 ol.loweralpha {
236 list-style-type: lower-alpha;
238 ol.upperalpha {
239 list-style-type: upper-alpha;
241 ol.lowerroman {
242 list-style-type: lower-roman;
244 ol.upperroman {
245 list-style-type: upper-roman;
248 div.compact ul, div.compact ol,
249 div.compact p, div.compact p,
250 div.compact div, div.compact div {
251 margin-top: 0.1em;
252 margin-bottom: 0.1em;
255 div.tableblock > table {
256 border: 3px solid #527bbd;
258 thead {
259 font-family: sans-serif;
260 font-weight: bold;
262 tfoot {
263 font-weight: bold;
265 td > div.verse {
266 white-space: pre;
268 p.table {
269 margin-top: 0;
271 /* Because the table frame attribute is overriden by CSS in most browsers. */
272 div.tableblock > table[frame="void"] {
273 border-style: none;
275 div.tableblock > table[frame="hsides"] {
276 border-left-style: none;
277 border-right-style: none;
279 div.tableblock > table[frame="vsides"] {
280 border-top-style: none;
281 border-bottom-style: none;
285 div.hdlist {
286 margin-top: 0.8em;
287 margin-bottom: 0.8em;
289 div.hdlist tr {
290 padding-bottom: 15px;
292 dt.hdlist1.strong, td.hdlist1.strong {
293 font-weight: bold;
295 td.hdlist1 {
296 vertical-align: top;
297 font-style: normal;
298 padding-right: 0.8em;
299 color: navy;
301 td.hdlist2 {
302 vertical-align: top;
304 div.hdlist.compact tr {
305 margin: 0;
306 padding-bottom: 0;
309 .comment {
310 background: yellow;
313 @media print {
314 div#footer-badges { display: none; }
317 div#toctitle {
318 color: #527bbd;
319 font-family: sans-serif;
320 font-size: 1.1em;
321 font-weight: bold;
322 margin-top: 1.0em;
323 margin-bottom: 0.1em;
326 div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
327 margin-top: 0;
328 margin-bottom: 0;
330 div.toclevel2 {
331 margin-left: 2em;
332 font-size: 0.9em;
334 div.toclevel3 {
335 margin-left: 4em;
336 font-size: 0.9em;
338 div.toclevel4 {
339 margin-left: 6em;
340 font-size: 0.9em;
342 /* Workarounds for IE6's broken and incomplete CSS2. */
344 div.sidebar-content {
345 background: #ffffee;
346 border: 1px solid silver;
347 padding: 0.5em;
349 div.sidebar-title, div.image-title {
350 color: #527bbd;
351 font-family: sans-serif;
352 font-weight: bold;
353 margin-top: 0.0em;
354 margin-bottom: 0.5em;
357 div.listingblock div.content {
358 border: 1px solid silver;
359 background: #f4f4f4;
360 padding: 0.5em;
363 div.quoteblock-attribution {
364 padding-top: 0.5em;
365 text-align: right;
368 div.verseblock-content {
369 white-space: pre;
371 div.verseblock-attribution {
372 padding-top: 0.75em;
373 text-align: left;
376 div.exampleblock-content {
377 border-left: 2px solid silver;
378 padding-left: 0.5em;
381 /* IE6 sets dynamically generated links as visited. */
382 div#toc a:visited { color: blue; }
383 </style>
384 </head>
385 <body>
386 <div id="header">
387 <h1>How to use the subtree merge strategy</h1>
388 </div>
389 <div id="preamble">
390 <div class="sectionbody">
391 <div class="paragraph"><p>There are situations where you want to include contents in your project
392 from an independently developed project. You can just pull from the
393 other project as long as there are no conflicting paths.</p></div>
394 <div class="paragraph"><p>The problematic case is when there are conflicting files. Potential
395 candidates are Makefiles and other standard filenames. You could merge
396 these files but probably you do not want to. A better solution for this
397 problem can be to merge the project as its own subdirectory. This is not
398 supported by the <em>recursive</em> merge strategy, so just pulling won&#8217;t work.</p></div>
399 <div class="paragraph"><p>What you want is the <em>subtree</em> merge strategy, which helps you in such a
400 situation.</p></div>
401 <div class="paragraph"><p>In this example, let&#8217;s say you have the repository at <tt>/path/to/B</tt> (but
402 it can be an URL as well, if you want). You want to merge the <em>master</em>
403 branch of that repository to the <tt>dir-B</tt> subdirectory in your current
404 branch.</p></div>
405 <div class="paragraph"><p>Here is the command sequence you need:</p></div>
406 <div class="listingblock">
407 <div class="content">
408 <pre><tt>$ git remote add -f Bproject /path/to/B <b>&lt;1&gt;</b>
409 $ git merge -s ours --no-commit Bproject/master <b>&lt;2&gt;</b>
410 $ git read-tree --prefix=dir-B/ -u Bproject/master <b>&lt;3&gt;</b>
411 $ git commit -m "Merge B project as our subdirectory" <b>&lt;4&gt;</b>
413 $ git pull -s subtree Bproject master <b>&lt;5&gt;</b></tt></pre>
414 </div></div>
415 <div class="colist arabic"><ol>
416 <li>
418 name the other project "Bproject", and fetch.
419 </p>
420 </li>
421 <li>
423 prepare for the later step to record the result as a merge.
424 </p>
425 </li>
426 <li>
428 read "master" branch of Bproject to the subdirectory "dir-B".
429 </p>
430 </li>
431 <li>
433 record the merge result.
434 </p>
435 </li>
436 <li>
438 maintain the result with subsequent merges using "subtree"
439 </p>
440 </li>
441 </ol></div>
442 <div class="paragraph"><p>The first four commands are used for the initial merge, while the last
443 one is to merge updates from <em>B project</em>.</p></div>
444 </div>
445 </div>
446 <h2 id="_comparing_em_subtree_em_merge_with_submodules">Comparing <em>subtree</em> merge with submodules</h2>
447 <div class="sectionbody">
448 <div class="ulist"><ul>
449 <li>
451 The benefit of using subtree merge is that it requires less
452 administrative burden from the users of your repository. It works with
453 older (before Git v1.5.2) clients and you have the code right after
454 clone.
455 </p>
456 </li>
457 <li>
459 However if you use submodules then you can choose not to transfer the
460 submodule objects. This may be a problem with the subtree merge.
461 </p>
462 </li>
463 <li>
465 Also, in case you make changes to the other project, it is easier to
466 submit changes if you just use submodules.
467 </p>
468 </li>
469 </ul></div>
470 </div>
471 <h2 id="_additional_tips">Additional tips</h2>
472 <div class="sectionbody">
473 <div class="ulist"><ul>
474 <li>
476 If you made changes to the other project in your repository, they may
477 want to merge from your project. This is possible using subtree&#8201;&#8212;&#8201;it
478 can shift up the paths in your tree and then they can merge only the
479 relevant parts of your tree.
480 </p>
481 </li>
482 <li>
484 Please note that if the other project merges from you, then it will
485 connect its history to yours, which can be something they don&#8217;t want
487 </p>
488 </li>
489 </ul></div>
490 </div>
491 <div id="footer">
492 <div id="footer-text">
493 Last updated 2011-04-24 18:06:53 UTC
494 </div>
495 </div>
496 </body>
497 </html>