Spaces:
Running
Running
Date: Sat, 5 Jan 2008 20:17:40 -0500 | |
From: Sean <[email protected]> | |
To: Miklos Vajna <[email protected]> | |
Cc: [email protected] | |
Subject: how to use git merge -s subtree? | |
Abstract: In this article, Sean demonstrates how one can use the subtree merge | |
strategy. | |
Content-type: text/asciidoc | |
Message-ID: <[email protected]> | |
How to use the subtree merge strategy | |
===================================== | |
There are situations where you want to include contents in your project | |
from an independently developed project. You can just pull from the | |
other project as long as there are no conflicting paths. | |
The problematic case is when there are conflicting files. Potential | |
candidates are Makefiles and other standard filenames. You could merge | |
these files but probably you do not want to. A better solution for this | |
problem can be to merge the project as its own subdirectory. This is not | |
supported by the 'recursive' merge strategy, so just pulling won't work. | |
What you want is the 'subtree' merge strategy, which helps you in such a | |
situation. | |
In this example, let's say you have the repository at `/path/to/B` (but | |
it can be a URL as well, if you want). You want to merge the 'master' | |
branch of that repository to the `dir-B` subdirectory in your current | |
branch. | |
Here is the command sequence you need: | |
---------------- | |
$ git remote add -f Bproject /path/to/B <1> | |
$ git merge -s ours --no-commit --allow-unrelated-histories Bproject/master <2> | |
$ git read-tree --prefix=dir-B/ -u Bproject/master <3> | |
$ git commit -m "Merge B project as our subdirectory" <4> | |
$ git pull -s subtree Bproject master <5> | |
---------------- | |
<1> name the other project "Bproject", and fetch. | |
<2> prepare for the later step to record the result as a merge. | |
<3> read "master" branch of Bproject to the subdirectory "dir-B". | |
<4> record the merge result. | |
<5> maintain the result with subsequent merges using "subtree" | |
The first four commands are used for the initial merge, while the last | |
one is to merge updates from 'B project'. | |
Comparing 'subtree' merge with submodules | |
----------------------------------------- | |
- The benefit of using subtree merge is that it requires less | |
administrative burden from the users of your repository. It works with | |
older (before Git v1.5.2) clients and you have the code right after | |
clone. | |
- However if you use submodules then you can choose not to transfer the | |
submodule objects. This may be a problem with the subtree merge. | |
- Also, in case you make changes to the other project, it is easier to | |
submit changes if you just use submodules. | |
Additional tips | |
--------------- | |
- If you made changes to the other project in your repository, they may | |
want to merge from your project. This is possible using subtree -- it | |
can shift up the paths in your tree and then they can merge only the | |
relevant parts of your tree. | |
- Please note that if the other project merges from you, then it will | |
connect its history to yours, which can be something they don't want | |
to. | |