Mert Özen Further With Every Line

Blog

Mert Özen's blog posts on software development, backend, frontend, and DevOps.

Series
29 posts found #devops
Connecting to GitHub: HTTPS, Personal Access Tokens and SSH
DevOps PART 13

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.

6 Nov 2026 10 min 2
Pull Requests on GitHub: GitHub Flow, Reviews and Merge Methods
DevOps PART 14

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.

6 Nov 2026 10 min 3
Teamwork with Git: Branching Strategies, Rulesets and Conventional Commits
DevOps PART 15

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.

6 Nov 2026 10 min 2
Undoing Changes in Git, Part 1: git restore and git reset
DevOps PART 16

Undoing Changes in Git, Part 1: git restore and git reset

Undoing files in the working tree and index with git restore and bringing them back from history with --source; what the --soft, --mixed and --hard modes of git reset do to HEAD, the index and the working tree, getting back with ORIG_HEAD, and the old checkout/reset forms.

6 Nov 2026 8 min 2
Undoing Changes in Git, Part 2: git revert
DevOps PART 17

Undoing Changes in Git, Part 2: git revert

Safe undo in shared history: the inverse commit of git revert, choosing between reset and revert, reverting a merge commit with -m 1, reverting the revert before merging a branch again, several commits with --no-commit and conflicts during a revert.

6 Nov 2026 7 min 2
Git Stash: Setting Unfinished Work Aside
DevOps PART 18

Git Stash: Setting Unfinished Work Aside

Saving unfinished work with git stash: -u for untracked files, named entries, list and show, apply versus pop, --staged and --index, the stash.index setting, conflicts during a pop, stash branch and the stash export/import commands from Git 2.51.

6 Nov 2026 10 min 2
Git cherry-pick: Moving a Single Commit to Another Branch
DevOps PART 19

Git cherry-pick: Moving a Single Commit to Another Branch

We carry a hotfix from main to a release branch with git cherry-pick: why the new commit gets a new hash, author versus committer, leaving a trail with -x, picking a range of commits, --continue/--abort/--skip during a conflict, finding equivalent commits with git cherry and when cherry-pick becomes a smell.

6 Nov 2026 9 min 2
Git rebase: Rewriting History and Pushing It Safely
DevOps PART 20

Git rebase: Rewriting History and Pushing It Safely

We compare merge and rebase in the same scenario: why rebase rewrites commits with new hashes, conflicts during a rebase and the flipped HEAD, pull --rebase, the golden rule, pushing a rebased branch with --force-with-lease and --force-if-includes, and --update-refs for stacked branches.

6 Nov 2026 10 min 2
Git Interactive Rebase and Squash: Tidying History Before a PR
DevOps PART 21

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.

6 Nov 2026 10 min 2
Git reflog: Bringing Back Lost Commits and Deleted Branches
DevOps PART 22

Git reflog: Bringing Back Lost Commits and Deleted Branches

We bring commits back with git reflog after an accidental reset --hard: HEAD@{n} versus HEAD~n, undoing the last merge with ORIG_HEAD, finding a deleted branch in the reflog, backing out of a rebase with the branch's own reflog, and why the reflog is local and expires.

6 Nov 2026 8 min 2
Git Tags and Releases: Marking Versions, git describe and GitHub Releases
DevOps PART 23

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.

6 Nov 2026 8 min 3
Git bisect and git worktree: Finding the Bad Commit and Two Branches at Once
DevOps PART 24

Git bisect and git worktree: Finding the Bad Commit and Two Branches at Once

We find the commit that introduced a bug with git bisect's binary search: marking good and bad, bisect log and reset, automatic search by exit code with git bisect run, and exit 125. Then we use git worktree to make a hotfix in a separate folder without disturbing unfinished work, and look at worktree list/remove/prune and when it beats stash.

6 Nov 2026 9 min 2
Blog Map