/usr/share/doc/git/howto
NameSizeModeActions
coordinate-embargoed-releases.html298380644editdlrm
coordinate-embargoed-releases.txt108230644editdlrm
keep-canonical-history-correct.html262490644editdlrm
keep-canonical-history-correct.txt67950644editdlrm
maintain-git.html417320644editdlrm
maintain-git.txt182200644editdlrm
new-command.html220010644editdlrm
new-command.txt44600644editdlrm
rebase-from-internal-branch.html244560644editdlrm
rebase-from-internal-branch.txt63100644editdlrm
rebuild-from-update-hook.html203870644editdlrm
rebuild-from-update-hook.txt31370644editdlrm
recover-corrupted-blob-object.html238840644editdlrm
recover-corrupted-blob-object.txt55100644editdlrm
recover-corrupted-object-harder.html360380644editdlrm
recover-corrupted-object-harder.txt146070644editdlrm
revert-a-faulty-merge.html308650644editdlrm
revert-a-faulty-merge.txt108560644editdlrm
revert-branch-rebase.html247400644editdlrm
revert-branch-rebase.txt78230644editdlrm
separating-topic-branches.html205260644editdlrm
separating-topic-branches.txt33560644editdlrm
setup-git-server-over-http.html305620644editdlrm
setup-git-server-over-http.txt86130644editdlrm
update-hook-example.html232720644editdlrm
update-hook-example.txt62890644editdlrm
use-git-daemon.html196490644editdlrm
use-git-daemon.txt21350644editdlrm
using-merge-subtree.html202350644editdlrm
using-merge-subtree.txt30250644editdlrm
using-signed-tag-in-pull-request.html267650644editdlrm
using-signed-tag-in-pull-request.txt82820644editdlrm
Edit: /usr/share/doc/git/howto/separating-topic-branches.txt (3356B)
From: Junio C Hamano Subject: Separating topic branches Abstract: In this article, JC describes how to separate topic branches. Content-type: text/asciidoc How to separate topic branches ============================== This text was originally a footnote to a discussion about the behaviour of the git diff commands. Often I find myself doing that [running diff against something other than HEAD] while rewriting messy development history. For example, I start doing some work without knowing exactly where it leads, and end up with a history like this: "master" o---o \ "topic" o---o---o---o---o---o At this point, "topic" contains something I know I want, but it contains two concepts that turned out to be completely independent. And often, one topic component is larger than the other. It may contain more than two topics. In order to rewrite this mess to be more manageable, I would first do "diff master..topic", to extract the changes into a single patch, start picking pieces from it to get logically self-contained units, and start building on top of "master": $ git diff master..topic >P.diff $ git checkout -b topicA master ... pick and apply pieces from P.diff to build ... commits on topicA branch. o---o---o / "topicA" o---o"master" \ "topic" o---o---o---o---o---o Before doing each commit on "topicA" HEAD, I run "diff HEAD" before update-index the affected paths, or "diff --cached HEAD" after. Also I would run "diff --cached master" to make sure that the changes are only the ones related to "topicA". Usually I do this for smaller topics first. After that, I'd do the remainder of the original "topic", but for that, I do not start from the patchfile I extracted by comparing "master" and "topic" I used initially. Still on "topicA", I extract "diff topic", and use it to rebuild the other topic: $ git diff -R topic >P.diff ;# --cached also would work fine $ git checkout -b topicB master ... pick and apply pieces from P.diff to build ... commits on topicB branch. "topicB" o---o---o---o---o / /o---o---o |/ "topicA" o---o"master" \ "topic" o---o---o---o---o---o After I am done, I'd try a pretend-merge between "topicA" and "topicB" in order to make sure I have not missed anything: $ git pull . topicA ;# merge it into current "topicB" $ git diff topic "topicB" o---o---o---o---o---* (pretend merge) / / /o---o---o----------' |/ "topicA" o---o"master" \ "topic" o---o---o---o---o---o The last diff better not to show anything other than cleanups for cruft. Then I can finally clean things up: $ git branch -D topic $ git reset --hard HEAD^ ;# nuke pretend merge "topicB" o---o---o---o---o / /o---o---o |/ "topicA" o---o"master"