.\" shorthand for double quote that works everywhere. .ds q \N'34' .TH GIT-REBASE-SUBTREE 1 "@PACKAGE_TARNAME@ @PACKAGE_VERSION@" "2007\-11\-02" "@PACKAGE_NAME@ @PACKAGE_VERSION@" .SH NAME git\-rebase\-subtree \- rebase set of interdependant git branches .SH SYNOPSIS .B "git\-rebase\-subtree" .I "" .I "" .PP .B "git\-rebase\-subtree" .I "\-\-reverse" .I "" .I "" .SH DESCRIPTION So you are tracking some upstream's git repo and maintain your own set of interdependent feature branches ("branch subtree"). .PP And you want to keep that "branch subtree" up-to-date in relation to upstream so it stays sweet, small, and clean, increasing the chances that upstream will finally pick something up from it. .PP Initial situation: Local branch master tracks remote origin. .PP Note: Letters A\-Z are branch names, not revs. .PP Old tree: .nf *\-\-F / origin=master\-\-A\-\-B\-\-G \\ *\-\-D\-\-H \\ *\-\-*\-\-K .fi .PP Generate the following configuration using .IR "git config" : .nf git config --add rebase-subtree.rebase \*qmaster A\*q git config --add rebase-subtree.rebase \*qA B\*q git config --add rebase-subtree.rebase \*qB F\*q git config --add rebase-subtree.rebase \*qB G\*q git config --add rebase-subtree.rebase \*qA D\*q git config --add rebase-subtree.rebase \*qD H\*q git config --add rebase-subtree.rebase \*qD K\*q .fi .PP After "git\-fetch \-v": .nf *\-\-F / master\-\-\-A\-\-B\-\-G \\ \\ * *\-\-D\-\-H \\ \\ origin' *\-\-*\-\-K .fi .PP After hypothetical "git\-rebase\-subtree origin master": .nf *'\-\-F' / origin'=master'\-\-A'\-\-B'\-\-G' \\ *'\-\-D'\-\-H' \\ *'\-\-*'\-\-K' .fi .SS "REVERSE OPERATION" .PP Old tree: .nf *\-\-F / master\-\-Y\-\-A\-\-B\-\-G \\ *\-\-D\-\-H \\ *\-\-*\-\-K .fi .PP After hypothetical "git\-rebase\-subtree \-\-reverse master Y": .nf Y *'\-\-F' / / master\-\-A'\-\-B'\-\-G' \\ *'\-\-D'\-\-H' \\ *'\-\-*'\-\-K' .fi .SH "GIT CONFIGURATION" Configuration for .B "git-rebase-subtree" only makes sense on a per-repository basis, not on a .I "--global" basis. .TP .B "rebase-subtree.rebase" Add a new line to the config option for each .IR "orig" - "branch" pair. Each .B "rebase-subtree.rebase" option line defines an edge in the branch subtree to rebase. .TP .B "rebase-subtree.subtree" .br .I "(Deprecated because it is unreadable)" .br String of \*qorig branch\norig2 branch2\*q form. Becomes very unreadable when the branch subtree to rebase contains more than a couple of branches. Use .B "rebase-subtree.rebase" instead. .SH "NOT BUGS" .TP .B "Obsoleted by git 1.5.6" git 1.5.6 can trigger branch rebases on pulls instead of standard merges. It cannot rebase entire subtrees, through, neither by manual command nor automatically. .SH "BUGS" .TP .B "A different branch ends up checked out" Yes, we should save the checked out branch at startup, and check it out again after the branch subtree has been rebased. .TP .B "Specifying the branches from which to which to rebase is complicated" Yes. Should have default settings, or do a reasonable guess, or something. .TP .B "Lacks generality (fixation about 'master')" Yes. .TP .B "Needs complicated config" Yes. Auto-generating the graph may be possible. .TP .B "Needs merge conflict handling" Definitely. At the moment, it just messes up your branch tree if some error happens during the rebase. .TP .B "Needs proper error handling" Definitely. Possibly just renaming the .I rebase-subtree/old/foo branches to .I foo could do the job. Needs more investigation, though. .TP .B "Use better naming for temporary work branches" Yes. .TP .B "Should bail out if old/foo exists and is not equal to foo" Yes. .SH "SEE ALSO" git\-rebase(1).