Skip to content

FinderGit 0.23.0

Choose a tag to compare

@gfazioli gfazioli released this 28 Jul 09:59
· 40 commits to main since this release

FinderGit 0.23.0 — Pull that doesn't give up on a diverged branch

Highlights

  • Pull no longer stalls on a diverged branch. When your branch and the remote have both moved on, a plain pull simply refuses and changes nothing — which reads as a Pull button that does nothing at all. FinderGit now names the situation in a strip above the actions ("Diverged from origin/main ↑5 ↓8") and offers the two real ways out, Merge or Rebase, right there. The Pull button itself turns into a menu with the same choice, and if a Pull or Push already failed, the same two options appear inside the error popover — so the fix is one click from the message that explains it.
  • A Pull strategy setting. Settings → Git now decides how pulls reconcile: fast-forward only (the new default), merge, or rebase. FinderGit passes the choice explicitly every time, so pulling behaves identically on every machine regardless of what your git config happens to say — and nothing is ever merged or replayed behind your back.
  • A stopped merge or rebase is visible, and recoverable. Git integrates what it can and stops at the first real conflict, leaving the repository half-done. That state is now surfaced: the strip names what's open (merge, rebase, cherry-pick, revert, bisect), counts the files still in conflict, and offers Finish and Abort. Pull and Push are disabled while it's open, with a tooltip saying why instead of failing on click. It works even when you started the operation in a terminal.
  • It can tell a rewritten history from real work on both sides. Matching counts like ↑78 ↓78 look like two sets of commits, but they're just as often one history rewritten and force-pushed — the same commits wearing new identities. Merging that duplicates every one of them. FinderGit now compares the actual changes rather than the commit IDs and says which case you're in: when nothing local is genuinely new it says so and promotes the reset that fixes it; when the two histories share no ancestor at all it says that too and disables Merge, because git refuses it anyway.
  • Conflicts are called out where you work. Unmerged files are tagged CONFLICT in the changes list and stay in Unstaged until settled, with a Mark Resolved action — which is exactly what git wants next. Per-file Discard is deliberately hidden for them, and a bulk Discard leaves them alone.
  • Git failures explain themselves. A diverged branch, a rejected push, conflicts still open, local edits in the way, a missing upstream, credentials git couldn't get, an unreachable host: each now gets one line of plain language above git's own output, which stays visible underneath as the evidence.
  • Find them at a glance. A new Diverged smart view in the sidebar, plus a count in the status bar, so the repositories that need a decision are one click away.
    All of it is localized — Italian, French, German and Spanish, following your macOS language.
    Worth knowing: Pull now defaults to fast-forward only. If you had pull.rebase set in your git config, FinderGit no longer follows it silently — it stops and asks, with both options in front of you. Settings → Git changes the default.

Bug fixes

  • The ↑N ↓M tooltip advised "pull then push" — the one sequence that cannot work on a diverged branch. It now names the two options that can.
  • Discard All no longer sweeps up conflicted files. Reverting an unmerged file doesn't mean what that label promises, so those are left for you to resolve or abort.
  • Counts read correctly at one: "1 file still conflicting", not "1 conflicting files". Same fix in the reset confirmation and the diverged tooltip.
  • Three status tooltips (dirty, clean, and the diverged one) were never translated and always appeared in English. They follow your language now.
  • A hard reset can no longer land on the wrong branch: if you switch branch in a terminal while the confirmation is open, the reset refuses instead of resetting whatever is checked out at that moment.

Under the hood

  • Pull always passes its strategy on the command line (--ff-only, --no-rebase, or --rebase --autostash) instead of inheriting pull.rebase / pull.ff. With neither configured, git exits 128 on a diverged pull without touching the repository — that was the whole bug.
  • In-progress operations are detected from the git-dir markers (MERGE_HEAD, rebase-merge/, CHERRY_PICK_HEAD, …), following the gitdir: pointer so linked worktrees and submodules count too. It's a couple of stat calls, no subprocess.
  • Rewrite detection is git cherry (patch-id equivalence) plus a merge-base probe — two calls, run once per selection and only while diverged.
  • Conflicted files are identified by the porcelain v2 line kind (u), not by the XY letters, so DD and AA conflicts aren't missed.
  • merge --continue / rebase --continue run with the editor suppressed, so they can't hang waiting on one that can never appear.
  • 264 framework tests and 26 app tests cover the new surface, including operation detection against real repositories and a linked worktree.

Install

  1. Download FinderGit-0.23.0.dmg
  2. Open the DMG and drag FinderGit into Applications
  3. Launch normally — signed with Apple Developer ID and notarized by Apple

Requirements

macOS 15 Sequoia or later.

Verify this download

Compare the checksum of the file you downloaded:

shasum -a 256 FinderGit-0.23.0.dmg

It must print exactly:

7f2e150810ca390094693cef28b900152e03c6cdcd70de5e416aaa8a1ff627a1

The DMG is also signed with an Apple Developer ID and notarized by Apple, which you can confirm without installing it:

spctl -a -vv -t open --context context:primary-signature FinderGit-0.23.0.dmg

That reports source=Notarized Developer ID for a genuine build.