DEV Community

Cover image for Opensource Contribution Workflow: A Step-by-Step Guide
lotanna obianefo
lotanna obianefo

Posted on

Opensource Contribution Workflow: A Step-by-Step Guide

Opensource software powers much of today's technology. Linux runs servers worldwide, Kubernetes orchestrates containers, Terraform provisions cloud infrastructure, and Git powers version control for millions of developers. These projects thrive because developers from around the world contribute code, documentation, bug fixes, and ideas.

This guide explains the complete technical workflow of contributing to an opensource project using Git and GitHub, while introducing the concepts and best practices used by professional software teams.

Fork & Clone PinpointPro

Fork the repository to create your own copy on GitHub, then clone your fork to your local machine. This gives you a personal workspace where you can safely make changes without affecting the original project.

1. Fork the Repository on GitHub

Creates a personal copy of the PinpointPro repository in your own GitHub account, including its complete commit history. Since you typically don't have write access to another developer's repository, you cannot push changes directly to it. Forking provides an isolated workspace where you can safely experiment, develop new features, fix bugs, and commit changes without affecting the original project.

From a software engineering perspective, this aligns with the Operational principle by isolating development work from the main codebase. It reduces the risk of accidental changes to shared production code while enabling contributors to collaborate safely through pull requests.

     # 1. Open your browser and go to: https://github.com/raphgm/pinpointpro
     # 2. Click the 'Fork' button in the top-right corner
     # 3. Leave all settings as default and click 'Create fork'
     # 4. GitHub will redirect you to YOUR fork at: https://github.com/YOUR_USERNAME/pinpointpro
Enter fullscreen mode Exit fullscreen mode

ijhuhyuu
khhiuhiu

2. Configure Your Git Identity

Configures your Git identity by setting the name and email address that Git records with every commit you create. Every commit includes author information, allowing changes to be traced back to the person who made them.

If your Git identity has not been configured, Git will prevent you from creating commits and prompt you to set your name and email first. To ensure your commits are correctly linked to your GitHub account and appear in your GitHub contribution graph, use the same email address associated with your GitHub profile.

      # Set your name (use your real name or GitHub display name):
      git config --global user.name "Your Name"

      # Set your email (must match your GitHub account email):
      git config --global user.email "you@example.com"

      # Verify both are set correctly:
      git config --list
Enter fullscreen mode Exit fullscreen mode

Iuryuy

3. Clone Your Fork to Your Machine

Downloads a complete copy of the repository to your local machine, including its entire commit history, and then navigates into the project directory. This local copy allows you to view the project, make changes, create commits, and inspect the repository's history even without an internet connection.

      # Replace YOUR_USERNAME with your actual GitHub username:
      git clone https://github.com/YOUR_USERNAME/pinpointpro.git

      cd pinpointpro

      # Verify the files are present:
      # mac/linux: ls
        dir
Enter fullscreen mode Exit fullscreen mode

yttryuryyu7

Wire Up the Upstream Remote

Configure the original repository as an upstream remote to connect your local clone with the project's primary source. This allows you to fetch and integrate the latest changes from the original repository, keeping your local copy and fork synchronized with ongoing development.

1. Add the Upstream Remote

Register the original PinpointPro repository as a second remote named upstream, in addition to your fork (origin). This establishes a direct connection to the project's primary repository, allowing you to fetch the latest updates made by other contributors.

As pull requests are merged into the original repository, your fork can become out of date. By using the upstream remote, you can regularly synchronize your local repository with the latest changes before creating a new branch or starting new work. This helps reduce merge conflicts and ensures you're building on the most recent version of the codebase.

This keeps your fork aligned with the project's source of truth. Regular synchronization promotes a clean, predictable development workflow and minimizes integration issues when submitting pull requests.

      # Stages the specified file(s) for the next commit.
      git remote add upstream https://github.com/lota001/pinpointpro.git
Enter fullscreen mode Exit fullscreen mode

yutytruu

2. Verify Both Remotes Exist

Displays all configured Git remotes along with their fetch and push URLs. You should see four entries: origin (fetch and push URLs pointing to your fork) and upstream (fetch and push URLs pointing to the original PinpointPro repository).

Always verify your remote configuration instead of assuming a command completed successfully. An incorrectly configured remote is a common cause of failed pushes, accidentally pushing to the wrong repository, or creating pull requests against the wrong target.

This follows the principle of validating your environment before making changes. Verifying your Git configuration helps prevent avoidable errors and ensures your contributions are directed to the correct repositories.

      # Manages remote repository connections (origin, upstream, etc.).
      git remote -v
Enter fullscreen mode Exit fullscreen mode

yftrdtry

3. Sync Your Fork with Upstream

Downloads the latest commits from the upstream repository and integrates them into your local main branch, ensuring your local copy is synchronized with the most recent version of the project.

Starting new work from an outdated main branch is one of the most common causes of merge conflicts in open source projects. After updating, Git will typically display "Already up to date." if no new changes are available, or it will list the commits and files that were merged into your local branch.

This supports Reliability by ensuring every new feature or bug fix is developed from the latest stable codebase. Working from an up-to-date baseline minimizes integration issues, reduces merge conflicts, and makes your pull requests easier for maintainers to review and merge.

      # Downloads new commits from the remote without merging — lets you review before integrating.
      git fetch upstream

      # Switches to a different branch or restores files.
      git checkout main

      # Merges another branch into your current branch.
      git merge upstream/main
Enter fullscreen mode Exit fullscreen mode

dthtrw

Create Your Feature Branch

Create a dedicated branch to isolate your work from the main branch, following the project's Git Flow naming convention. Working on a separate branch allows you to develop new features, fix bugs, or update documentation independently, making it easier to manage changes, collaborate with others, and submit focused pull requests without affecting the stable codebase.

1. Check Out a New Feature Branch

Creates a new Git branch and immediately switches your working directory to it in a single operation. You can verify the currently active branch using git branch, where the active branch is highlighted with an asterisk (*).

Feature branches provide isolation for individual units of work, ensuring that changes are decoupled from the main branch. This means that if a pull request is rejected or requires revisions, the stable codebase remains unaffected. It also enables multiple contributors to work on different features simultaneously without interfering with each other’s changes or causing merge conflicts.

This enables safe parallel development. Feature isolation is a core practice in professional Git workflows, ensuring controlled, predictable, and conflict-free integration of changes into the main codebase.

      # Replace 'yourname' with your actual GitHub username:
      # Creates a new branch and switches to it in one step.

      git checkout -b feature/yourname-add-contributor


      # Confirm the branch was created and you're on it:
      # Lists, creates, or manages branches.

      git branch
Enter fullscreen mode Exit fullscreen mode

Iyugyty6tg

Choose Your Contribution & Make It

Select a contribution path that matches your current skill level and implement it within your dedicated feature branch. This ensures your changes remain isolated from the main codebase while you focus on completing a specific, well-scoped task such as a bug fix, feature enhancement, or documentation update.

      Task A = Add Yourself to CONTRIBUTORS.md
      Task B = Fix a Typo or Improve README.md
      Task C = Add a .gitignore File
      Task D = Add a GitHub Actions CI Workflow
      Task E = Propose a New App Feature
Enter fullscreen mode Exit fullscreen mode

Note: Do one task at a time and always switch to the main branch before creating a new branch

           git checkout main
Enter fullscreen mode Exit fullscreen mode

Stage & Commit Your Work

Stage your modified files in Git and create a structured, descriptive commit message following the Conventional Commits specification. This ensures each commit clearly communicates the nature of the change, making the project history easier to read, review, and maintain.

1. Stage Your Changed Files

Transfers your modified files from the working directory into Git’s staging area, preparing them to be included in the next commit. Git requires explicit selection of changes, and staging allows you to control exactly what will be recorded in each commit.

This step helps you build focused, single purpose commits by ensuring only relevant changes are included, preventing accidental commits of unrelated files, debug artifacts, or sensitive data such as credentials.

          # Stage the specific file(s) you changed — examples by track:
            Task A: git add CONTRIBUTORS.md
            Task B: git add README.md
            Task C: git add .gitignore
            Task D: git add .github/workflows/ci.yml
            Task E: git add <your new file(s)> 

          # Shows which files are staged, modified, or untracked — your current working state.
            git status
Enter fullscreen mode Exit fullscreen mode

2. Commit with Conventional Commits Format

Creates a permanent, versioned snapshot of your staged changes in the repository history, along with a descriptive commit message that documents what was changed.

Following the Conventional Commits format (type(scope): description) is a widely adopted industry standard. Common commit types include feat, fix, docs, chore, ci, test, and refactor. This structure makes commits self-describing, improves readability of the project history, and enables automation such as changelog generation and semantic versioning. Well-written commit messages also reflect engineering professionalism and are often evaluated during code reviews.

       # Use the commit message format for your chosen track:
       Task A: git commit -m "docs(contributors): add @yourname - Phase 2 Project"
       Task B: git commit -m "docs(readme): fix typo in [section name]"
       Task C: git commit -m "chore: add .gitignore for Node.js project"
       Task D: git commit -m "ci: add GitHub Actions CI workflow for Node.js"
       Task E: git commit -m "feat([scope]): [describe your feature]"
Enter fullscreen mode Exit fullscreen mode

Push & Open a Pull Request

Push your local branch to GitHub and open a Pull Request (PR) to submit your changes for review by the project maintainer. This initiates the code review process, where your modifications are evaluated before being merged into the main codebase.

1. Open the Pull Request on GitHub

Creates a Pull Request (PR) to formally propose merging your feature branch into the original repository's main branch. A pull request provides maintainers with an opportunity to review your changes, discuss improvements, and verify that the code meets the project's quality standards before it is merged.

In this repository, all changes must go through a pull request before they can be added to the main branch. Branch protection rules require approval from at least one project maintainer, ensuring that every contribution is reviewed. A clear and detailed pull request description is an important part of this process, as it explains what was changed, why the change is needed, and how it was tested. This helps reviewers understand your contribution and makes the review process more efficient.

         # Replace 'yourname-task' with your actual branch name:
         # Uploads your local commits to the remote repository.
         ------------
          Task A: git push -u origin feature/yourname-add-contributor
          Task B: git push -u origin fix/yourname-readme-typo
          Task C: git push -u origin chore/yourname-add-gitignore
          Task D: git push -u origin feat/yourname-add-ci-workflow
          Task E: git push -u origin feat/yourname-[feature-name]
Enter fullscreen mode Exit fullscreen mode

2. Open the Pull Request on GitHub

Creates a Pull Request (PR) to formally request that your feature branch be reviewed and merged into the original repository's main branch. A pull request allows project maintainers to examine your changes, provide feedback, and ensure the contribution meets the project's coding, testing, and quality standards before it becomes part of the main codebase.

In this repository, all code changes must be submitted through a pull request. Branch protection rules require at least one maintainer to review and approve the changes before they can be merged. A well-written pull request description is an essential part of this process, as it clearly explains what was changed, why the change was made, and how it was tested. Providing this information helps reviewers understand your contribution more quickly and demonstrates good engineering and communication practices.

            # 1. After pushing, GitHub prints a URL — click it, or navigate to:
            # https://github.com/raphgm/pinpointpro/compare
            ----------------
            # 2. Configure the PR:
            # base repository: raphgm/pinpointpro | base branch: main
            # head repository: YOUR_USERNAME/pinpointpro | compare: your-branch-name
            -----------------
            # 3. Write a clear PR title matching your commit message format.
            # Examples:
            # docs(contributors): add @yourname - Phase 2 Project
            # docs(readme): fix typo in installation section
            # chore: add .gitignore for Node.js project
            # ci: add GitHub Actions CI workflow for Node.js
            # feat(auth): add login page component
            -----------------
            # 4. In the PR description, explain:
            # - What you changed
            # - Why it improves the project
            # - How you tested it (if applicable)
            ------------------
            # 5. Click 'Create pull request'
Enter fullscreen mode Exit fullscreen mode

3. Confirm Your PR Is Open and Awaiting Review

Confirms that your Pull Request (PR) has been successfully created, is publicly accessible, and is awaiting review by the project maintainers. This marks the completion of the standard Git and GitHub contribution workflow, from creating a feature branch to submitting your changes for review.

Verifying that your pull request has been submitted correctly is an important professional practice. The code review process is where maintainers provide feedback, suggest improvements, and ensure that your contribution meets the project's standards. Whether your pull request is approved, requires revisions, or receives constructive feedback, each review is a valuable opportunity to learn and improve your software engineering skills.

       # Navigate to the open PRs:
       # https://github.com/raphgm/pinpointpro/pulls

       # Your PR should show: 'Open — 1 review required'
       # Copy your PR URL — paste it to complete your course assignment.
       -------------------------
       # What happens next:
       # - The maintainer reviews your PR within 24-48 hours
       # - They may request changes — push new commits to the same branch to update the PR
       # - They may approve and merge — your contribution is now permanent
       # - Watch your GitHub notification bell for feedback
Enter fullscreen mode Exit fullscreen mode

Task A.
Add Yourself to CONTRIBUTORS.md

Adds a structured entry to the project's contributors list, permanently documenting your name and contribution in the repository's Git history. Once your pull request is merged, your contribution becomes part of the project's official record and serves as publicly verifiable evidence of your participation in a real-world open source project.

Recognizing contributors is a standard practice in professional open source development, as it provides visibility into who has contributed to the project and helps acknowledge individual efforts.

From a software engineering perspective this maintains an accurate and transparent record of contributions. A well-maintained contributor history improves accountability, enhances project governance, and makes it easier to track the evolution of the codebase over time.

      # Open the file:
      # mac/linux: vi CONTRIBUTORS.md
      # windows (Git Bash): notepad CONTRIBUTORS.md
      # windows (PowerShell): notepad .\CONTRIBUTORS.md

      # Append this block at the very bottom (replace placeholders):
      ---------
      # ## Your Full Name
      # - **GitHub:** @your-username
      # - **Contribution:** Cloud & DevOps Foundation – Phase 2 Project
      # - **Date:** YYYY-MM-DD
      # - **One thing I learned:** [your own words]
      ---------

      # Save the file, then verify:

      # Shows the differences between your working files and the last commit.
      git diff CONTRIBUTORS.md
Enter fullscreen mode Exit fullscreen mode

Ikjhyugftr

      # Stage the specific file(s) you changed
      git add CONTRIBUTORS.md

      # Shows which files are staged, modified, or untracked — your current working state.
      git status
Enter fullscreen mode Exit fullscreen mode

Isdcwduids

     # Use the commit message format for your chosen track
      git commit -m "docs(contributors): add @yourname - Phase 2 Project"

     # Verify the commit was recorded, Shows the commit history.
      git log --oneline -3
Enter fullscreen mode Exit fullscreen mode

Idscsds

       # Uploads your local commits to the remote repository. Replace 'yourname-task'    
       git push -u origin feature/yourname-add-contributor
Enter fullscreen mode Exit fullscreen mode

iuhugfyt

      1. After pushing, GitHub prints a URL — click it, or navigate to:
       # https://github.com/raphgm/pinpointpro/compare

      2. Configure the PR:
       # base repository: raphgm/pinpointpro | base branch: main
       # head repository: YOUR_USERNAME/pinpointpro | compare: your-branch-name

      3. Write a clear PR title matching your commit message format.

      4. In the PR description, explain:
       # - What you changed
       # - Why it improves the project
       # - How you tested it (if applicable)

      5. Click 'Create pull request'
Enter fullscreen mode Exit fullscreen mode

dscwws

Task B.
Fix a Typo or Improve README.md

Improves the project's documentation by correcting inaccuracies, fixing typographical errors, or making the content in the README.md file clearer and easier to understand. High-quality documentation helps contributors quickly understand the project's purpose, setup process, and development workflow.

Well-written documentation is often the first thing new contributors, users, and potential employers see when exploring a project. A clear and comprehensive README.md reduces the learning curve, improves the developer experience, and encourages more people to contribute.

This treats documentation as an essential part of the software development lifecycle. Just like clean, maintainable code, high-quality documentation serves as the onboarding guide for future engineers and helps ensure the project remains accessible, maintainable, and easy to collaborate on.

      # Read through the README carefully:
      # mac/linux: cat README.md
       type README.md

      #
      # Open and edit it:
      # mac/linux: vi README.md
      notepad README.md

      #
      # Fix a typo, unclear sentence, broken link, or missing punctuation.
      # Save the file, Then verify your change:

      # Shows the differences between your working files and the last commit.
      git diff README.md
Enter fullscreen mode Exit fullscreen mode

Idfafekapk
Iyutyutyu

      # Stage the specific file(s) you changed
       git add README.md

      # Then confirm what is staged
       git status
Enter fullscreen mode Exit fullscreen mode

ddfsfwe

      # Use the commit message format for your chosen track.
       git commit -m "docs(readme): fix typo in [section name]"

       # Verify the commit was recorded
        git log --oneline -3
Enter fullscreen mode Exit fullscreen mode

ftrdetyt

       # Checkout from the main branch and create a new branch
        git checkout -b fix/yourname-readme-typo

       # Uploads your local commits to the remote repository.
        git push -u origin fix/yourname-readme-typo
Enter fullscreen mode Exit fullscreen mode

iuygt

Task C.
Add a .gitignore File

Creates or updates the .gitignore file to ensure that generated files, build artifacts, dependencies, sensitive credentials, and local environment files are excluded from version control. This prevents unnecessary or confidential files from being accidentally committed to the repository.

An incomplete or missing .gitignore is a common mistake for new Git users. Accidentally committing directories such as node_modules can significantly increase repository size, while committing files like .env may expose API keys, passwords, or other sensitive configuration values. Keeping these files out of the repository results in a cleaner, more secure, and easier-to-maintain codebase.

This supports Security by preventing the accidental exposure of sensitive information and reducing unnecessary repository bloat. Proper use of a .gitignore file is a fundamental best practice adopted by professional engineering teams to protect credentials, improve repository hygiene, and maintain a secure development workflow.

      # Check if one already exists:
      # mac/linux: ls -la | grep .gitignore
      -------
      # If missing, create it:
      # mac/linux: touch .gitignore
      -------
      # Open and add these patterns (Node.js project):
      # mac/linux: vi .gitignore
      -------
      # --- paste this content ---
      # node_modules/
      # dist/
      # .env
      # .env.local
      # .DS_Store
      # *.log
      # coverage/
      # .next/
      -----------
      # Verify the file:

      # Shows the differences between your working files and the last commit.
       git diff .gitignore
Enter fullscreen mode Exit fullscreen mode

dasfsgsdfdsfs

      # Stage the specific file(s) you changed
       git add .gitignore

      # Shows which files are staged, modified, or untracked.
       git status
Enter fullscreen mode Exit fullscreen mode

Igfctfhgy

      # Use the commit message format for your chosen track
       git commit -m "chore: add .gitignore for Node.js project"

      # Verify the commit was recorded
       git log --oneline -3
Enter fullscreen mode Exit fullscreen mode

Iiuhugyty

      # Checkout from the main branch and create a new branch
       git checkout -b chore/yourname-add-gitignore

      # Replace 'yourname-task' with your actual branch name.
       git push -u origin chore/yourname-add-gitignore
Enter fullscreen mode Exit fullscreen mode

ygrdedfhy

Task D.
Add a GitHub Actions CI Workflow

Creates a Continuous Integration (CI) pipeline that automatically runs whenever code is pushed to the repository or a pull request is opened. The workflow checks out the source code, sets up a Node.js 20 environment, installs the project's dependencies, and executes the available test suite to verify that the application builds and functions correctly.

Continuous Integration is a core practice in modern software development. In professional engineering teams, every pull request is automatically validated by a CI pipeline before it can be reviewed or merged. This helps ensure that new changes do not introduce build failures, test failures, or other issues into the main codebase. By implementing a CI workflow, you demonstrate an understanding of both Git-based collaboration and the DevOps practice of automating software validation.

This supports operation by automating repetitive quality checks and providing rapid feedback to developers. Detecting issues early in the development lifecycle reduces integration problems, improves code quality, and shortens the feedback loop from days to just a few minutes.

      # Create the workflows directory:
      # mac/linux: mkdir -p .github/workflows
      #
      # Create the workflow file:
      # mac/linux: vi .github/workflows/ci.yml
      #
      # --- paste this content ---
      # name: CI
      # on:
      # push:
      # branches: [ main ]
      # pull_request:
      # branches: [ main ]
      # jobs:
      # build:
      # runs-on: ubuntu-latest
      # steps:
      # - uses: actions/checkout@v4
      # - name: Set up Node.js
      # uses: actions/setup-node@v4
      # with:
      # node-version: '20'
      # - name: Install dependencies
      # run: npm install
      # - name: Run tests
      # run: npm test --if-present
      # --------------------------
      #
      # Verify the file was created:
      # mac/linux: cat .github/workflows/ci.yml
Enter fullscreen mode Exit fullscreen mode

fgdg

      # Stage the specific file(s) you changed
       git add .github/workflows/ci.yml

      # Then confirm what is staged
       git status
Enter fullscreen mode Exit fullscreen mode

ytftrt

      # Use the commit message format for your chosen track
       git commit -m "ci: add GitHub Actions CI workflow for Node.js"

      # Verify the commit was recorded
       git log --oneline -3
Enter fullscreen mode Exit fullscreen mode

tftfdyt

      # Checkout from the main branch and create a new branch
       git checkout -b feat/yourname-add-ci-workflow

      # Replace 'yourname-task' with your actual branch name
       git push -u origin feat/yourname-add-ci-workflow
Enter fullscreen mode Exit fullscreen mode

Ihffkfdjd

Task E.
Propose a New App Feature

Introduces a new functional feature to the PinpointPro codebase by extending the application's existing capabilities through a meaningful code change. This type of contribution typically involves implementing new logic, components, or services that enhance the overall functionality of the system.

Feature development is one of the most valuable forms of opensource contribution. Submitting a well-scoped pull request with a clear explanation of the feature, its purpose, and its implementation approach demonstrates strong engineering and collaboration skills. The maintainers may choose to accept the contribution, request modifications, or decline it with feedback each outcome provides valuable learning and professional growth.

From a DevOps/software engineering perspective, this supports Performance Efficiency by ensuring that new functionality is carefully scoped, isolated within a dedicated branch, and reviewed before being merged into the production codebase. This structured review process helps maintain system stability while allowing the project to evolve safely.

      # First, understand the codebase:
      # mac/linux: ls -la && cat README.md
      #
      # Explore the project structure:
      # mac/linux: find . -name '*.js' -o -name '*.ts' -o -name '*.tsx' | grep -v node_modules | head -20
      #
      # Examples of features you could add:
      # - A login/auth UI component (e.g. Login.tsx or login.js)
      # - A new API endpoint or route handler
      # - A search or filter component
      # - Unit tests for an existing function
      # - A dark mode toggle
      #
      # Create your new file(s) and implement the feature.
      # Check what you've changed:

      # Shows which files are staged, modified, or untracked — your current working state.
       git status

      # Shows the differences between your working files and the last commit.
       git diff
Enter fullscreen mode Exit fullscreen mode

Ijbhiki

iudsjosf

      # Stage the specific file(s) you changed
       git add <your new file(s)>

      # Then confirm what is staged.
       git status
Enter fullscreen mode Exit fullscreen mode

idsdwiwd

      # Use the commit message format for your chosen track
      git commit -m "feat([scope]): [describe your feature]"
Enter fullscreen mode Exit fullscreen mode

Iyutyy

        # Create a feature branch
         git checkout -b feat/yourname-[feature-name]

        # Uploads your local commits to the remote repository.
        git push -u origin feat/yourname-[feature-name]
Enter fullscreen mode Exit fullscreen mode

Ijygyug

Contributing to open source is one of the most effective ways to develop practical DevOps/Software engineering skills. Beyond writing code, you'll learn version control, collaborative workflows, code reviews, testing, and communication. All of which are essential in professional development teams.

Top comments (0)