Commit 00ccea60 authored by Benedikt Böhm's avatar Benedikt Böhm

refactor the whole thing

- now works as sub commands to git if copied to $(git --exec-path)
- now works with arbitrary commands for branch types
- consistent variable names
- new branch type 'support' for long-term support branches of historic
  versions
- preliminary base branch support for hotfix branch type to create
  hotfixes form support branches
parent 605b7cd8
#!/bin/sh #!/bin/bash
# #
# gitflow -- A collection of Git wrapper scripts to provide high-level # gitflow -- A collection of Git wrapper scripts to provide high-level
# repository operations for Vincent Driessen's branching model: # repository operations for Vincent Driessen's branching model:
# #
# Original blog post presenting this model is found at: # Original blog post presenting this model is found at:
# http://nvie.com/archives/323 # http://nvie.com/archives/323
# #
# Feel free to contribute to this project at: # Feel free to contribute to this project at:
# http://github.com/nvie/gitflow # http://github.com/nvie/gitflow
# #
# Copyright (c) 2010 by Vincent Driessen # Copyright (c) 2010 by Vincent Driessen
# Copyright (c) 2010 by Benedikt Böhm
# #
# Get the git dir
GIT_DIR=$(git rev-parse --git-dir)
# Get all available branches
LOCAL_BRANCHES=$(git branch | sed 's/^[* ] //')
REMOTE_BRANCHES=$(git branch -r | sed 's/^[* ] //')
ALL_BRANCHES="$LOCAL_BRANCHES\n$REMOTE_BRANCHES"
warn() { echo "$@" >&2; } warn() { echo "$@" >&2; }
die() { warn "$@"; exit 1; } die() { warn "$@"; exit 1; }
has() { [[ " ${*:2} " == *" $1 "* ]]; }
usage() {
echo "usage: git flow <cmd> <btype> <args>"
echo
echo "<btype> can be any of: feature, release, hotfix, support"
echo
echo "Try 'git flow help <btype>' for details."
}
main() {
if [ $# -lt 2 ]; then
usage
exit 1
fi
export GITFLOW_DIR=$(dirname "$0")
# sanity checks
ACTION="$1"
BTYPE="$2"
shift 2
if [ ! -e "$GITFLOW_DIR/git-flow-$BTYPE" ]; then
usage
exit 1
fi
if ! git rev-parse --git-dir &>/dev/null; then
die "Not a git repository"
fi
# get all available branches
LOCAL_BRANCHES=$(git branch | sed 's/^[* ] //')
REMOTE_BRANCHES=$(git branch -r | sed 's/^[* ] //')
ALL_BRANCHES="$LOCAL_BRANCHES $REMOTE_BRANCHES"
# run command
. "$GITFLOW_DIR/git-flow-$BTYPE"
if ! declare -f cmd_$ACTION >/dev/null; then
usage
exit 1
fi
# fail if a command failes
set -e
# run command
cmd_$ACTION "$@"
}
gitflow_check_clean_working_tree() { gitflow_check_clean_working_tree() {
if [ "$(git status 2>/dev/null | tail -n1)" != "nothing to commit (working directory clean)" ]; then if ! git diff --no-ext-diff --ignore-submodules --quiet --exit-code; then
die "Working directory is dirty. Only use gitflow in clean working directories for your own safety." die "Working tree contains unstaged changes. Aborting ..."
fi
if ! git diff-index --cached --quiet --ignore-submodules HEAD --; then
die "Index contains uncommited changes. Aborting ..."
fi fi
} }
gitflow_require_local_branch() { gitflow_require_local_branch() {
echo "$LOCAL_BRANCHES" | grep "^$1\$" 2>&1 >/dev/null if ! has $1 $LOCAL_BRANCHES; then
if [ $? -ne 0 ]; then
die "Local branch '$1' does not exist and is required." die "Local branch '$1' does not exist and is required."
fi fi
} }
gitflow_require_remote_branch() { gitflow_require_remote_branch() {
echo "$REMOTE_BRANCHES" | grep "^$1\$" 2>&1 >/dev/null if ! has $1 $REMOTE_BRANCHES; then
if [ $? -ne 0 ]; then
die "Remote branch '$1' does not exist and is required." die "Remote branch '$1' does not exist and is required."
fi fi
} }
gitflow_require_branch() { gitflow_require_branch() {
echo "$ALL_BRANCHES" | grep "^$1\$" 2>&1 >/dev/null if ! has $1 $ALL_BRANCHES; then
if [ $? -ne 0 ]; then
die "Branch '$1' does not exist and is required." die "Branch '$1' does not exist and is required."
fi fi
} }
gitflow_require_branch_absent() { gitflow_require_branch_absent() {
echo "$ALL_BRANCHES" | grep "^$1\$" 2>&1 >/dev/null if has $1 $ALL_BRANCHES; then
if [ $? -eq 0 ]; then
die "Branch '$1' already exists. Pick another name." die "Branch '$1' already exists. Pick another name."
fi fi
} }
# #
# gitflow_test_branches_equal() # gitflow_test_branches_equal()
# #
# Tests whether branches and their "origin" counterparts have diverged and need # Tests whether branches and their "origin" counterparts have diverged and need
# merging first. It returns error codes to provide more detail, like so: # merging first. It returns error codes to provide more detail, like so:
# #
# 0 Branch heads point to the same commit # 0 Branch heads point to the same commit
# 1 First given branch needs fast-forwarding # 1 First given branch needs fast-forwarding
# 2 Second given branch needs fast-forwarding # 2 Second given branch needs fast-forwarding
# 3 Branch needs a real merge # 3 Branch needs a real merge
# #
gitflow_test_branches_equal() { gitflow_test_branches_equal() {
commit1=$(git rev-parse "$1") commit1=$(git rev-parse "$1")
commit2=$(git rev-parse "$2") commit2=$(git rev-parse "$2")
if [ "$commit1" != "$commit2" ]; then if [ "$commit1" != "$commit2" ]; then
base=$(git merge-base "$commit1" "$commit2") base=$(git merge-base "$commit1" "$commit2")
short_base=$(git rev-parse --short "$base")
if [ "$commit1" = "$base" ]; then if [ "$commit1" = "$base" ]; then
return 1 return 1
elif [ "$commit2" = "$base" ]; then elif [ "$commit2" = "$base" ]; then
...@@ -94,7 +135,6 @@ gitflow_require_branches_equal() { ...@@ -94,7 +135,6 @@ gitflow_require_branches_equal() {
status=$? status=$?
if [ $status -gt 0 ]; then if [ $status -gt 0 ]; then
warn "Branches '$1' and '$2' have diverged." warn "Branches '$1' and '$2' have diverged."
if [ $status -eq 1 ]; then if [ $status -eq 1 ]; then
die "And branch '$1' may be fast-forwarded." die "And branch '$1' may be fast-forwarded."
elif [ $status -eq 2 ]; then elif [ $status -eq 2 ]; then
...@@ -106,3 +146,4 @@ gitflow_require_branches_equal() { ...@@ -106,3 +146,4 @@ gitflow_require_branches_equal() {
fi fi
} }
main "$@"
#!/bin/sh
# #
# gitflow -- A collection of Git wrapper scripts to provide high-level # gitflow -- A collection of Git wrapper scripts to provide high-level
# repository operations for Vincent Driessen's branching model: # repository operations for Vincent Driessen's branching model:
# #
# Original blog post presenting this model is found at: # Original blog post presenting this model is found at:
# http://nvie.com/archives/323 # http://nvie.com/archives/323
# #
# Feel free to contribute to this project at: # Feel free to contribute to this project at:
# http://github.com/nvie/gitflow # http://github.com/nvie/gitflow
# #
# Copyright (c) 2010 by Vincent Driessen # Copyright (c) 2010 by Vincent Driessen
# Copyright (c) 2010 by Benedikt Böhm
# #
usage() { usage() {
echo "usage: gitflow start feature [<options>] <name> [<base>]" echo "usage: git flow start feature <name> [<base>]"
echo " gitflow finish feature [<options>] <name>" echo " git flow finish feature <name> [<base>]"
echo " git flow publish feature <name>"
echo " git flow track feature <name>"
# TODO # TODO
#echo "" #echo ""
#echo "options:" #echo "options:"
...@@ -31,69 +33,123 @@ usage() { ...@@ -31,69 +33,123 @@ usage() {
} }
parse_args() { parse_args() {
FEATURE="$1" NAME="$1"
if [ $# -eq 2 ]; then BASE="${2:-develop}"
BASE="$2" if [ "$NAME" = "" ]; then
else echo "Missing argument <name>."
BASE="develop"
fi
if [ "$FEATURE" = "" ]; then
echo "Missing argument <release>"
usage usage
exit 1 exit 1
fi fi
BRANCH=feature/$NAME
}
cmd_help() {
usage
exit 0
} }
start() { cmd_start() {
parse_args "$@" parse_args "$@"
# Checks # sanity checks
gitflow_check_clean_working_tree gitflow_check_clean_working_tree
gitflow_require_branch_absent "$FEATURE" gitflow_require_branch_absent $BRANCH
if [ "$BASE" = "develop" ]; then if [ "$BASE" = "develop" ]; then
gitflow_require_branches_equal 'develop' 'origin/develop' git fetch origin develop
gitflow_require_branches_equal develop origin/develop
fi fi
# All checks passed, ready to roll # create branch
git checkout -b "$FEATURE" "$BASE" git checkout -b $BRANCH $BASE
echo "" echo
echo "Summary of actions:" echo "Summary of actions:"
echo "- A new branch '$FEATURE' was created, based on '$BASE'" echo "- A new branch '$BRANCH' was created, based on '$BASE'"
echo "- You are now on branch '$FEATURE'" echo "- You are now on branch '$BRANCH'"
echo "" echo ""
echo "Now, start committing on your feature. When done, use:" echo "Now, start committing on your feature. When done, use:"
echo "" echo ""
echo " gitflow finish feature '$FEATURE'" echo " git flow finish feature $NAME"
echo
} }
finish() { cmd_finish() {
parse_args "$@" parse_args "$@"
# Checks # sanity checks
gitflow_check_clean_working_tree gitflow_check_clean_working_tree
gitflow_require_branch "$FEATURE" gitflow_require_branch $BRANCH
gitflow_require_branches_equal 'develop' 'origin/develop' git fetch origin
if has origin/$BRANCH $REMOTE_BRANCHES; then
# All checks passed, ready to roll gitflow_require_branches_equal $BRANCH origin/$BRANCH
git checkout develop fi
if [ "$BASE" = "develop" ]; then
gitflow_require_branches_equal develop origin/develop
fi
# In case there has been only a single commit in the feature branch, don't # merge into BASE
# use --no-ff, since it has no extra advantages git checkout $BASE
FF_FLAG="--no-ff" if [ "$(git rev-list -n2 $BASE..$BRANCH | wc -l)" = "1" ]; then
if [ "$(git rev-list develop.."$FEATURE" | wc -l)" -eq 1 ]; then git merge --ff $BRANCH
FF_FLAG="--ff" else
git merge --no-ff $BRANCH
fi fi
git merge "$FF_FLAG" "$FEATURE"
# delete branch
# TODO: How do we handle merge conflicts here?? # TODO: How do we handle merge conflicts here??
git branch -d "$FEATURE" git push origin :refs/heads/$BRANCH
git branch -d $BRANCH
echo "" echo
echo "Summary of actions:" echo "Summary of actions:"
echo "- The feature branch '$FEATURE' was merged into 'develop'" echo "- The feature branch '$BRANCH' was merged into '$BASE'"
#echo "- Merge conflicts were resolved" # TODO: Add this line when it's supported #echo "- Merge conflicts were resolved" # TODO: Add this line when it's supported
echo "- Feature branch '$FEATURE' has been removed" echo "- Feature branch '$BRANCH' has been removed"
echo "- You are now on branch 'develop'" echo "- You are now on branch '$BASE'"
echo "" echo
}
cmd_publish() {
parse_args "$@"
# sanity checks
gitflow_check_clean_working_tree
gitflow_require_branch $BRANCH
git fetch origin
gitflow_require_branch_absent origin/$BRANCH
# create remote branch
git push origin $BRANCH:refs/heads/$BRANCH
git fetch origin
# configure remote tracking
git config branch.$BRANCH.remote origin
git config branch.$BRANCH.merge refs/heads/$BRANCH
git checkout $BRANCH
echo
echo "Summary of actions:"
echo "- A new remote branch '$BRANCH' was created"
echo "- The local branch '$BRANCH' was configured to track the remote branch"
echo "- You are now on branch '$BRANCH'"
echo
} }
cmd_track() {
parse_args "$@"
# sanity checks
gitflow_check_clean_working_tree
gitflow_require_branch_absent $BRANCH
git fetch origin
gitflow_require_branch origin/$BRANCH
# create tracking branch
git checkout -b $BRANCH origin/$BRANCH
echo
echo "Summary of actions:"
echo "- A new remote tracking branch '$BRANCH' was created"
echo "- You are now on branch '$BRANCH'"
echo
}
#!/bin/sh
# #
# gitflow -- A collection of Git wrapper scripts to provide high-level # gitflow -- A collection of Git wrapper scripts to provide high-level
# repository operations for Vincent Driessen's branching model: # repository operations for Vincent Driessen's branching model:
# #
# Original blog post presenting this model is found at: # Original blog post presenting this model is found at:
# http://nvie.com/archives/323 # http://nvie.com/archives/323
# #
# Feel free to contribute to this project at: # Feel free to contribute to this project at:
# http://github.com/nvie/gitflow # http://github.com/nvie/gitflow
# #
# Copyright (c) 2010 by Vincent Driessen # Copyright (c) 2010 by Vincent Driessen
# Copyright (c) 2010 by Benedikt Böhm
# #
usage() { usage() {
echo "usage: gitflow start hotfix <release>" echo "usage: git flow start hotfix <version> [<base>]"
echo " gitflow finish hotfix <release>" echo " git flow finish hotfix <version> [<base>]"
# TODO # TODO
#echo "" #echo ""
#echo "options:" #echo "options:"
...@@ -28,68 +28,83 @@ usage() { ...@@ -28,68 +28,83 @@ usage() {
} }
parse_args() { parse_args() {
RELEASE="$1" VERSION="$1"
if [ "$RELEASE" = "" ]; then BASE="${2:-master}"
echo "Missing argument <release>" if [ "$VERSION" = "" ]; then
echo "Missing argument <version>."
usage usage
exit 1 exit 1
fi fi
HOTFIX_BRANCH="hotfix-$RELEASE" BRANCH=hotfix/$VERSION
}
cmd_help() {
usage
exit 0
} }
start() { cmd_start() {
parse_args "$@" parse_args "$@"
# Checks # sanity checks
gitflow_check_clean_working_tree gitflow_check_clean_working_tree
gitflow_require_branches_equal 'master' 'origin/master' git fetch origin
gitflow_require_branch_absent "$HOTFIX_BRANCH" gitflow_require_branches_equal master origin/master
gitflow_require_branch_absent $BRANCH
# All checks passed, ready to roll # create branch
git checkout -b "$HOTFIX_BRANCH" master git checkout -b $BRANCH $BASE
echo "" echo
echo "Summary of actions:" echo "Summary of actions:"
echo "- A new branch '$HOTFIX_BRANCH' was created, based on 'master'" echo "- A new branch '$BRANCH' was created, based on '$BASE'"
echo "- You are now on branch '$HOTFIX_BRANCH'" echo "- You are now on branch '$BRANCH'"
echo "" echo
echo "Follow-up actions:" echo "Follow-up actions:"
echo "- Bump the version number now!" echo "- Bump the version number now!"
echo "- Start committing your hot fixes" echo "- Start committing your hot fixes"
echo "- When done, run:" echo "- When done, run:"
echo "" echo
echo " gitflow finish hotfix '$HOTFIX_BRANCH'" echo " git flow finish hotfix '$HOTFIX_BRANCH'"
echo
} }
finish() { cmd_finish() {
parse_args "$@" parse_args "$@"
# Checks # sanity checks
gitflow_check_clean_working_tree gitflow_check_clean_working_tree
git fetch origin master
git fetch origin develop
gitflow_require_branches_equal master origin/master
gitflow_require_branches_equal develop origin/develop
git fetch origin develop # TODO: Make a flag to skip these fetches # merge into BASE
git fetch origin master # TODO: Make a flag to skip these fetches git checkout $BASE
gitflow_require_branches_equal 'master' 'origin/master' git merge --no-ff $BRANCH
gitflow_require_branches_equal 'develop' 'origin/develop' git tag v$VERSION
# All checks passed, ready to roll # merge into develop if we fixed a master issue
git checkout master # TODO: merge into support branch
git merge --no-ff "$HOTFIX_BRANCH" if [ "$BASE" = "master" ]; then
git tag "$RELEASE" git checkout develop
git checkout develop git merge --no-ff $BRANCH
git merge --no-ff "$HOTFIX_BRANCH" fi
git branch -d "$HOTFIX_BRANCH"
# delete branch
git branch -d $BRANCH
# TODO: Implement an optional push to master # TODO: Implement an optional push to master
# git push origin develop; git push origin master; git push --tags origin # git push origin develop; git push origin master; git push --tags origin
echo "" echo
echo "Summary of actions:" echo "Summary of actions:"
echo "- Latest objects have been fetched from 'origin'" echo "- Latest objects have been fetched from 'origin'"
echo "- Hotfix branch has been merged into 'master'" echo "- Hotfix branch has been merged into '$BASE'"
echo "- The hotfix was tagged '$RELEASE'" echo "- The hotfix was tagged 'v$VERSION'"
echo "- Hotfix branch has been back-merged into 'develop'" if [ "$BASE" = "master" ]; then
echo "- Hotfix branch '$HOTFIX_BRANCH' has been deleted" echo "- Hotfix branch has been back-merged into 'develop'"
echo "" fi
echo "- Hotfix branch '$BRANCH' has been deleted"
echo
} }
#!/bin/sh
# #
# gitflow -- A collection of Git wrapper scripts to provide high-level # gitflow -- A collection of Git wrapper scripts to provide high-level
# repository operations for Vincent Driessen's branching model: # repository operations for Vincent Driessen's branching model:
# #
# Original blog post presenting this model is found at: # Original blog post presenting this model is found at:
# http://nvie.com/archives/323 # http://nvie.com/archives/323
# #
# Feel free to contribute to this project at: # Feel free to contribute to this project at:
# http://github.com/nvie/gitflow # http://github.com/nvie/gitflow
# #
# Copyright (c) 2010 by Vincent Driessen # Copyright (c) 2010 by Vincent Driessen
# Copyright (c) 2010 by Benedikt Böhm
# #
usage() { usage() {
echo "usage: gitflow start release <release>" echo "usage: git flow start release <version>"
echo " gitflow finish release <release>" echo " git flow finish release <version>"
# TODO # TODO
#echo "" #echo ""
#echo "options:" #echo "options:"
...@@ -29,68 +29,76 @@ usage() { ...@@ -29,68 +29,76 @@ usage() {
} }
parse_args() { parse_args() {
RELEASE="$1" VERSION="$1"
if [ "$RELEASE" = "" ]; then if [ "$VERSION" = "" ]; then
echo "Missing argument <release>" echo "Missing argument <version>."
usage usage
exit 1 exit 1
fi fi
RELEASE_BRANCH="release-$RELEASE" BRANCH=release/$VERSION
}
cmd_help() {
usage
exit 0
} }
start() { cmd_start() {
parse_args "$@" parse_args "$@"
# Checks # sanity checks
gitflow_check_clean_working_tree gitflow_check_clean_working_tree
gitflow_require_branches_equal 'develop' 'origin/develop' git fetch origin
gitflow_require_branch_absent "$RELEASE_BRANCH" gitflow_require_branches_equal develop origin/develop
gitflow_require_branch_absent $BRANCH
# All checks passed, ready to roll # create branch
git checkout -b "$RELEASE_BRANCH" develop git checkout -b $BRANCH develop
echo "" echo
echo "Summary of actions:" echo "Summary of actions:"
echo "- A new branch '$RELEASE_BRANCH' was created, based on 'develop'" echo "- A new branch '$BRANCH' was created, based on 'develop'"
echo "- You are now on branch '$RELEASE_BRANCH'" echo "- You are now on branch '$BRANCH'"
echo "" echo
echo "Follow-up actions:" echo "Follow-up actions:"
echo "- Bump the version number now!" echo "- Bump the version number now!"
echo "- Start committing last-minute fixes in preparing your release" echo "- Start committing last-minute fixes in preparing your release"
echo "- When done, run:" echo "- When done, run:"
echo "" echo
echo " gitflow finish release '$RELEASE_BRANCH'" echo " git flow finish release '$VERSION'"
echo
} }
finish() { cmd_finish() {
parse_args "$@" parse_args "$@"
# Checks # sanity checks
gitflow_check_clean_working_tree gitflow_check_clean_working_tree
git fetch origin
gitflow_require_branches_equal master origin/master
gitflow_require_branches_equal develop origin/develop
git fetch origin develop # TODO: Make a flag to skip these fetches # merge into master
git fetch origin master # TODO: Make a flag to skip these fetches
gitflow_require_branches_equal 'master' 'origin/master'
gitflow_require_branches_equal 'develop' 'origin/develop'
# All checks passed, ready to roll
git checkout master git checkout master
git merge --no-ff "$RELEASE_BRANCH" git merge --no-ff $BRANCH
git tag "$RELEASE" git tag v$VERSION
# merge into develop
git checkout develop git checkout develop
git merge --no-ff "$RELEASE_BRANCH" git merge --no-ff $BRANCH
git branch -d "$RELEASE_BRANCH"
# delete branch
git branch -d $BRANCH
# TODO: Implement an optional push to master # TODO: Implement an optional push to master
# git push origin develop; git push origin master; git push --tags origin # git push origin develop; git push origin master; git push --tags origin
echo "" echo
echo "Summary of actions:" echo "Summary of actions:"
echo "- Latest objects have been fetched from 'origin'" echo "- Latest objects have been fetched from 'origin'"
echo "- Release branch has been merged into 'master'" echo "- Release branch has been merged into 'master'"
echo "- The release was tagged '$RELEASE'" echo "- The release was tagged 'v$VERSION'"
echo "- Release branch has been back-merged into 'develop'" echo "- Release branch has been back-merged into 'develop'"
echo "- Release branch '$RELEASE_BRANCH' has been deleted" echo "- Release branch '$BRANCH' has been deleted"
echo "" echo
} }
#!/bin/sh
# #
# gitflow -- A collection of Git wrapper scripts to provide high-level # gitflow -- A collection of Git wrapper scripts to provide high-level
# repository operations for Vincent Driessen's branching model: # repository operations for Vincent Driessen's branching model:
# #
# Original blog post presenting this model is found at: # Original blog post presenting this model is found at:
# http://nvie.com/archives/323 # http://nvie.com/archives/323
# #
# Feel free to contribute to this project at: # Feel free to contribute to this project at:
# http://github.com/nvie/gitflow # http://github.com/nvie/gitflow
# #
# Copyright (c) 2010 by Vincent Driessen # Copyright (c) 2010 by Vincent Driessen
# Copyright (c) 2010 by Benedikt Böhm
# #
usage() { usage() {
echo "usage: gitflow <start|finish> <btype> <args>" echo "usage: git flow start support <version> [<base>]"
echo ""
echo "btype can be any of: \"feature\", \"release\", \"hotfix\""
echo ""
} }
check_incoming() { parse_args() {
if [ "$ACTION" != "start" -a "$ACTION" != "finish" ]; then VERSION="$1"
usage BASE="${2:-v${VERSION}}"
exit 1 if [ "$VERSION" = "" ]; then
fi echo "Missing argument <version>."
if [ "$BTYPE" != "feature" -a "$BTYPE" != "release" -a "$BTYPE" != "hotfix" ]; then
usage usage
exit 1 exit 1
fi fi
BRANCH=support/$VERSION
} }
if [ $# -lt 2 ]; then cmd_help() {
usage
exit 1
fi
# Set & check arguments
export GITFLOW_DIR=$(dirname "$0")
ACTION="$1"
BTYPE="$2"
shift 2
check_incoming
# Now, $ACTION and $BTYPE are set
# It's time to call the appropriate subcommand
. "$GITFLOW_DIR/gitflow-sh-setup"
. "$GITFLOW_DIR/gitflow-$BTYPE"
if [ "$ACTION" = "start" ]; then
start "$@"
elif [ "$ACTION" = "finish" ]; then
finish "$@"
else
usage usage
fi exit 0
}
cmd_start() {
parse_args "$@"
# sanity checks
gitflow_check_clean_working_tree
# create branch
git checkout -b $BRANCH $BASE
# publish branch
git push origin $BRANCH:refs/heads/$BRANCH
git fetch origin
git config branch.$BRANCH.remote origin
git config branch.$BRANCH.merge refs/heads/$BRANCH
git co $BRANCH
echo
echo "Summary of actions:"
echo "- A new remote branch '$BRANCH' was created, based on '$BASE'"
echo "- A new tracking branch '$BRANCH' was created"
echo "- You are now on branch '$BRANCH'"
echo
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment