Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
Preparing for Git 3.0: What Changes, What Goes, What to Do Today
We separate the official status of Git 3.0 (BreakingChanges.adoc: no date yet) from the plan reported by GitLab and LWN. We try the main, SHA-256 and reftable defaults, safe.bareRepository, mandatory Rust, the commands being removed and why git checkout stays on Git 2.54, and end with a preparation checklist.
Git 2.50–2.56: git history, Config-Based Hooks and git add --resolved
We go from Git 2.50 to the current 2.56: git history reword and split (fixup in 2.55, drop in 2.56), config-based and parallel hooks, stash export/import, pull.autostash and what happens on a conflict, git last-modified, git repo info, reflog drop, branch --delete-merged, add --resolved and the -h exit code change.
Git 2.40–2.49: reftable, SHA-256, git replay and the New git config
We look at the 2.40–2.49 period, when the foundations of Git 3.0 were laid, with real output: the reftable ref store and git refs migrate, where SHA-256 repos stand today, git config's get/set/unset/list subcommands, worktree add --orphan, git replay, safe.directory prefixes, git backfill and Rust's first step.
Git 2.23–2.39: From checkout to switch and restore, Old Habits to New Ones
We put old and new side by side for what arrived between Git 2.23 and 2.39: the move from checkout to switch and restore, init.defaultBranch, pull's divergent branches error, sparse-checkout, maintenance, fsmonitor, ort and remerge-diff, rebase --update-refs, force-if-includes, safe.directory and SSH signing.
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.
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.
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 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.
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 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.
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.
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.