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">
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">
10 p
, li
, dt
, dd
, div
, pre
, h1
, h2
, h3
, h4
, h5
, h6
{
12 border: 1px solid red;
17 margin: 1em 5% 1em 5%;
22 text-decoration: underline
;
42 h1
, h2
, h3
, h4
, h5
, h6
{
44 font-family: sans-serif
;
51 border-bottom: 2px solid silver
;
69 border: 1px solid silver
;
88 font-family: sans-serif
;
94 span#revnumber
, span#revdate
, span#revremark
{
95 font-family: sans-serif
;
99 font-family: sans-serif
;
101 border-top: 2px solid silver
;
107 padding-bottom: 0.5em;
111 padding-bottom: 0.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
{
122 margin-bottom: 1.5em;
124 div
.admonitionblock
{
126 margin-bottom: 2.5em;
129 div
.content
{ /* Block element content. */
133 /* Block element titles. */
134 div
.title
, caption
.title
{
136 font-family: sans-serif
;
140 margin-bottom: 0.5em;
146 td div
.title:first-child
{
149 div
.content div
.title:first-child
{
152 div
.content
+ div
.title
{
156 div
.sidebarblock
> div
.content
{
158 border: 1px solid silver
;
162 div
.listingblock
> div
.content
{
163 border: 1px solid silver
;
172 div
.quoteblock
> div
.attribution
{
181 div
.verseblock
> div
.content
{
184 div
.verseblock
> div
.attribution
{
188 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
189 div
.verseblock
+ div
.attribution
{
193 div
.admonitionblock
.icon
{
197 text-decoration: underline
;
199 padding-right: 0.5em;
201 div
.admonitionblock td
.content
{
203 border-left: 2px solid silver
;
206 div
.exampleblock
> div
.content
{
207 border-left: 2px solid silver
;
211 div
.imageblock div
.content
{ padding-left: 0; }
212 span
.image img
{ border-style: none
; }
213 a
.image:visited
{ color: white
; }
217 margin-bottom: 0.8em;
230 list-style-position: outside
;
233 list-style-type: decimal
;
236 list-style-type: lower-alpha
;
239 list-style-type: upper-alpha
;
242 list-style-type: lower-roman
;
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
{
252 margin-bottom: 0.1em;
255 div
.tableblock
> table
{
256 border: 3px solid
#527bbd;
259 font-family: sans-serif
;
271 /* Because the table frame attribute is overriden by CSS in most browsers. */
272 div
.tableblock
> table
[frame
="void"] {
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
;
287 margin-bottom: 0.8em;
290 padding-bottom: 15px;
292 dt
.hdlist1
.strong
, td
.hdlist1
.strong
{
298 padding-right: 0.8em;
304 div
.hdlist
.compact tr
{
314 div#footer-badges
{ display: none
; }
319 font-family: sans-serif
;
323 margin-bottom: 0.1em;
326 div
.toclevel1
, div
.toclevel2
, div
.toclevel3
, div
.toclevel4
{
342 /* Workarounds for IE6's broken and incomplete CSS2. */
344 div
.sidebar-content
{
346 border: 1px solid silver
;
349 div
.sidebar-title
, div
.image-title
{
351 font-family: sans-serif
;
354 margin-bottom: 0.5em;
357 div
.listingblock div
.content
{
358 border: 1px solid silver
;
363 div
.quoteblock-attribution
{
368 div
.verseblock-content
{
371 div
.verseblock-attribution
{
376 div
.exampleblock-content
{
377 border-left: 2px solid silver
;
381 /* IE6 sets dynamically generated links as visited. */
382 div#toc
a:visited
{ color: blue
; }
387 <h1>How to use the subtree merge strategy
</h1>
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
’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
401 <div class=
"paragraph"><p>In this example, let
’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
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><1></b>
409 $ git merge -s ours --no-commit Bproject/master
<b><2></b>
410 $ git read-tree --prefix=dir-B/ -u Bproject/master
<b><3></b>
411 $ git commit -m
"Merge B project as our subdirectory" <b><4></b>
413 $ git pull -s subtree Bproject master
<b><5></b></tt></pre>
415 <div class=
"colist arabic"><ol>
418 name the other project
"Bproject", and fetch.
423 prepare for the later step to record the result as a merge.
428 read
"master" branch of Bproject to the subdirectory
"dir-B".
433 record the merge result.
438 maintain the result with subsequent merges using
"subtree"
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>
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>
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
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.
465 Also, in case you make changes to the other project, it is easier to
466 submit changes if you just use submodules.
471 <h2 id=
"_additional_tips">Additional tips
</h2>
472 <div class=
"sectionbody">
473 <div class=
"ulist"><ul>
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
 — it
478 can shift up the paths in your tree and then they can merge only the
479 relevant parts of your tree.
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
’t want
492 <div id=
"footer-text">
493 Last updated
2011-
04-
24 18:
06:
53 UTC