Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
What Are Git and GitHub? An Introduction to Version Control
Why version control exists, how centralized and distributed tools differ and why Git and GitHub are not the same thing. We try distributed work by reading history and committing in a clone whose server is gone, then look at Git's short history, its place in DevOps and how the series is organized.
Git Remote and Clone: origin, fetch, push and Upstream
We see with real output what a remote is, git remote add, push -u and the upstream setting with a local bare repo standing in for GitHub, remote-tracking branches like origin/main, what git clone does, the split between fetch and merge, sharing a new branch, git remote show/rename and a rejected push.
Connecting to GitHub: HTTPS, Personal Access Tokens and SSH
From creating a repo on GitHub to the first push: why passwords stopped working in 2021, fine-grained versus classic personal access tokens, how credential helpers work, ed25519 SSH keys, gh auth login and transfer.credentialsInUrl, which catches tokens embedded in URLs.
Pull Requests on GitHub: GitHub Flow, Reviews and Merge Methods
Branch, commit, push and pull request: the six steps of GitHub flow, draft PRs, answering review with new pushes, how the merge commit, squash and rebase methods shape history, the branch-deletion trap after a squash, and keeping a fork in sync with upstream.
Teamwork with Git: Branching Strategies, Rulesets and Conventional Commits
Starting from a force push that wipes a teammate's commit, we compare GitHub flow, Git flow and trunk-based development; branch protection versus rulesets, server-side protection with receive.denyNonFastForwards, CODEOWNERS and Conventional Commits.
Git Interactive Rebase and Squash: Tidying History Before a PR
We turn a messy feature branch into three clean commits with git rebase -i: the todo list, pick, reword, edit, squash, fixup, drop and reordering, the commit --fixup plus --autosquash flow, how it differs from GitHub's squash merge, and the experimental git history reword in Git 2.54.
Git Tags and Releases: Marking Versions, git describe and GitHub Releases
We mark releases with git tag: lightweight versus annotated tags, the tag object, semver, why push doesn't send tags, --tags versus --follow-tags, reading git describe output, GitHub Releases, deleting tags and why moving a published tag is dangerous.
Git Hooks and Commit Signing: From pre-commit to SSH Signatures
We write pre-commit and commit-msg hooks with real output, share them with the team through core.hooksPath, and try Git 2.54's config-based hooks and git hook list. Then we sign commits with an SSH key, verify them with an allowed signers file and look at what GitHub's Verified badge requires.