Introduction to GitHub
In our previous lectures, we've focused on Git as a distributed version control system. While Git provides the foundation for version control, GitHub extends this foundation to create a collaborative development platform that has become central to modern software development.
GitHub is not just a place to store your codeβit's a comprehensive platform that facilitates collaboration, project management, continuous integration, and much more. Think of Git as the engine and GitHub as the entire vehicle built around it, complete with navigation, safety features, and a comfortable interior.
Today, we'll explore the GitHub platform, understanding its core features and how they enhance the development workflow. By the end of this lecture, you'll understand how GitHub transforms Git from a version control system into a collaborative development environment.
GitHub vs. Git: Understanding the Relationship
Before diving into GitHub's features, let's clarify the relationship between Git and GitHub, as well as how GitHub fits into the broader landscape of Git hosting services.
Git: The Distributed Version Control System
Git is:
- A distributed version control system
- Command-line software that runs locally on your computer
- Open-source software maintained by the Git community
- Independent of any hosting service
- Focused on tracking changes to files over time
GitHub: A Git Repository Hosting Service
GitHub is:
- A cloud-based hosting service for Git repositories
- A web-based platform with a graphical interface
- A commercial product owned by Microsoft (since 2018)
- Built on top of Git, extending its functionality
- Focused on collaboration and workflow enhancement
GitHub Alternatives
While GitHub is the most popular Git hosting platform, there are several alternatives:
| Platform | Key Features | Best For |
|---|---|---|
| GitLab | Built-in CI/CD, integrated DevOps tools | Enterprise teams wanting a complete DevOps platform |
| Bitbucket | Tight integration with other Atlassian tools | Teams already using Jira, Confluence, etc. |
| Gitea | Lightweight, self-hosted option | Organizations needing on-premises hosting |
| SourceForge | Traditional open-source project hosting | Established open-source projects |
| Azure DevOps | Microsoft ecosystem integration | Teams heavily invested in Microsoft tools |
While we'll focus on GitHub in this lecture, many of the concepts we discuss apply to other platforms as well.
Why GitHub Has Become the Industry Standard
GitHub has established itself as the de facto standard for several reasons:
- Network Effect: With over 100 million repositories and 65+ million users, it's where the developer community gathers
- Open Source Hub: Hosts most major open-source projects, creating a virtuous cycle of adoption
- User Experience: Intuitive interface that simplifies Git operations
- Integration Ecosystem: Vast array of third-party tools and services that integrate with GitHub
- Continuous Innovation: Regular introduction of new features like Actions, Codespaces, and Copilot
- Free Tier: Generous free offerings for individuals and small teams
Getting Started with GitHub
Let's walk through the process of getting started with GitHub, from creating an account to setting up your first repository.
Creating a GitHub Account
- Visit github.com and click "Sign up"
- Enter your email address
- Create a password
- Choose a username (this will be your GitHub identity and URL: github.com/username)
- Verify your account through the email verification process
- Choose your plan (Free, Team, Enterprise)
- Complete the questionnaire to personalize your experience (optional)
Tips for Choosing a Username:
- Professional and recognizable
- Consistent with your online presence on other platforms
- Easy to remember and type
- Avoid numbers and special characters when possible
- Consider using your real name or a consistent handle
Setting Up Your Profile
Your GitHub profile is your professional identity in the developer community. Take time to set it up properly:
- Upload a profile picture (preferably professional)
- Add your name and bio
- Include your location and company (if applicable)
- Add your website or social media links
- Set up a profile README (special repository with your username)
Profile README Example:
# Hi there π, I'm Jane Developer
Senior Frontend Developer passionate about creating accessible, user-friendly web experiences.
## π Current Work
- Leading the UI team at TechCorp
- Building an open-source design system
## π οΈ Technologies
JavaScript | React | TypeScript | CSS/SASS | Node.js | GraphQL
## π« Contact Me
- Twitter: [@janedeveloper](https://twitter.com/janedeveloper)
- LinkedIn: [Jane Developer](https://linkedin.com/in/janedeveloper)
- Website: [janedeveloper.com](https://janedeveloper.com)
## π GitHub Stats

To create this special README:
- Create a new repository with the exact same name as your GitHub username
- Add a README.md file to this repository
- This README will automatically appear on your profile page
Setting Up SSH Authentication
Using SSH keys is more secure and convenient than password authentication:
- Check for existing SSH keys:
ls -la ~/.ssh - Generate a new SSH key if needed:
ssh-keygen -t ed25519 -C "your_email@example.com" - Start the SSH agent:
eval "$(ssh-agent -s)" - Add your private key to the SSH agent:
ssh-add ~/.ssh/id_ed25519 - Copy your public key to clipboard (Mac):
Or Windows:pbcopy < ~/.ssh/id_ed25519.pub
Or Linux:clip < ~/.ssh/id_ed25519.pub
then copy the outputcat ~/.ssh/id_ed25519.pub - In GitHub, go to Settings β SSH and GPG keys β New SSH Key
- Paste your public key and add a descriptive title
- Test your connection:
ssh -T git@github.com
Creating Your First Repository
Let's create a repository on GitHub and connect it to your local machine:
Creating a New Repository on GitHub
- Click the "+" icon in the upper-right corner and select "New repository"
- Enter a repository name (use kebab-case or snake_case)
- Add an optional description
- Choose public or private
- Public: Anyone can see the repository, but you control who can commit
- Private: You choose who can see and commit to the repository
- Initialize with a README (recommended for new projects)
- Add a .gitignore file (select a template based on your project type)
- Choose a license (important for open-source projects)
- Click "Create repository"
Connecting an Existing Local Repository
# Navigate to your local repository
cd my-project
# Add the GitHub repository as a remote
git remote add origin git@github.com:username/repository-name.git
# Verify the remote was added
git remote -v
# Push your local repository to GitHub
git push -u origin main
Cloning an Existing Repository
# Clone the repository to your local machine
git clone git@github.com:username/repository-name.git
# Navigate into the cloned repository
cd repository-name
GitHub Repository Structure and Features
Let's explore the structure and features of a GitHub repository, which is the central unit of organization on the platform.
Repository Overview
A GitHub repository includes several key sections and features:
File Navigation and Exploration
The Code tab is where you navigate the files and directories in your repository:
- Directory Browsing: Click on folders to navigate the repository structure
- File Viewing: Click on files to view their contents
- Text files are displayed with syntax highlighting
- Images are displayed inline
- PDFs and other documents may have preview capabilities
- Large files or binary files may only be downloadable
- Blame View: Shows who last modified each line of a file
- Raw View: Shows the raw content without formatting
- History: Shows the commit history for a specific file
- Web Editor: Allows editing files directly in the browser
- Download: Allows downloading individual files
The repository also provides powerful search capabilities for finding specific content within your code.
Repository Insights
The Insights tab provides valuable analytics about your repository:
- Pulse: Activity overview for a selected time period
- Contributors: Who contributed to the repository and how much
- Community: Profile scoring the repository's community health
- Traffic: Views and clones statistics
- Commits: Commit activity over time
- Code Frequency: Additions and deletions over time
- Dependency Graph: Visual representation of the project's dependencies
- Network: Visualization of the repository's branches and forks
These insights help you understand how your project is growing and being used.
Branch Management
GitHub provides several features for managing branches:
- Default Branch: The primary branch where all changes eventually merge (typically main)
- Branch List: Overview of all branches in the repository
- Branch Comparison: Compare changes between branches
- Branch Protection: Rules to prevent direct changes to important branches
- Require pull request reviews before merging
- Require status checks to pass before merging
- Require signed commits
- Include administrators in restrictions
- Branch Creation: Create new branches directly from the web interface
Branch protection rules are particularly important for team projects to maintain code quality and stability.
Repository Settings and Configuration
The Settings tab provides extensive configuration options:
- General: Repository name, visibility, features, merge strategies
- Collaborators: Add and manage repository contributors
- Branches: Configure branch protection rules
- Webhooks: Set up integrations with external services
- Pages: Configure GitHub Pages for static site hosting
- Security & Analysis: Security settings and vulnerability alerts
- Actions: Configure GitHub Actions settings
- Secrets: Store sensitive information for use in workflows
- Tags: Organize repositories with topics
These settings allow you to customize your repository for your specific project needs.
Collaboration on GitHub
GitHub's collaborative features are what truly set it apart from using Git alone. Let's explore how GitHub facilitates teamwork and community contributions.
Issues: Tracking Work and Bugs
Issues are a powerful way to track ideas, enhancements, tasks, and bugs for your projects:
Issue Components
- Title: A clear, concise description of the issue
- Description: Detailed information about the issue, often following a template
- Labels: Categorize issues (bug, enhancement, documentation, etc.)
- Assignees: People responsible for addressing the issue
- Milestone: Groups issues planned for a specific release or phase
- Comments: Discussion about the issue
- Task Lists: Checkboxes for tracking sub-tasks
Issue Templates
You can create templates for common issue types to ensure contributors provide all necessary information:
---
name: Bug Report
about: Create a report to help us improve
title: '[BUG] '
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment:**
- OS: [e.g. iOS]
- Browser: [e.g. chrome, safari]
- Version: [e.g. 22]
**Additional context**
Add any other context about the problem here.
To add issue templates to your repository, create a .github/ISSUE_TEMPLATE/ directory and add template files.
Linking Issues and PRs
GitHub provides several ways to link issues to the code that resolves them:
- Manually reference issues in pull requests (
#123) - Use keywords in commit messages or PR descriptions:
fixes #123closes #123resolves #123
- Create branches directly from issues
Pull Requests: The Collaboration Workflow
Pull requests (PRs) are the heart of the GitHub collaboration model. They provide a mechanism to discuss and review code changes before they're merged into the main codebase.
Anatomy of a Pull Request
- Title: A clear description of the changes
- Description: Detailed explanation of what the changes do and why
- Base and Compare Branches: The source and target branches for the changes
- Commits: The list of commits included in the PR
- Files Changed: The specific files and lines modified
- Conversation: Discussion about the changes
- Reviews: Feedback from other team members
- Checks: Automated tests and validations
Pull Request Templates
Similar to issue templates, PR templates help ensure contributors provide necessary information:
---
name: Feature Pull Request
about: Submit a new feature
---
## Description
Please provide a brief description of the changes in this pull request.
## Related Issue
Fixes #(issue)
## Type of Change
- [ ] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
## How Has This Been Tested?
Please describe the tests that you ran to verify your changes.
## Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
To add a PR template, create a .github/PULL_REQUEST_TEMPLATE.md file in your repository.
The Pull Request Workflow
- Create a Branch: Start by creating a branch for your changes
git checkout -b feature/new-login-page - Make Changes: Implement your feature or fix
git add . git commit -m "Implement new login page design" - Push to GitHub: Upload your branch
git push -u origin feature/new-login-page - Create Pull Request: On GitHub, navigate to your repository and click "Compare & pull request"
- Request Reviews: Add reviewers who should provide feedback
- Address Feedback: Make changes based on reviewer comments
git add . git commit -m "Address review feedback" git push - Merge: Once approved, merge the PR into the target branch
Code Review Best Practices
- Be Thorough: Look at logic, security, performance, and style
- Be Specific: Comment on particular lines rather than general statements
- Be Constructive: Suggest improvements, not just point out problems
- Be Respectful: Focus on the code, not the person
- Ask Questions: If something is unclear, ask for clarification
- Praise Good Work: Acknowledge well-implemented features or fixes
GitHub Discussions
Discussions provide a forum-like space for conversations that don't fit neatly into issues or pull requests:
- Q&A: Community questions and answers
- Announcements: Project updates and news
- Ideas: Brainstorming and feedback
- Show and Tell: Share what you've built with the project
- General: Any other discussions
Discussions are particularly valuable for open-source projects to build community beyond just code contributions.
Collaboration and Permissions
GitHub provides granular control over who can do what in your repository:
Permission Levels
- Read: Can view and clone the repository
- Triage: Can manage issues and PRs without write access
- Write: Can push to the repository and manage issues and PRs
- Maintain: Can manage repository without access to sensitive or destructive actions
- Admin: Full control of the repository, including sensitive and destructive actions
Adding Collaborators
To add collaborators to your repository:
- Go to your repository's Settings tab
- Click "Collaborators" in the sidebar
- Click "Add people" and search for the GitHub username
- Select the appropriate permission level
Organization Teams
For larger projects, GitHub Organizations provide team-based access control:
- Create teams of contributors
- Assign repository permissions to entire teams
- Nest teams for hierarchical permission structures
- Mention teams with @team-name to notify all members
GitHub Project Management
Beyond code and collaboration, GitHub provides robust project management features that help teams organize and track their work.
GitHub Projects
GitHub Projects is a flexible project management tool that integrates with issues and pull requests:
Project Types
- Project Board: Kanban-style board with customizable columns
- Table View: Spreadsheet-like view for detailed tracking
- Roadmap View: Timeline visualization of work
Project Board Example
Project Features
- Custom Fields: Add metadata like priority, story points, or due dates
- Automations: Automatically move items based on status changes
- Filtering: Focus on specific types of work or assignees
- Grouping: Organize items by label, assignee, or other criteria
- Progress Tracking: Visualize completion rate and timeline
Creating a Project
- Go to your repository or organization
- Click on the "Projects" tab
- Click "New project"
- Choose a template or start from scratch
- Configure columns and automation
- Add issues and pull requests to the project
Milestones
Milestones help group issues and pull requests into defined goals or phases:
- Creation: Define a milestone with a title, description, and due date
- Assignment: Assign issues and pull requests to the milestone
- Tracking: Monitor progress as issues are closed
- Completion: Close the milestone when all issues are resolved
Milestones are particularly useful for tracking progress towards a specific release or deadline.
GitHub Actions for Project Automation
GitHub Actions can automate project management tasks:
Example: Automatically Label Issues
name: Label Issues
on:
issues:
types: [opened, edited]
jobs:
label_issues:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v6
with:
script: |
const title = context.payload.issue.title.toLowerCase();
const body = context.payload.issue.body.toLowerCase();
// Add bug label
if (title.includes('bug') || body.includes('bug') || body.includes('error')) {
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['bug']
});
}
// Add enhancement label
if (title.includes('feature') || title.includes('enhance') || body.includes('feature request')) {
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['enhancement']
});
}
Example: Automatically Assign Issues
name: Assign Issues to Project
on:
issues:
types: [opened]
jobs:
assign_to_project:
runs-on: ubuntu-latest
steps:
- uses: actions/add-to-project@v0.4.0
with:
project-url: https://github.com/users/username/projects/1
github-token: ${{ secrets.GITHUB_TOKEN }}
These automations can significantly streamline your project management workflow and ensure consistency.
GitHub Wikis
GitHub Wikis provide a place for comprehensive project documentation:
- Creation: Enable Wikis in repository settings
- Editing: Create and edit pages using Markdown, HTML, or other formats
- Organization: Create a sidebar with links to important pages
- History: Track changes to Wiki pages over time
- Cloning: Wikis are Git repositories that can be cloned and edited locally
Wikis are ideal for detailed documentation, guides, and project information that doesn't fit in the README.
Advanced GitHub Features
Beyond the core features, GitHub offers several advanced capabilities that enhance the development workflow.
GitHub Actions: CI/CD and Automation
GitHub Actions allows you to automate your software development workflows directly in your repository:
Key Concepts
- Workflows: Automated procedures defined in YAML files
- Events: Triggers that start workflows (push, pull request, etc.)
- Jobs: Sets of steps that execute on the same runner
- Steps: Individual tasks within a job
- Actions: Reusable units of code for performing tasks
- Runners: Servers that run the workflows
Example: Basic CI Workflow
name: Node.js CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm run build --if-present
- run: npm test
We'll explore GitHub Actions in more detail in a future lecture, but this gives you a taste of its capabilities.
GitHub Pages
GitHub Pages allows you to host websites directly from your GitHub repositories:
- User/Organization Sites: Based on a special repository named username.github.io
- Project Sites: Hosted from a specific branch or folder in any repository
- Jekyll Support: Built-in support for the Jekyll static site generator
- Custom Domains: Ability to use your own domain name
- HTTPS: Automatic HTTPS encryption for all sites
Setting Up GitHub Pages
- Go to your repository's Settings tab
- Click on "Pages" in the sidebar
- Select the source branch (usually main) and folder (root or /docs)
- Save your changes
- Visit your site at username.github.io/repository-name
GitHub Pages is ideal for project documentation, personal websites, and simple web applications.
GitHub Codespaces
Codespaces provides cloud-based development environments directly within GitHub:
- Browser-Based VS Code: Full VS Code experience in your browser
- Pre-Configured Environments: Define environment settings with devcontainer.json
- Compute Options: Choose from various machine types
- Persistence: Environments persist between sessions
- Forwarded Ports: Run and access web servers directly
- Terminal Access: Full terminal for command-line operations
Codespaces eliminates the "it works on my machine" problem by providing consistent environments for all developers.
GitHub Packages
GitHub Packages is an integrated package management service:
- Multiple Package Types: npm, Maven, NuGet, Ruby gems, Docker images, etc.
- Integration: Tight integration with GitHub repositories and Actions
- Access Control: Inherit permissions from repositories
- Vulnerability Scanning: Automatic checks for security issues
This allows you to host your packages alongside your code, simplifying dependency management.
GitHub Security Features
GitHub provides several security features to help protect your code:
- Dependabot: Automatically detect and fix vulnerable dependencies
- Code Scanning: Identify security vulnerabilities in your code
- Secret Scanning: Detect accidentally committed secrets
- Security Advisories: Privately discuss and fix vulnerabilities
- Security Policies: Document how to report security issues
These features help you maintain a secure codebase and respond effectively to vulnerabilities.
Open Source on GitHub
GitHub is the world's largest host of open source projects. Let's explore how to effectively participate in and contribute to open source on the platform.
Finding Open Source Projects
GitHub provides several ways to discover interesting projects:
- GitHub Explore: Curated collections and trending repositories
- GitHub Topics: Browse repositories by technology or purpose
- GitHub Stars: See what developers you follow are starring
- Advanced Search: Find projects based on language, stars, forks, etc.
- Good First Issues: Find beginner-friendly issues in projects
When evaluating a project to contribute to, consider:
- How active is the project? (recent commits, closed PRs)
- How responsive are the maintainers? (time to respond to issues/PRs)
- Is there clear documentation for contributors?
- Does it have a code of conduct and contribution guidelines?
Contributing to Open Source
The general workflow for contributing to open source projects on GitHub:
- Fork the Repository: Create your own copy of the project
# No command needed - click "Fork" on the GitHub web interface - Clone Your Fork: Download your fork to your local machine
git clone https://github.com/yourusername/project.git cd project - Add Upstream Remote: Keep your fork in sync with the original repository
git remote add upstream https://github.com/original-owner/project.git - Create a Branch: Make your changes in a new branch
git checkout -b fix-login-bug - Make Changes: Implement your feature or fix
git add . git commit -m "Fix login validation bug" - Keep Your Fork Updated: Pull in changes from the upstream repository
git checkout main git pull upstream main git push origin main - Rebase Your Branch: Apply your changes on top of the latest main
git checkout fix-login-bug git rebase main - Push Your Branch: Upload your changes to your fork
git push origin fix-login-bug - Create a Pull Request: Submit your changes to the original repository
# No command needed - use the GitHub web interface - Address Feedback: Make any requested changes and push them to your branch
This "fork and pull request" model is the standard for contributing to open source on GitHub.
Creating Your Own Open Source Project
If you're starting your own open source project on GitHub, include these essential elements:
- README.md: Clear documentation about what the project does, how to install it, and how to use it
- LICENSE: An open source license that defines how others can use, modify, and distribute your code
- CONTRIBUTING.md: Guidelines for how others can contribute to your project
- CODE_OF_CONDUCT.md: Rules for participation to create a positive environment
- ISSUE_TEMPLATE/: Templates to help contributors report issues effectively
- PULL_REQUEST_TEMPLATE.md: Template to guide contributors in submitting PRs
- SECURITY.md: Instructions for reporting security vulnerabilities
These documents establish clear expectations and make it easier for others to contribute.
GitHub Sponsors
GitHub Sponsors allows the community to financially support developers and projects:
- Monthly Donations: Recurring support for developers or organizations
- One-Time Contributions: Single payments for specific work
- Tiers: Different support levels with various benefits
- Direct Funding: 100% of contributions go to the developer (GitHub covers processing fees)
Sponsors can be set up for individual accounts or organizations, providing a way to sustain open source work.
GitHub Best Practices
Let's wrap up with some best practices for effectively using GitHub in your development workflow:
Repository Management
- Clear Documentation: Maintain comprehensive README and supporting documentation
- Consistent Structure: Follow established project organization patterns
- Branch Protection: Set up rules to prevent direct pushes to important branches
- Regular Maintenance: Keep dependencies updated and address technical debt
- Semantic Versioning: Use clear, meaningful version numbers for releases
Collaboration Workflow
- Descriptive Commits: Write clear, meaningful commit messages
- Small, Focused PRs: Keep pull requests focused on a single change
- Thorough Reviews: Conduct comprehensive code reviews
- CI/CD Integration: Automate testing and deployment
- Issue-Driven Development: Link work to issues for traceability
Community Engagement
- Responsive Maintenance: Respond to issues and pull requests in a timely manner
- Inclusive Environment: Foster a welcoming community for all contributors
- Clear Expectations: Document contribution guidelines and processes
- Recognition: Acknowledge and thank contributors for their work
- Transparent Decision-Making: Explain the reasoning behind project decisions
Security and Access Control
- Principle of Least Privilege: Grant only the permissions necessary for each role
- Regular Access Review: Periodically review who has access to your repositories
- Secret Management: Use GitHub Secrets for sensitive information, never commit secrets
- Dependency Scanning: Enable Dependabot to detect vulnerable dependencies
- Two-Factor Authentication: Require 2FA for all team members
Practice Exercises
Let's reinforce what we've learned with some hands-on exercises:
Exercise 1: Setting Up Your GitHub Profile
- Create or update your GitHub profile
- Add a profile picture, bio, and contact information
- Create a profile README with information about your skills and interests
- Add at least one pinned repository that showcases your work
Exercise 2: Create a New Repository with Best Practices
- Create a new repository for a simple project
- Add a comprehensive README.md with installation and usage instructions
- Choose an appropriate license
- Set up issue templates for bug reports and feature requests
- Create a pull request template
- Add a code of conduct and contribution guidelines
- Configure branch protection for the main branch
Exercise 3: Collaborate on a Project
- Form pairs or small groups
- Have one person create a repository and add others as collaborators
- Create issues for features to implement
- Each person should:
- Create a branch for their assigned issue
- Implement the feature
- Create a pull request
- Review another person's pull request
- Address feedback on their own pull request
- Merge the approved pull requests
Exercise 4: Contribute to an Open Source Project
- Find a beginner-friendly open source project on GitHub
- Fork the repository
- Clone your fork locally
- Find an issue to work on or identify an improvement
- Create a branch for your changes
- Make your changes and commit them
- Push your branch to your fork
- Create a pull request to the original repository
Exercise 5: Set Up Project Management
- Create a GitHub Project for managing your work
- Set up columns for different stages of work (To Do, In Progress, Review, Done)
- Add automation to move cards based on issue and PR status
- Create issues and add them to your project
- Create milestones for grouping related issues
- Practice moving issues through your workflow