<!-- 
.. title: SciPy Workflow
.. slug: scipy-workflow
.. date: 2013/06/04 12:36:03
.. tags: scipy, git, workflow
.. link: 
.. description: 
-->

There are a few things that have taken some getting used to in working
with SciPy. These things are aggregated here:

## Keeping my SciPy repo up-to-date

I need to upadate [my copy of SciPy](https://github.com/cowlicks/scipy) regularly from
[upstream](https://github.com/scipy/scipy), to avoid merge conflicts. I have 
done this plenty of times, but for some reason I forget how every time. There is 
a good howto on [stackoverflow](http://stackoverflow.com/questions/7244321/how-to-update-github-forked-repository) on this. From said article:

    # Add the remote, call it "upstream":

    git remote add upstream git://github.com/whoever/whatever.git

    # Fetch all the branches of that remote into remote-tracking branches,
    # such as upstream/master:

    git fetch upstream

    # Make sure that you're on your master branch:

    git checkout master

    # Rewrite your master branch so that any commits of yours that
    # aren't already in upstream/master are replayed on top of that
    # other branch:

    git rebase upstream/master

## Pushing new local branches to a remote Git repo

Every time a make a new local branch, I forget how to push it to github as
new branch. Google always brings me to [this article](http://www.mariopareja.com/blog/archive/2010/01/11/how-to-push-a-new-local-branch-to-a-remote.aspx).
Basically if I have a new local branch call it `new-feature` and want to push
it to my github repo and create a new `new-feature` branch there too. I do:

    git push -u origin new-feature

and if I wanted to delete this remote branch, I could do:

    git push origin :new-feature

and delete it locally with:

    git branch -D new-feature

## SciPy's commit messages

SciPy require commit messages start with some standard acronyms. 

    API: an (incompatible) API change
    BLD: change related to building numpy
    BUG: bug fix
    DEP: deprecate something, or remove a deprecated object
    DEV: development tool or utility
    DOC: documentation
    ENH: enhancement
    MAINT: maintenance commit (refactoring, typos, etc.)
    REV: revert an earlier commit
    STY: style fix (whitespace, PEP8)
    TST: addition or modification of tests
    REL: related to releasing numpy

The acronyms are easy to remember, but adding the acronyms is easy to forget.
Which brings me to my next topic. 

## Changing commit messages, after you have pushed

This is not the simplest thing to do in git, fortunately my mentor Pauli
showed me a great way to do it. Assuming no one has pulled from your repo yet.

* First do `git log` and look for the last COMMIT befor the commit messages you want
to change.  

* Do `git rebase -i COMMIT`

* Replace `pick` with `r`

* Then Git will prompt you to change the commit messages one at a time. 

* Push your changes with `git push -f`
