Split a git branch into two branches?

I'm trying to help out a coworker who accidentally created one feature branch from another feature branch, rather than creating the second one from master. Here is essentially what we have now…

Master ---A---B---C
                   \
              Foo   E---F---F---H
                                 \
                            Bar   J---K---L---M

And here is what we'd like to have…

Master ---A---B---C
                  |\
             Foo  | E---F---F---H
                  |
             Bar  J---K---L---M

One way I thought of would be to create FooV2 and BarV2 branches, and cherry-pick the individual commits into the appropriate V2 branches. But I'm curious, is there a better way to handle this situation?

Answers


It looks to me like you could:

git checkout J
git rebase master

Edit:

I tried what I suggested and it doesn't work. knittl's suggestion doesn't work (on my box). Here's what did work for me:

git rebase --onto master foo bar

For a more general answer that will help us understand things a bit better than just "run this command", we need a larger example. So, let's pretend you're actually in this situation:

Master ---A---B---C
                   \
              Foo   E---F---F---H
                                 \
                            Bar   J---K---L---M
                                               \
                                          Baz   N---O---P---Q

And here is what we'd like to have…

Master ---A---B---C
                  |\
             Foo  | E---F---F---H
                  |\
             Bar  | J---K---L---M
                   \
             Baz    N---O---P---Q

Thankfully, Git has a solution for us in the options to the rebase command!

git rebase --onto [newParent] [oldParent] [branchToMove]

What this means can be broken down into parts:

  1. rebase - Change the parents of something
  2. --onto - This is the flag that tells git to use this alternate rebase syntax
  3. newParent - This is the branch that the branch you are rebasing will have as it's parent
  4. oldParent - This is the branch that the branch you are rebasing currently has as it's parent
  5. branchToMove - This is the branch that you are moving (rebasing)

The bit about "old parent branch" can be a little confusing, but what it's really doing is it's saying "ignore the changes from my old parent when doing the rebase". The oldParent is how you define where the branch you are moving (ie. branchToMove) starts.

So, what are the commands to execute in our situation?

git rebase --onto Master Bar Baz
git rebase --onto Master Foo Bar

Note that the order of these commands matter because we need to pull each branch off of the end of the "branch chain".


Need Your Help

When is casting Context to Activity allowed?

android android-layout android-activity alertdialog android-context

In a showAlret(String message, Context ctx) method of an alert Dialog class, I am trying to get a reference to TextView in the dialog's layout XML:

Сompound string from multiple input fields

jquery

I have a 3 input fields. 2 for values and one fild for result.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.