diff options
| author | Christian Cleberg <[email protected]> | 2026-05-20 12:33:32 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-05-20 12:33:32 -0500 |
| commit | 56af05b90bfd4d6190af1578d2259ff8e56f1b17 (patch) | |
| tree | 7d2721f40e795db2c0f07fb13ba83c5537c72450 /content/blog | |
| parent | 0916478660d148cf8b2696452d5a0e448b1c0fdb (diff) | |
| download | cleberg.net-56af05b90bfd4d6190af1578d2259ff8e56f1b17.tar.gz cleberg.net-56af05b90bfd4d6190af1578d2259ff8e56f1b17.tar.bz2 cleberg.net-56af05b90bfd4d6190af1578d2259ff8e56f1b17.zip | |
publish new post: git-is-not-github
Diffstat (limited to 'content/blog')
| -rw-r--r-- | content/blog/2026-05-20-git-is-not-github.org | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/content/blog/2026-05-20-git-is-not-github.org b/content/blog/2026-05-20-git-is-not-github.org new file mode 100644 index 0000000..103ab86 --- /dev/null +++ b/content/blog/2026-05-20-git-is-not-github.org @@ -0,0 +1,191 @@ +#+date: [2026-05-20 Wed 11:56:00] +#+title: Git is Not GitHub +#+description: Git tracks code history. GitHub and other Git hosts add collaboration, access, review, and workflow controls around it. +#+slug: git-is-not-github +#+filetags: :development: + +* Git Is Not GitHub + +People often use "Git" and "GitHub" interchangeably. Sometimes it's for +convenience, but often it's a genuine lack of clarity around these two concepts. +I work with IT auditors daily and you'd be surprised how often I come back to +explain this topic, which is why I've written an internal document and am +rolling that into this blog post itself to share with a broader audience. + +The simplest possible explanation I can provide is that Git is the version +control system itself, while GitHub is one of many platforms that offer Git +hosting, as well as custom features that improve functionality on top of Git +(e.g., pull requests). + +The distinction matters, especially in an audit context, because there are facts +and features inherent to Git that should be clearly understood before thinking +about the Git host. For an auditor, this affects decisions around risk +assessment, procedures to obtain evidence, and documentation of control +processes. + +For example, a developer can create a commit in Git after changing some code or +files with a repository. This does *not* automatically show that the change was +reviewed, approved, tested, or deployed through the appropriate process(es). + +* Feature Comparison + +Let's start by comparing features before we dive into the details. While this is +not all-encompassing, it helps set the context for the discussion we're about to +have. + +| Feature / activity | Git | Git host | +|---------------------------------------+-----+----------| +| Track file changes | ✓ | | +| Create commits | ✓ | | +| View commit history | ✓ | ✓ | +| View file diffs | ✓ | ✓ | +| Create branches | ✓ | | +| Merge branches | ✓ | | +| Rebase commits | ✓ | | +| Tag releases or versions | ✓ | ✓ | +| Clone a repository | ✓ | | +| Push and pull changes | ✓ | ✓ | +| Store a shared remote repository | | ✓ | +| Browse repository in a web UI | | ✓ | +| Pull requests / merge requests | | ✓ | +| Code review comments | | ✓ | +| Reviewer approvals | | ✓ | +| Branch protection rules | | ✓ | +| Required status checks before merge | | ✓ | +| User and team access management | | ✓ | +| Repository admin roles | | ✓ | +| Audit logs | | ✓ | +| CI/CD pipelines | | ✓ | +| Deployment environments | | ✓ | +| Secrets / environment variables | | ✓ | +| Issue tracking | | ✓ | +| Project boards | | ✓ | +| Security scanning / dependency alerts | | ✓ | + +#+begin_quote +Git hosts vary by platform. GitHub uses "pull requests," while GitLab commonly +uses "merge requests." The concept is similar, but the available controls, +terminology, logs, and evidence differ by host. +#+end_quote + +* Git Tracks the History + +Now that we have looked at the feature comparison, let's dive into the details +of both Git and Git hosts. + +[[https://git-scm.com][Git]] is a distributed version control system. It is intended to track changes to +files over time through a feature called a *commit*: a collection of changes to +files since the last commit. Developers use it to create these commits, create +branches, merge changes back into the primary branch, rebase work, tag versions, +and inspect project history. + +Git does not require GitHub, or any other hosting platform. It can run entirely +on a developer's laptop. A repository can exist locally, on an internal server, +on a shared network path, or on another Git host. + +For example, I can create a local Git repository, expose it through the Git +protocol, and share this info with a friend or coworker. Then, they can clone my +repository and we can collaborate by making changes independently and using +commits, branches, etc. to push changes back and forth with each other. In this +scenrio, there is *no* host and we are essentially a distributed network of our +own. + +At its core, Git answers technical history questions: + +- What changed? +- Who authored the change? +- When was the change made? +- What files were affected? +- What does this version contain? +- How did this branch differ from that branch? + +That is valuable, but it is not the whole development process. This is where Git +hosts introduce useful, addition features on top of Git. + +* Git Hosts Add the Workflow + +A Git host stores Git repositories and adds collaboration, workflow, and +governance features around them. In an audit or compliance context, this is +where most of the controls originate that mitigate risks with the system +development lifecycle (SDLC). + +GitHub is the most familiar example, so I will use that in this post, but it is +not the only one. Other Git hosts include GitLab, Bitbucket, Azure DevOps Repos, +Sourcehut, Gitea, and Forgejo. + +These platforms commonly add features such as: + +| Feature | Purpose | +|---------------------------------+---------------------------------------------------------------------------------------------------| +| Pull requests or merge requests | Propose changes, review them, and merge them into a target branch. | +| Code review comments | Allow reviewers to comment on specific lines, files, or overall changes. | +| Reviewer approvals | Record that one or more reviewers approved a proposed change before merge. | +| Branch protection rules | Restrict how important branches can be changed, such as preventing direct pushes or force pushes. | +| Required status checks | Require tests, builds, scans, or other checks to pass before a change can be merged. | +| User and team permissions | Control who can read, write, maintain, or administer repositories. | +| Audit logs | Record important administrative, access, repository, and workflow events. | +| Issue tracking | Track bugs, enhancements, tasks, and other development work items. | +| Project boards | Organize work items by status, priority, sprint, release, or team workflow. | +| CI/CD integrations | Build, test, package, or deploy code through automated pipelines. | +| Secrets management | Store sensitive values used by workflows, such as tokens, keys, and credentials. | +| Security scanning | Identify risks such as exposed secrets, vulnerable dependencies, and insecure code patterns. | + +That is why the same Git repository can behave differently depending on where it +is hosted. GitHub, GitLab, Bitbucket, Azure DevOps, and Sourcehut all support +Git repositories, but their review workflows, permissions, logs, automation, and +terminology differ. + +* Audit Implications + +Using GitHub as an example, let's walk through a common audit approach to the +common change management (CM) or program development (PD) controls. + +First, here are some common controls: +- Changes are reviewed and approved prior to deployment. +- The repository is configured to: + - prevent force pushes; + - require X approvals; + - prevent approvals from the author or a person who can committed within the + pull request; + - require testing to pass prior to merging; + - include the relevant change ticket(s)/documentation. +- Users with development access are segregated from users with access to approve + and deploy changes. + - /OR/: Management performs a review on an XYZ basis to ensure deployed + changes were authorized and appropriate. +- Management performs a review on an XYZ basis to ensure branch protection + settings were not inappropriately modified. + +Now, where can we find this evidence? Let's step through each +- Normally, reviews and approvals can be found directly within the pull/merge + request. For platforms such as Github, this platform enables code reviews, + comments, feedback, and checks directly within the PR flow. In certain cases, + this may be documented in a change ticket system and the ticket is referenced + within the PR to prove that the PR was tested, reviewed, and approved prior to + merging. +- For configurations, GitHub supports both [[https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule][classic branch protections rules]] and + [[https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets][rulesets]], which can enforce all of the checks I mentioned above. +- For access, it depends on the company's setup. They may be using GitHub + Enterprise, which offers them more control over access, and teams can inspect + the access inheritence through those Enterprise settings. Otherwise, + non-enterprise GitHub organizations can show evidence of access at both the + organization level and the repository level. Auditors can inspect the levels + of access and inheritence to ensure that no users have the ability to develop + changes, manage branch protections, approve changes, and deploy changes. +- For branch protection settings, management can provide auditors with an export + of the audit logs relevant to the in-scope repositories. This will show you if + any events occurred that would have disabled or modified the branch + protections in place. + +If your inspecting a project where CI/CD pipelines matter, you can also dive +into the team's configuration of their pipeline in terms of the logic, access to +modify, and any relevant schedules or triggers. + +* Conclusion + +Hopefully at this point, it's clear that Git is not GitHub. While they are +related and can be confusing for non-developers, it's important to understand +the distinction. + +Without this understanding, everything can fall apart in your understanding, +risk assessment, and scoping of an audit. |
