###########################
Deleting your master branch
###########################

You've forked some project on github.

You clone your fork.

Now you've got a ``master`` branch.  It's the ``master`` branch of your fork.

It can be tempting to do work in the master branch and ask for a pull request.

That is best avoided because:

* It's natural to carry on working in your ``master`` and that will pollute your
  pull request with other commits
* ``master`` is not a descriptive name for a set of changes.  It's easier for
  the person reviewing your code to have something like ``fix-for-issue-12``.
* You may well also have a tracking branch pointing to the main upstream repo.
  You might call that something like ``upstream-master``.  It's easy to lose
  concentration and forget you are on ``upstream-master`` instead of your
  ``master``, and nasty errors can result.

To avoid this, I delete the ``master`` branch from my forked copy.  However, to
make that work, you have to tell github_ not to monitor your ``master`` branch.

********************
How to delete master
********************

First you delete ``master`` in your local clone. To do this we first make a new
branch called ``placeholder`` or similar, and delete ``master`` from there::

    git branch placeholder
    git checkout placeholder
    git branch -D master

All good so far.  We next want to delete the branch on github.  However, if we
do this the naive way::

    git push origin :master

we just get an error like this::

    remote: error: refusing to delete the current branch: refs/heads/master
    To git@github.com:matthew-brett/datarray.git
    ! [remote rejected] master (deletion of the current branch prohibited)
    error: failed to push some refs to 'git@github.com:matthew-brett/datarray.git'

That is because github is looking at the ``master`` branch to provide the web
content when you browse that repository.  So we first have to make github look
at our ``placeholder`` branch instead, then delete ``master``.

First push up the ``placeholder`` branch::

    git checkout placeholder # if not on placeholder already
    git push origin placeholder

Then set ``placeholder`` to be the github default branch.  Go to the main github
page for your forked repository, and click on the "Admin" button.

There's a "Default branch" dropdown list near the top of the screen.  From
there, select ``placeholder``.  On the interface I'm looking at, a green tick
appears above the dropdown list.  Now you can do (from the command line)::

    git push origin :master

and - no master branch...

.. include:: links_names.inc
