Files
bincio-activity/docs/squash-for-github.md
T
Davide Scaini c68dfa9057 chore: update changelog, remove stale files, scrub VPS IP
- CHANGELOG.md: add [Unreleased] 2026-04-16 section covering settings
  page, admin tools, password reset, re-extract, community page, SSE
  upload progress, and all bug fixes since 2026-04-10
- Remove docs-proposal.md (internal planning doc, not user-facing)
- Remove publish/ directory (leftover artefacts from publish.sh, not
  meant to be tracked)
- scripts/pull_feedback.sh: replace hardcoded default VPS IP with a
  required positional argument to avoid leaking server address
- docs/squash-for-github.md: document the squash-for-github commit
  strategy for future reference
2026-04-16 18:09:32 +02:00

2.0 KiB

squash-for-github branch strategy

squash-for-github is a curated public-facing branch. It has its own orphan history (unrelated to main) and grows by appending one large squash commit each time you want to publish a batch of work.

When to use

Whenever main has accumulated enough work worth publishing — typically after a meaningful feature set or before tagging a release.

How it works

squash-for-github and main have completely unrelated histories (different root commits). Because of this, git merge --squash won't work. Instead, use git commit-tree to create a new commit that carries main's file tree but is parented to the current squash-for-github tip.

Steps

  1. Collect commit messages to write the summary:

    git log --oneline main ^squash-for-github
    
  2. Switch to the branch:

    git checkout squash-for-github
    
  3. Create the squash commit (replace the message with your summary):

    NEW=$(git commit-tree main^{tree} -p HEAD -m "feat: your summary here")
    git reset --hard $NEW
    

    Or as a one-liner with a heredoc for a multi-line message:

    git reset --hard $(git commit-tree main^{tree} -p HEAD -m "$(cat <<'EOF'
    feat: short title
    
    - bullet one
    - bullet two
    EOF
    )")
    
  4. Verify:

    git log --oneline squash-for-github | head -5
    
  5. Push when ready:

    git push origin squash-for-github
    # or force-push if you've rewritten history on the remote:
    git push --force origin squash-for-github
    
  6. Return to main:

    git checkout main
    

Why not git merge --squash?

The two branches share no common ancestor, so git refuses with fatal: refusing to merge unrelated histories. git commit-tree bypasses this by directly constructing the commit object: it takes the tree (file snapshot) from main, sets the parent to the current squash-for-github tip, and attaches your custom message — no merge machinery needed.