This guide walks you through installing and configuring Git Flow for your development workflow.
- Installing Git Flow on Ubuntu
- Initial Repository Setup
- Git Flow Branch Naming Conventions
- Understanding Git Flow
- Common Git Flow Commands
sudo apt update
sudo apt install git-flowsudo apt update
sudo apt install git-flow-avhgit flow versionFollow these steps to set up a new repository with Git Flow:
# Clone your repository
git clone https://github.com/YOUR_USERNAME/ALXprodev-advanced_git.git
cd ALXprodev-advanced_git
# Create and setup master branch
git checkout -b master
git commit --allow-empty -m "Initial commit"
git push -u origin master
# Create and setup develop branch
git checkout -b develop
git commit --allow-empty -m "Initial commit on develop"
git push -u origin develop
# Initialize git-flow with defaults
git flow init -d
# Create README.md
touch README.md
git add README.md
git commit -m "Add README.md"
git push origin developWhen you run git flow init (without the -d flag), you'll be prompted to configure branch prefixes:
How to name your supporting branch prefixes?
Feature branches? [feature/]
Bugfix branches? [bugfix/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
| Branch Type | Prefix | Purpose | Example |
|---|---|---|---|
| Feature | feature/ |
New features or enhancements | feature/user-authentication |
| Bugfix | bugfix/ |
Bug fixes during development | bugfix/login-error |
| Release | release/ |
Preparing for production release | release/1.0.0 |
| Hotfix | hotfix/ |
Critical fixes for production | hotfix/security-patch |
| Support | support/ |
Long-term support branches | support/v1.x |
| Version Tag | (empty) | Version tags for releases | 1.0.0, v2.1.3 |
Recommendation: Use the default prefixes unless you have specific team requirements.
Git Flow is a branching model that defines a strict branching structure designed around project releases.
-
master (or main): Production-ready code
- Contains official release history
- Every commit represents a new production release
- Tagged with version numbers
-
develop: Integration branch for features
- Contains the latest development changes
- Serves as the base for feature branches
- Merged into master for releases
- Branch from:
develop - Merge back into:
develop - Purpose: Develop new features
- Naming:
feature/*
# Start a new feature
git flow feature start user-login
# Finish a feature (merges back to develop)
git flow feature finish user-login- Branch from:
develop - Merge back into:
masteranddevelop - Purpose: Prepare for production release
- Naming:
release/*
# Start a release
git flow release start 1.0.0
# Finish a release
git flow release finish 1.0.0- Branch from:
master - Merge back into:
masteranddevelop - Purpose: Quick fixes for production issues
- Naming:
hotfix/*
# Start a hotfix
git flow hotfix start critical-bug
# Finish a hotfix
git flow hotfix finish critical-bugmaster ──●────────────●──────────●──────→
│ │ │
│ release/1.0 │
│ │ │
develop ───●──●──●──●──●──●──●────●──●──→
│ │ │
feature/ │ feature/
login │ payment
bugfix/
error
# Initialize with defaults
git flow init -d
# Initialize with custom settings
git flow init# List features
git flow feature list
# Start new feature
git flow feature start <feature-name>
# Publish feature to remote
git flow feature publish <feature-name>
# Finish feature
git flow feature finish <feature-name>
# Delete feature
git flow feature delete <feature-name># Start release
git flow release start <version>
# Publish release
git flow release publish <version>
# Finish release (creates tag)
git flow release finish <version># Start hotfix
git flow hotfix start <version>
# Finish hotfix
git flow hotfix finish <version># Keep branch after finishing
git flow feature finish -k <feature-name>
# Don't tag on release finish
git flow release finish -n <version>
# Force deletion
git flow feature delete -f <feature-name>- Never commit directly to master/main: Always use proper Git Flow branches
- Keep features small: Easier to review and merge
- Update develop regularly: Pull latest changes before starting new features
- Use descriptive names:
feature/add-user-authenticationnotfeature/fix - Clean up branches: Delete finished feature branches
- Tag releases: Use semantic versioning (e.g., 1.0.0, 1.1.0, 2.0.0)
- Test before finishing: Ensure features work before merging to develop
- Document in README: Keep this file updated with project-specific conventions
- Parallel Development: Multiple features can be developed simultaneously
- Organized Releases: Clear release preparation process
- Emergency Fixes: Hotfix support without disrupting development
- Clear History: Easy to track what was released and when
- Team Collaboration: Standardized workflow for all team members
Solution: Ensure master and develop branches exist before running git flow init
Solution: Make at least one commit before pushing a branch
Solution: Reinstall git-flow or check installation with git flow version
- Repository: ALXprodev-advanced_git
- Default Branch: develop
- Production Branch: master
- Git Flow Version: Check with
git flow version
Complete workflow for creating and pushing a feature branch:
# Ensure you're on develop branch
git checkout develop
# Create feature branch
git flow feature start implement-login
# Create directory and file
mkdir login-page
echo "Login Feature Coming soon" > login-page/README.md
# Stage, commit, and push
git add login-page/README.md
git commit -m "feat: scaffolding login page"
git push origin feature/implement-loginVerification:
# Check current branch
git branch
# Check file exists
cat login-page/README.md
# Check commit history
git log --oneline -1Complete workflow for creating a release, updating files, and tagging:
# Step 1: Create and push signup feature
git checkout develop
git flow feature start implement-signup
mkdir signup-page
echo "feature coming soon" > signup-page/README.md
git add signup-page/README.md
git commit -m "feat: scaffolding signup page"
git push origin feature/implement-signup
# Step 2: Merge features to develop
git flow feature finish implement-signup
git checkout develop
git fetch origin
git merge origin/feature/implement-login # If login feature exists on remote
git push origin develop
# Step 3: Create release branch
git flow release start 1.0.0
# Step 4: Update signup README with requirements
echo "feature coming soon data requirements: email, firstName, lastName, profilePic]" > signup-page/README.md
git add signup-page/README.md
git commit -m "docs: add data requirements to signup page"
git push origin release/1.0.0
# Step 5: Finish release and push everything
git flow release finish 1.0.0
# Enter tag message when prompted: "Release version 1.0.0"
git push origin main
git push origin develop
git push origin v1.0.0
# Or push all tags: git push --tagsAlternative Manual Merge (if git flow finish has issues):
# Merge release to main
git checkout main
git merge release/1.0.0
git push origin main
# Create and push tag
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0
# Merge release back to develop
git checkout develop
git merge release/1.0.0
git push origin develop
# Delete release branch
git branch -d release/1.0.0
git push origin --delete release/1.0.0Verification:
# Check all branches
git branch -a
# Check tags
git tag -l
# Verify main branch has both features
git checkout main
ls -la
cat signup-page/README.mdComplete setup for pre-commit and post-merge hooks:
# Navigate to repository root
cd /home/ALXprodev-advanced_git
# Create pre-commit hook (checks for README files in all directories)
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash
# Pre-commit hook: Check if each directory has a README file
echo "Running pre-commit hook: Checking for README files..."
# Get all directories in the repository (excluding .git)
directories=$(find . -type d -not -path '*/\.*' -not -path '.')
missing_readme=0
for dir in $directories; do
# Skip root directory
if [ "$dir" = "." ]; then
continue
fi
# Check if README.md or README exists in the directory
if [ ! -f "$dir/README.md" ] && [ ! -f "$dir/README" ]; then
echo "ERROR: Missing README file in directory: $dir"
missing_readme=1
fi
done
if [ $missing_readme -eq 1 ]; then
echo ""
echo "❌ Pre-commit hook failed!"
echo "Please add README.md files to all directories before committing."
exit 1
fi
echo "✅ All directories have README files."
exit 0
EOF
# Create post-merge hook (logs merges to main branch)
cat > .git/hooks/post-merge << 'EOF'
#!/bin/bash
# Post-merge hook: Log merge information
# Get current branch
current_branch=$(git rev-parse --abbrev-ref HEAD)
# Only log if we're on main/master branch
if [ "$current_branch" = "main" ] || [ "$current_branch" = "master" ]; then
# Create logs directory if it doesn't exist
log_dir=".git/logs/merge-logs"
mkdir -p "$log_dir"
# Log file path
log_file="$log_dir/merge-history.log"
# Get merge information
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
commit_hash=$(git rev-parse HEAD)
commit_message=$(git log -1 --pretty=%B)
author=$(git log -1 --pretty=%an)
# Log the merge
echo "================================" >> "$log_file"
echo "Merge completed on: $current_branch" >> "$log_file"
echo "Timestamp: $timestamp" >> "$log_file"
echo "Commit Hash: $commit_hash" >> "$log_file"
echo "Author: $author" >> "$log_file"
echo "Commit Message: $commit_message" >> "$log_file"
echo "================================" >> "$log_file"
echo "" >> "$log_file"
echo "✅ Merge logged successfully to $log_file"
fi
exit 0
EOF
# Make both hooks executable
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/post-merge
echo "✅ Git hooks installed successfully!"Test Pre-Commit Hook:
# Try to commit without README in a new directory
mkdir test-dir
touch test-dir/test.txt
git add test-dir/
git commit -m "test commit"
# Should fail with error message
# Fix it by adding README
echo "Test directory" > test-dir/README.md
git add test-dir/
git commit -m "test commit"
# Should succeedTest Post-Merge Hook:
# Create a test feature and merge to main
git checkout develop
git flow feature start test-hook
echo "test" > test-file.txt
git add test-file.txt
git commit -m "test: hook testing"
git flow feature finish test-hook
# Merge to main to trigger post-merge hook
git checkout main
git merge develop
# Check the log file
cat .git/logs/merge-logs/merge-history.logVerify Hook Installation:
# Check if hooks exist and are executable
ls -la .git/hooks/pre-commit
ls -la .git/hooks/post-merge
# View hook contents
cat .git/hooks/pre-commit
cat .git/hooks/post-mergeWhat These Hooks Do:
-
Pre-Commit Hook:
- Runs before every commit
- Scans all directories in the repository
- Checks if each directory has a README.md or README file
- Blocks the commit if any directory is missing a README
- Provides clear error messages
-
Post-Merge Hook:
- Runs after every successful merge
- Only activates when merging into main/master branch
- Logs merge details to
.git/logs/merge-logs/merge-history.log - Records: timestamp, commit hash, author, and commit message