Table of Contents

Workflow

This script facilitates adopting a subset of the branch-featuring workflow characterised by:

  • each feature will have its own branch
  • feature branches derive directly form master
  • integration of master to feature branch happens via rebasing to maintain a straight commits line
  • force pushing of feature branches to origin is not an issue
  • release branches are created aggregating multiple branches

Scope

The scope of this gem is helping out in the following cases:

  • you have multiple feature branches waiting for release due to some reason (i.e. long QA time...), and need to keep them aligned with master
  • you need to quickly aggregate branches for a release
  • you want to cleanup local and remote branches upon release

Installation

Just install the gem to use the binaries commands.

gem install git_commands

GIT

The library uses the Ruby command line execution to invoke the git command as a separate process.
I assume you have the GIT program on your path.

Usage

Here are the main commands:

Arguments

All of the available commands come with the same set of arguments:

Help

Display the help of a specific command by:

rebase --help
Usage: rebase --repo=/Users/Elvis/greatest_hits --branches=feature/love_me_tender,fetaure/teddybear
    -r, --repo=REPO                  The path to the existing GIT repository
    -b, --branches=BRANCHES          Specify branches as: 1. a comma-separated list of names 2. the path to a file containing names on each line 3. via pattern matching
    -h, --help                       Prints this help

Repository

You have to specify the absolute path to the GIT repository you want to work with. The path must be a folder initialized as a valid GIT repository (a check via rev-parse is performed), otherwise an error is raised:

rebase --repo=invalid
'invalid' is not a valid GIT repository!

Branches

As with the repository you always have to specify the list of branches you want to work with. There are different options:

List of branches

Specify a comma separated list of branch names:

rebase --repo=/Users/Elvis/greatest_hits --branches=feature/love_me_tender,feature/teddybear,feature/return_to_sender

Loading branches file...
Successfully loaded 3 branches:
01. feature/love_me_tender
02. feature/teddybear
03. feature/return_to_sender
Path to a names file

Specify an absolute path to a file containing the branches names on each line:

File /Users/Elvis/greatest_hits/.branches:

feature/love_me_tender
feature/teddybear
feature/return_to_sender
feature/in_the_ghetto
rebase --repo=/Users/Elvis/greatest_hits --branches=/Users/Elvis/greatest_hits/.branches

Loading branches file...
Successfully loaded 4 branches:
01. feature/love_me_tender
02. feature/teddybear
03. feature/return_to_sender
04. feature/in_the_ghetto
Pattern matching

In case you want to work with a set of branches with a common pattern, you have to specify a greedy operator with the wild card you want to match.
Just consider you have not to specify origin/ as the name of the branch, since is managed by the script for you:

rebase --repo=/Users/Elvis/greatest_hits --branches=*der

Loading branches file...
Successfully loaded 2 branches:
01. feature/love_me_tender
02. feature/return_to_sender
Checking

Each loaded branch is validated for existence (but for branches loaded via pattern matching, already fetched from origin).
In case the validation fails, the branch is filtered from the resulting list.

rebase --repo=/Users/Elvis/greatest_hits --branches=noent,feature/love_me_tender

Loading branches file...
Successfully loaded 1 branch:
01. feature/love_me_tender

In case no branches have been loaded, an error is raised:

rebase --repo=/Users/Elvis/greatest_hits --branches=noent1,noent2
No branches loaded!
Master branch

Master branch cannot be included into the branches list for obvious reasons:

rebase --repo=/Users/Elvis/greatest_hits --branches=master,feature/love_me_tender

Loading branches file...
Successfully loaded 1 branch:
01. feature/love_me_tender

Commands

Here are the available GIT commands:

Rebase

This command is useful in case you have several branches to rebase with origin/master frequently. A confirmation is asked to before rebasing.

rebase --repo=/Users/Elvis/greatest_hits --branches=feature/love_me_tender,feature/teddybear,feature/return_to_sender
...

Purge

This command remove the specified branches locally and remotely.
A confirmation is asked before removal.

purge --repo=/temp/top_20 --branches=*obsolete*
...

Aggregate

This command aggregates all of the specified branches into a single one in case you want to create a release branch.
The created release branch follows this naming convention: release/yyyy_mm_dd
A confirmation is asked before aggregating.

aggregate --repo=/Users/Elvis/greatest_hits --branches=*ready*