I added this git workflow that I made for a project I have on my GitHub. I created the project to track projects using GitHub so I could learn Git along with using a new task management process that I created. Most of this is relevant for any Git, but keep in mind it was created for specifically my task management on Github.
717 lines
17 KiB
Markdown
717 lines
17 KiB
Markdown
# Git Workflow Guide for Life Planner
|
|
|
|
## Table of Contents
|
|
|
|
### 1. Quick Reference Guides
|
|
- [Life Planner Git Workflow Cheat Sheet](#life-planner-git-workflow-cheat-sheet)
|
|
- [Start Day Process](#start-day-process)
|
|
- [Start Task Process](#start-task-process)
|
|
- [Save Work Process](#save-work-process)
|
|
- [Complete Task Process](#complete-task-process)
|
|
- [End Day Process](#end-day-process)
|
|
|
|
### 2. Error Resolution Guides
|
|
- [Start of Day Errors](#start-of-day-errors)
|
|
- [Branch Already Exists](#branch-already-exists)
|
|
- [Uncommitted Changes](#uncommitted-changes)
|
|
- [Local Changes Overwrite](#local-changes-overwrite)
|
|
- [Branch Name Mismatch](#branch-name-mismatch)
|
|
- [End of Day Errors](#end-of-day-errors)
|
|
- [Push Rejection Handling](#push-rejection-handling)
|
|
- [Merge Conflict Resolution](#merge-conflict-resolution)
|
|
|
|
### 3. Detailed Workflow Processes
|
|
- [Starting Work for the Day](#starting-work-for-the-day)
|
|
- [Working on Tasks](#working-on-tasks)
|
|
- [Handling Remote Changes](#handling-remote-changes)
|
|
- [End of Day Procedures](#end-of-day-procedures)
|
|
|
|
### 4. File Management
|
|
- [Local vs Remote Changes](#local-vs-remote-changes)
|
|
- [Viewing Differences](#viewing-differences)
|
|
- [Keeping Remote Changes](#keeping-remote-changes)
|
|
- [Keeping Local Changes](#keeping-local-changes)
|
|
- [Comparing Files](#comparing-files)
|
|
|
|
### 5. Scripts and Automation
|
|
- [Project Status Scripts](#project-status-scripts)
|
|
- [Check Project Status](#check-project-status)
|
|
- [Start Working on Project](#start-working-on-project)
|
|
- [Update Task Status](#update-task-status)
|
|
- [End of Day Commit](#end-of-day-commit)
|
|
- [Task Management Commands](#task-management-commands)
|
|
- [Report Generation](#report-generation)
|
|
|
|
### 6. Reference
|
|
- [Common Commit Messages](#common-commit-messages)
|
|
- [Status Check Commands](#status-check-commands)
|
|
- [Installation Instructions](#installation-instructions)
|
|
- [Usage Examples](#usage-examples)
|
|
|
|
---
|
|
|
|
# 1. Quick Reference Guides
|
|
|
|
## Life Planner Git Workflow Cheat Sheet
|
|
|
|
### Start Day Process
|
|
```markdown
|
|
START DAY:
|
|
1. git checkout main
|
|
2. git pull
|
|
3. git checkout -b working_projectname_YYYYMMDD
|
|
```
|
|
|
|
### Start Task Process
|
|
```markdown
|
|
START TASK:
|
|
4. git status
|
|
5. Update task status to WORKING
|
|
```
|
|
|
|
### Save Work Process
|
|
```markdown
|
|
SAVE WORK:
|
|
6. git add filename.md (or git add .)
|
|
7. git commit -m "message"
|
|
```
|
|
|
|
### Complete Task Process
|
|
```markdown
|
|
COMPLETE TASK:
|
|
8. Update task status to CLOSED
|
|
9. git add filename.md
|
|
10. git commit -m "Completed task message"
|
|
```
|
|
|
|
### End Day Process
|
|
```markdown
|
|
END DAY:
|
|
11. git checkout main
|
|
12. git merge working_projectname_YYYYMMDD
|
|
13. git push
|
|
14. git branch -d working_projectname_YYYYMMDD
|
|
```
|
|
|
|
[Back to Top](#git-workflow-guide-for-life-planner)
|
|
|
|
---
|
|
|
|
# 2. Error Resolution Guides
|
|
|
|
## Start of Day Errors
|
|
|
|
### Branch Already Exists
|
|
```bash
|
|
1. git checkout main # Return to main branch
|
|
2. git branch -D working_projectname_YYYYMMDD # Delete existing branch
|
|
3. git checkout -b working_projectname_YYYYMMDD # Create new branch
|
|
```
|
|
|
|
### Uncommitted Changes
|
|
```bash
|
|
1. git stash # Save current changes
|
|
2. git checkout main # Switch to main
|
|
3. git pull origin main # Get updates
|
|
4. git checkout -b working_projectname_YYYYMMDD # Create new branch
|
|
5. git stash pop # Restore your changes
|
|
```
|
|
|
|
### Local Changes Overwrite
|
|
```bash
|
|
1. git add . # Stage current changes
|
|
2. git commit -m "WIP - Saving current progress" # Save changes
|
|
3. git checkout main # Then proceed with normal process
|
|
```
|
|
|
|
### Branch Name Mismatch
|
|
```bash
|
|
1. git branch # Check existing branches
|
|
2. git checkout main # Ensure on main
|
|
3. git pull origin main # Get latest changes
|
|
4. git checkout -b working_projectname_YYYYMMDD # Create new branch (check spelling)
|
|
```
|
|
|
|
## End of Day Errors
|
|
|
|
### Push Rejection Handling
|
|
```bash
|
|
# When you see the error in your image:
|
|
1. git pull origin main # Get remote changes
|
|
2. git merge main # Merge them into your branch
|
|
3. git push origin main # Try pushing again
|
|
```
|
|
|
|
### Merge Conflict Resolution
|
|
If you get conflicts during the merge:
|
|
1. Open the conflicted files
|
|
2. Look for conflict markers (<<<<<<, =======, >>>>>>>)
|
|
3. Edit the files to resolve conflicts
|
|
4. Save the files
|
|
5. `git add .` to mark conflicts as resolved
|
|
6. `git commit -m "Resolved merge conflicts"`
|
|
|
|
[Back to Top](#git-workflow-guide-for-life-planner)
|
|
|
|
---
|
|
|
|
# 3. Detailed Workflow Processes
|
|
|
|
## Starting Work for the Day
|
|
1. `git checkout main`
|
|
- Switch to main branch to ensure you're starting from the latest version
|
|
|
|
2. `git pull`
|
|
- Get any updates that might have been made elsewhere
|
|
|
|
3. `git checkout -b working_projectname_YYYYMMDD`
|
|
- Create and switch to a new branch for today's work
|
|
- Example: `git checkout -b working_financial_20231031`
|
|
|
|
## Working on Tasks
|
|
|
|
### Before Starting a Task
|
|
1. `git status`
|
|
- Check which files have been modified
|
|
- Verify you're on the correct branch
|
|
|
|
2. Update task status in markdown file
|
|
- Change task status tag from OPEN to WORKING
|
|
- Example: `tags: [WORKING, MS1_Tiller_Account_Setup]`
|
|
|
|
### While Working
|
|
1. `git add filename.md`
|
|
- Stage specific files you've modified
|
|
- Or use `git add .` to stage all changes
|
|
|
|
2. `git commit -m "Meaningful commit message"`
|
|
- Save your changes with a clear message
|
|
- Example: "Updated Task 1.1 status to WORKING"
|
|
|
|
## Handling Remote Changes
|
|
|
|
### Process for Remote Updates
|
|
1. First, stage your local changes:
|
|
```bash
|
|
git add .
|
|
git commit -m "End of day changes - YYYY-MM-DD"
|
|
```
|
|
|
|
2. Switch to main branch:
|
|
```bash
|
|
git checkout main
|
|
```
|
|
|
|
3. Get remote changes BEFORE merging your work:
|
|
```bash
|
|
git pull origin main
|
|
```
|
|
|
|
4. Switch back to your working branch:
|
|
```bash
|
|
git checkout working_projectname_YYYYMMDD
|
|
```
|
|
|
|
5. Integrate main's changes into your working branch:
|
|
```bash
|
|
git merge main
|
|
```
|
|
- Resolve any conflicts if they occur
|
|
|
|
## End of Day Procedures
|
|
|
|
### Finishing a Task
|
|
1. Update task status to CLOSED
|
|
- Change task status tag to CLOSED
|
|
- Example: `tags: [CLOSED, MS1_Tiller_Account_Setup]`
|
|
|
|
2. Stage and commit the status change:
|
|
```bash
|
|
git add filename.md
|
|
git commit -m "Completed Task 1.1 - [Brief description]"
|
|
```
|
|
|
|
### Final Steps
|
|
1. Switch to main branch:
|
|
```bash
|
|
git checkout main
|
|
```
|
|
|
|
2. Merge your work:
|
|
```bash
|
|
git merge working_projectname_YYYYMMDD
|
|
```
|
|
|
|
3. Push changes:
|
|
```bash
|
|
git push origin main
|
|
```
|
|
|
|
4. Clean up:
|
|
```bash
|
|
git branch -d working_projectname_YYYYMMDD
|
|
```
|
|
|
|
[Back to Top](#git-workflow-guide-for-life-planner)
|
|
|
|
---
|
|
|
|
# 4. File Management
|
|
|
|
## Local vs Remote Changes
|
|
|
|
### Viewing Differences
|
|
```bash
|
|
# See what's different between your local file and remote
|
|
git diff workflow_overview.md
|
|
|
|
# For a more detailed view
|
|
git diff origin/main workflow_overview.md
|
|
|
|
# View file content differences
|
|
git diff --word-diff workflow_overview.md
|
|
```
|
|
|
|
### Keeping Remote Changes
|
|
```bash
|
|
# Option 1: Discard local changes for specific file
|
|
git checkout origin/main workflow_overview.md
|
|
|
|
# Option 2: Force overwrite local with remote
|
|
git fetch origin
|
|
git reset --hard origin/main
|
|
```
|
|
⚠️ WARNING: `reset --hard` will discard ALL local changes!
|
|
|
|
### Keeping Local Changes
|
|
```bash
|
|
# Stash your local changes
|
|
git stash
|
|
|
|
# Pull remote changes
|
|
git pull
|
|
|
|
# Then decide:
|
|
git stash pop # Apply your local changes back
|
|
# or
|
|
git stash drop # Discard your local changes
|
|
```
|
|
|
|
### Comparing Files
|
|
|
|
#### View Current Changes
|
|
```bash
|
|
# View local file content
|
|
cat workflow_overview.md
|
|
|
|
# View remote file content
|
|
git show origin/main:workflow_overview.md
|
|
|
|
# Compare specific versions
|
|
git diff HEAD~1 workflow_overview.md # Compare with previous version
|
|
```
|
|
|
|
#### Quick Solutions for Common Scenarios
|
|
|
|
##### To Overwrite Local with Remote:
|
|
```bash
|
|
# For specific file
|
|
1. git checkout origin/main workflow_overview.md
|
|
2. git pull
|
|
|
|
# For all files
|
|
1. git fetch origin
|
|
2. git reset --hard origin/main
|
|
```
|
|
|
|
##### To Keep Both and Decide Later:
|
|
```bash
|
|
1. git stash
|
|
2. git pull
|
|
3. git stash pop
|
|
4. # Resolve any conflicts manually
|
|
```
|
|
|
|
##### To Compare and Decide:
|
|
```bash
|
|
# View differences
|
|
git diff workflow_overview.md
|
|
|
|
# Keep remote version
|
|
git checkout origin/main workflow_overview.md
|
|
|
|
# Or keep local and commit
|
|
git add workflow_overview.md
|
|
git commit -m "Keeping local changes to workflow_overview.md"
|
|
git pull
|
|
```
|
|
|
|
#### Best Practices for File Management
|
|
1. Always check status before making changes:
|
|
```bash
|
|
git status
|
|
```
|
|
|
|
2. Review changes before committing:
|
|
```bash
|
|
git diff --staged # For staged changes
|
|
git diff # For unstaged changes
|
|
```
|
|
|
|
3. Use meaningful commit messages:
|
|
```bash
|
|
git commit -m "Updated workflow documentation with new file management section"
|
|
```
|
|
|
|
4. Regularly sync with remote:
|
|
```bash
|
|
git fetch origin
|
|
git status # Check if you're behind/ahead
|
|
```
|
|
|
|
[Back to Top](#git-workflow-guide-for-life-planner)
|
|
|
|
---
|
|
|
|
# 5. Scripts and Automation
|
|
|
|
## Project Status Scripts
|
|
|
|
### Check Project Status
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
echo "=== Current Project Statuses ==="
|
|
echo "-------------------------------"
|
|
|
|
# Find all README.md files and check their status tags
|
|
find . -name "README.md" -type f -exec sh -c '
|
|
echo "Project: $(dirname {})"
|
|
grep -H "STATUS:" {} 2>/dev/null
|
|
echo
|
|
' \;
|
|
|
|
echo "=== Active (WORKING) Tasks ==="
|
|
echo "-----------------------------"
|
|
find . -name "*.md" -type f -exec sh -c '
|
|
if grep -l "tags: .*WORKING" "$0" >/dev/null; then
|
|
echo "File: $0"
|
|
head -n 3 "$0"
|
|
echo "---"
|
|
fi
|
|
' {} \;
|
|
```
|
|
|
|
### Start Working on Project
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
start_project() {
|
|
local project_name=$1
|
|
|
|
# Create and checkout new branch
|
|
git checkout -b "working_${project_name}_$(date +%Y%m%d)"
|
|
|
|
# Show current tasks in project
|
|
echo "Current tasks in $project_name:"
|
|
find "$project_name" -name "*.md" -type f -exec sh -c '
|
|
echo "=== $(basename $1) ==="
|
|
grep "tags:" "$1" 2>/dev/null
|
|
echo
|
|
' sh {} \;
|
|
}
|
|
|
|
# Usage: ./start_project.sh project_name
|
|
start_project "$1"
|
|
```
|
|
|
|
### Update Task Status
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
update_task_status() {
|
|
local task_file=$1
|
|
local new_status=$2
|
|
|
|
# Update status in task file
|
|
sed -i "s/tags: \[.*\]/tags: [$new_status/" "$task_file"
|
|
|
|
# Add to git
|
|
git add "$task_file"
|
|
|
|
echo "Updated status of $task_file to $new_status"
|
|
}
|
|
|
|
# Usage: ./update_task.sh task_file.md WORKING
|
|
update_task_status "$1" "$2"
|
|
```
|
|
|
|
### End of Day Commit
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
end_day_commit() {
|
|
# Get current branch
|
|
current_branch=$(git branch --show-current)
|
|
|
|
# Generate work summary
|
|
echo "=== Work Summary $(date +%Y-%m-%d) ===" > work_summary.tmp
|
|
echo "Branch: $current_branch" >> work_summary.tmp
|
|
echo "" >> work_summary.tmp
|
|
|
|
# Find all modified files
|
|
echo "Modified Tasks:" >> work_summary.tmp
|
|
git diff --name-only | while read -r file; do
|
|
if [[ $file == *.md ]]; then
|
|
echo "- $file" >> work_summary.tmp
|
|
grep "tags:" "$file" >> work_summary.tmp
|
|
fi
|
|
done
|
|
|
|
# Create commit message
|
|
commit_msg=$(cat work_summary.tmp)
|
|
|
|
# Commit changes
|
|
git add .
|
|
git commit -m "$commit_msg"
|
|
|
|
# Merge back to main
|
|
git checkout main
|
|
git merge "$current_branch"
|
|
|
|
# Clean up
|
|
rm work_summary.tmp
|
|
|
|
echo "Day's work committed and merged"
|
|
}
|
|
|
|
end_day_commit
|
|
```
|
|
|
|
## Task Management Commands
|
|
```bash
|
|
# Show all WORKING tasks
|
|
find . -type f -name "*.md" -exec sh -c '
|
|
if grep -l "tags: .*WORKING" "$0" >/dev/null; then
|
|
echo "=== $0 ==="
|
|
head -n 5 "$0"
|
|
echo
|
|
fi
|
|
' {} \;
|
|
|
|
# Show tasks by milestone
|
|
find . -type f -name "*.md" -exec sh -c '
|
|
if grep -l "tags: .*MS1" "$0" >/dev/null; then
|
|
echo "=== $0 ==="
|
|
grep "tags:" "$0"
|
|
echo
|
|
fi
|
|
' {} \;
|
|
```
|
|
|
|
## Report Generation
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
generate_report() {
|
|
local report_file="progress_report_$(date +%Y%m%d).md"
|
|
|
|
echo "# Progress Report $(date +%Y-%m-%d)" > "$report_file"
|
|
echo "" >> "$report_file"
|
|
|
|
# Project Status Summary
|
|
echo "## Project Status" >> "$report_file"
|
|
find . -name "README.md" -type f -exec sh -c '
|
|
echo "### $(dirname {})"
|
|
grep "STATUS:" {} 2>/dev/null
|
|
echo
|
|
' >> "$report_file" \;
|
|
|
|
# Task Status by Milestone
|
|
echo "## Task Status by Milestone" >> "$report_file"
|
|
for milestone in MS{1..7}; do
|
|
echo "### $milestone" >> "$report_file"
|
|
echo "#### WORKING:" >> "$report_file"
|
|
find . -type f -name "*.md" -exec grep -l "tags: .*WORKING.*$milestone" {} \; >> "$report_file"
|
|
echo "#### CLOSED:" >> "$report_file"
|
|
find . -type f -name "*.md" -exec grep -l "tags: .*CLOSED.*$milestone" {} \; >> "$report_file"
|
|
echo "" >> "$report_file"
|
|
done
|
|
|
|
echo "Report generated: $report_file"
|
|
}
|
|
|
|
generate_report
|
|
```
|
|
|
|
[Back to Top](#git-workflow-guide-for-life-planner)
|
|
|
|
---
|
|
|
|
# 6. Reference
|
|
|
|
## Common Commit Messages
|
|
```markdown
|
|
# Starting Task
|
|
"Started work on Task X.X - Brief description"
|
|
"Initialized Task X.X - Setting up environment"
|
|
|
|
# Status Updates
|
|
"Updated Task X.X status to WORKING"
|
|
"Updated Task X.X status to CLOSED"
|
|
"In progress: Task X.X - Current status update"
|
|
|
|
# Task Completion
|
|
"Completed Task X.X - Brief description of accomplishment"
|
|
"Finished Task X.X - Added all requested features"
|
|
|
|
# End of Day
|
|
"End of day commit - Tasks X.X, X.X completed"
|
|
"Daily progress - Multiple task updates"
|
|
|
|
# WIP (Work in Progress)
|
|
"WIP: Task X.X - Saving current progress"
|
|
"WIP: Intermediate save for Task X.X"
|
|
```
|
|
|
|
## Status Check Commands
|
|
```bash
|
|
# Basic Status Checks
|
|
git status # Current working state
|
|
git log --oneline # Commit history in compact form
|
|
git branch # List all branches
|
|
git remote -v # Show remote repositories
|
|
|
|
# Detailed Checks
|
|
git log --graph --decorate # Visual commit history
|
|
git diff --name-status # List of changed files
|
|
git show HEAD # Latest commit details
|
|
git remote show origin # Remote branch details
|
|
|
|
# Branch Information
|
|
git branch -vv # Verbose branch info
|
|
git branch --merged # Show merged branches
|
|
git branch --no-merged # Show unmerged branches
|
|
|
|
# File History
|
|
git log --follow filename # File history including renames
|
|
git blame filename # Line-by-line change history
|
|
```
|
|
|
|
## Installation Instructions
|
|
|
|
### 1. Initial Setup
|
|
```bash
|
|
# Make scripts directory
|
|
mkdir -p ~/life_planner/scripts
|
|
|
|
# Copy all scripts
|
|
cp *.sh ~/life_planner/scripts/
|
|
|
|
# Make scripts executable
|
|
chmod +x ~/life_planner/scripts/*.sh
|
|
```
|
|
|
|
### 2. Configure Git
|
|
```bash
|
|
# Set up user information
|
|
git config --global user.name "Your Name"
|
|
git config --global user.email "your.email@example.com"
|
|
|
|
# Set default branch name
|
|
git config --global init.defaultBranch main
|
|
|
|
# Set up aliases for common commands
|
|
git config --global alias.st status
|
|
git config --global alias.co checkout
|
|
git config --global alias.br branch
|
|
git config --global alias.ci commit
|
|
```
|
|
|
|
### 3. Script Installation
|
|
```bash
|
|
# Add to PATH (add to .bashrc or .zshrc)
|
|
export PATH="$PATH:$HOME/life_planner/scripts"
|
|
|
|
# Verify installation
|
|
which start_project.sh
|
|
which update_task.sh
|
|
which end_day_commit.sh
|
|
```
|
|
|
|
## Usage Examples
|
|
|
|
### Daily Workflow Example
|
|
```bash
|
|
# Morning Start
|
|
git checkout main
|
|
git pull
|
|
git checkout -b working_financial_20231101
|
|
|
|
# Start New Task
|
|
vim task1.md # Edit task status to WORKING
|
|
git add task1.md
|
|
git commit -m "Started Task 1.1 - Setting up Tiller"
|
|
|
|
# Complete Task
|
|
vim task1.md # Edit task status to CLOSED
|
|
git add task1.md
|
|
git commit -m "Completed Task 1.1 - Tiller setup complete"
|
|
|
|
# End of Day
|
|
git checkout main
|
|
git pull
|
|
git merge working_financial_20231101
|
|
git push
|
|
git branch -d working_financial_20231101
|
|
```
|
|
|
|
### Using Automation Scripts
|
|
```bash
|
|
# Start new project work
|
|
./start_project.sh financial_planning
|
|
|
|
# Update task status
|
|
./update_task.sh task1.md WORKING
|
|
./update_task.sh task1.md CLOSED
|
|
|
|
# Generate daily report
|
|
./generate_report.sh
|
|
|
|
# End of day commit
|
|
./end_day_commit.sh
|
|
```
|
|
|
|
### Common Scenarios
|
|
|
|
#### Handling Interruptions
|
|
```bash
|
|
# Save current work
|
|
git add .
|
|
git commit -m "WIP: Saving progress on Task 1.1"
|
|
|
|
# Switch to urgent task
|
|
git checkout -b urgent_fix
|
|
# ... work on urgent task ...
|
|
|
|
# Return to previous work
|
|
git checkout working_financial_20231101
|
|
```
|
|
|
|
#### Managing Multiple Tasks
|
|
```bash
|
|
# List all active tasks
|
|
find . -name "*.md" -exec grep -l "tags: .*WORKING" {} \;
|
|
|
|
# Check task status
|
|
git status
|
|
git diff --name-only
|
|
|
|
# Review day's changes
|
|
git log --since="6am" --oneline
|
|
```
|
|
|
|
[Back to Top](#git-workflow-guide-for-life-planner)
|
|
|
|
---
|