Search code examples
gitgit-mergegit-subtree

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?


Solution

  • 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.