Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between git subtree merge and git-subtree

I've just found git-subtree tool that some time ago became a part of main git repo https://github.com/apenwarr/git-subtree/

However I don't fully understand what functionality does this tool provide over the already existing "git read-tree" + "git merge -s subtree". Is the only purpouse of git-subtree - making the resultant commit history look better or does it have more functionality that I've overlooked?

like image 412
Eugene Avatar asked Jul 31 '12 13:07

Eugene


People also ask

What is subtree merge?

About subtree merges Typically, a subtree merge is used to contain a repository within a repository. The "subrepository" is stored in a folder of the main repository.

What is a git subtree?

git subtree lets you nest one repository inside another as a sub-directory. It is one of several ways Git projects can manage project dependencies. Why you may want to consider git subtree. Management of a simple workflow is easy.

Is subtree better than submodule git?

Component-based development favors Git submodules, whereas system-based development favors Git subtrees. Git submodules have a smaller repository size since they are just links to a single commit in a subproject; whereas Git subtrees store the whole subproject, including its history.

What is git subtree split?

Use git subtree split to extract the files you want to the an intermediate branch in your repository (you have already done this).


2 Answers

The commands you describe reads a subtree into a repository. The git-subtree command has many more options, as described by the documentation. Among others, you can (annotated for simplicity):

add::
    Create the <prefix> subtree by importing its contents
    from the given <refspec> or <repository> and remote <refspec>.
merge::
    Merge recent changes up to <commit> into the <prefix>
    subtree.
pull::
    Exactly like 'merge', but parallels 'git pull' in that
    it fetches the given commit from the specified remote
    repository.
push::
    Does a 'split' (see above) using the <prefix> supplied
    and then does a 'git push' to push the result to the 
    repository and refspec. This can be used to push your
    subtree to different branches of the remote repository.
split::
    Extract a new, synthetic project history from the
    history of the <prefix> subtree.  The new history
    includes only the commits (including merges) that
    affected <prefix>, and each of those commits now has the
    contents of <prefix> at the root of the project instead
    of in a subdirectory.  Thus, the newly created history
    is suitable for export as a separate git repository.

There are also a variety of flags that aid and manipulate the above. I believe all these options were available before via chains of plumbing commands. git-subtree.sh just wraps them and makes them considerably easier to execute.

like image 138
Christopher Avatar answered Sep 21 '22 11:09

Christopher


If you look at the old subtree code before it got added to git as a contrib module: https://github.com/apenwarr/git-subtree/blob/master/git-subtree.sh you can see that the git subtree tool is really a more advanced wrapper around the lower level git subtree merging strategies.

It basically leverages those strategies in a sensible way to make subtree management much easier. Particularly the --squash stuff is really, really useful.

like image 41
Mixologic Avatar answered Sep 19 '22 11:09

Mixologic