You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Terminal settings gained a Custom command… mode — give a full command with a {path} placeholder (for example wt -d {path} or tmux new-window -c {path}) for
multiplexers, wrappers, or any terminal the auto-detection doesn't know. The command
runs shell-free, and macOS "Custom…" now also launches plain (non-.app) executables
correctly.
Explore repositories. A new full-page browser for finding a repo without knowing its
URL, with GitHub, GitLab, and Bitbucket tabs, a search box, and a sort control
(best match / most stars / recently updated). Before you type it shows your own
repositories grouped by owner and a Popular star-sorted feed (GitHub & GitLab);
typing searches all of GitHub (up to 1,000 results), all public GitLab projects, or your
Bitbucket workspaces. Open a result for its README preview and Clone it, Fork it
(all three providers, then clone the fork), Star / Unstar it (GitHub & GitLab), or
view it on its host. Reachable from the welcome screen and the command palette, and fully
keyboard-navigable.
Per-session isolation. Pick Worktree or Container for a single agent session
from the composer's Options, overriding your Settings → AI default for that one run
(Best-of-N arms share the pick). Choosing a container checks readiness inline — Docker or
Podman installed, the engine running, the agent image built — and keeps Send disabled
until it is, naming what's missing and offering a jump to Settings where that's what it
takes to fix it.
Link issues when you open or edit a PR. The Create and Edit PR dialogs now have a Linked issues row (GitHub & GitLab, wherever the repo has an issue tracker):
reference real repo issues that are auto-detected from your branch name and commit
subjects, proposed for you when you Generate the description (from a grounded
shortlist of your open issues), or added by hand. Toggle each between Closes
(auto-closes the issue on merge) and Relates to — they're appended to the
description as Closes #N / Relates to #N lines, and opening Edit peels any
trailing ref lines back into chips (keyword preserved) and re-appends them on save, so
the chips are the single editor for that block. Local PRs get the same row (create
and edit), and their ref lines survive promotion verbatim to become real closing
refs on the forge. On a Bitbucket repo with a linked Jira project, the row
surfaces linked-Jira issues (KEY-123) as mention-onlyRelates to chips (Jira
tickets are never closed from PR text).
Locate a moved repository. Moved a repo on disk? The "no longer a git
repository" notice now offers Locate… to point GitDesktop at the folder's
new location — the entry keeps its alias, badges, and settings, and its app data
(local PRs and issues, review history, automations, and any Jira link) follows the
repo to its new home — alongside the existing Remove.
Reviews you run yourself now read the author's Notes for reviewers. Until now only
automated reviews saw them; the Review and Security audit buttons feed them to the model
too. A new Ignore author notes toggle in the review panel sets them aside for a run,
alongside the existing opt-outs for your previous review and external bot findings.
Queue a second AI review. Run a code review and a security audit on the same
pull request without waiting: start one while the other is streaming and it queues, then runs automatically when the first finishes. A chip shows what's
up next (with Dismiss to drop it), and cancelling the running review still
lets the queued one proceed.
Changed
The MCP stage_files, unstage_files and stash_push tools now read each
entry as one exact file or directory, so an agent acting on src/app/[slug]/page.tsx no longer touches its neighbours alongside it — which
for stash_push meant sweeping another file's uncommitted work out of the
working tree. Pass literal: false on the call to use a git pathspec or glob
such as *.log. The read-side commit_diff and working_diff tools' path
argument now also matches exactly, as their descriptions always said.
AI reviews converge in fewer rounds — a fuller first review, then fewer of them.
A re-review now checks each applied fix's own hunks — and how the fixes interact — in
the same round, and suggested fixes spell out what else they oblige you to touch, so
one round's fix stops becoming the next round's finding. A problem repeated across
files is reported once with every affected location, and everything the reviewer is
confident about lands in the first review instead of trickling out over several.
General re-reviews collect late-noticed polish in an explicitly non-blocking
leftover list instead of letting it hold rounds open, and every re-review — general or
security audit — wraps up in a line once nothing substantive is left. Decisions
you recorded in the PR description or Notes for reviewers are respected for every
kind of finding, and when a large diff crowds out GitDesktop's own earlier comments
the review is told they were omitted rather than quietly losing the record.
Agentic AI reviews now get 20 minutes before timing out (up from 10), and a new Review timeout setting under Settings → AI lets you raise or pin the limit
for agent-CLI reviews.
Re-reviews end with a verdict — every AI re-review, general or security audit, now
closes with one of two explicit lines: Verdict: blocking issues remain, or Verdict: no blocking issues — remaining items are non-blocking; merge when ready.
A round that resolved everything but noticed one nit used to read as another round;
now it says which it is.
Reviews know where your docs live. A general review is given the repository's
documentation surfaces by path — README, changelog, changelog fragments, docs
directories — so a user-facing change that leaves any of them stale comes back as one
finding naming every affected surface, including ones the diff never touched, instead
of one surface per round. Your custom instructions now reach reviews too — the
global ones from Settings and a repo's own .gitdesktop/instructions.md — as
conventions to judge the change against.
The opening comment now keeps a guaranteed share of the budget, not just its
place in the queue. Being kept rather than dropped only settles which comments
make it in; how much of each one survives is decided earlier, and there the opening
comment was treated as just another block — so on a long thread it was squeezed to
the same per-comment minimum as a one-line "fixed in <sha>" reply. It is now
allotted its share before the rest divide up what remains, and the decision-ledger
distiller reads more of every comment on shorter threads.
Fixed
AI ignore patterns now follow .gitignore's matching rules. A bare name
matches at any depth (secrets.env also covers config/secrets.env), a bare
folder name hides that folder's contents wherever it sits (node_modules), a
leading / anchors a pattern to the repo root, and * stops at a /, so docs/*.log covers docs/a.log but not docs/sub/b.log. Patterns you
already have may hide more than they did: saved lines carry no anchor —
including every one Exclude from AI added — so a stored notes.md now hides
each file of that name rather than only the copy at the root, and a stored build or node_modules now hides those folders instead of nothing at all.
That only ever withholds more from a model, never less, but it's worth a look
at your lists. Exclude from AI now writes anchored lines
(/src/config.ts, /vendor/) that mean the one file or folder you picked,
matching what Ignore writes to .gitignore. ! re-include lines aren't
supported.
Files with unusual names survive diff parsing. git escapes a non-ASCII path
like café.txt when it writes a diff, and GitDesktop skipped those files when
splitting a combined diff into per-file sections — so such a file showed no
diff in a pull-request or commit view, and was dropped from the diff sent for
an AI review or a generated description rather than being weighed against your
ignore patterns.
Your AI ignore patterns are now honored by AI reviews — the ones you start
from the PR panel and the automated ones alike, including the "changes since
your last review" delta they build on — where the whole diff previously
reached the provider. The prompt states how many files were held back rather
than passing the diff off as complete, and if every changed file is excluded,
nothing is sent at all. As everywhere else, a model that reads your repository
itself isn't limited by these patterns — that's what Agentic review on a
pull request turns on.
An automation review claim left behind by a crashed or outdated app instance no
longer blocks that pull request's review for other instances — a stale claim is
reclaimed after 30 minutes instead of waiting for the 30-day sweep. The
missed-review catch-up now works per review mode, so a failed general review is
retried even when the security audit already ran.
Your AI ignore patterns are now honored when generating the description
for a pull request you're creating (local PRs included, and the MCP generate_pr_description tool), when generating a squashed commit's message,
and when generating a reworded commit's message in Edit history — those paths
previously sent the whole branch diff to the provider. The prompt states how
many files were held back rather than passing the diff off as complete.
Generate from changes now works on a branch whose work is already
committed. Whenever the working tree can't describe the branch being named —
it's clean, or you're renaming a branch you aren't on — it names the branch
from that branch's own committed work instead: the diff and commit subjects
vs. the default branch. That's exactly the case a rename usually needs.
Applies in the app and to the MCP generate_branch_name tool and prompt, and
when the button is disabled it now says why.
Editing or deleting a commit comment while viewing a fork through the
parent-repository (upstream) lens now targets the same repository the comment
was created on, instead of failing against the fork.
External AI-reviewer findings now fair-share the review-context budget instead of each
being cut at a small fixed size, a trimmed finding says so explicitly, and the Review
context size setting now reaches that section of the prompt.
File actions and views now use exactly the file you picked when its path
contains [, * or ?. On a dynamic route like src/app/[slug]/page.tsx,
staging, unstaging, discarding, stashing, ignoring, untracking, force-adding
and taking one side of a conflict all act on that file alone. Those paths used
to be handled as match patterns, so a neighbouring file could be swept in
alongside the one you chose — most seriously, discarding changes could throw
away another file's uncommitted work, and resolving a conflict could silently
resolve a second file the same way. Reading is exact too: a file's history, and
its diff in the working tree, in a commit, in a stash, or against another
branch, no longer fold in a neighbour's commits and hunks. Ignore and Exclude from AI also write a working pattern for a name that ends in a
space, which previously matched a different file and left the one you picked
alone.
Jira estimate fields no longer keep showing the "Enter a Jira duration" warning
after the value refreshes from the server.
AI re-reviews now read long GitDesktop-posted PR comments (context briefs, triage
summaries) in full when the review-context budget has room — previously every such comment
was silently cut to 1,500 characters no matter how much budget was free, so a reviewer
could be handed a numbered list that stopped after item 2. A comment that still has to be
trimmed now says so explicitly in the prompt instead of trailing off in a bare ellipsis.
Long review threads keep their recorded decisions. When GitDesktop's own comments
on a pull request substantially outgrow the review-context budget, the AI review now
reliably distills them into a compact decision ledger — reading the complete comments
rather than the already-trimmed ones, and giving an agent-CLI generation model the time
it needs to finish — so refutations and "fixed in <sha>" notes survive a long thread
instead of being cut away with the text.
When a PR's own-comments context outgrows its budget, the opening context comment is now
kept alongside the newest follow-ups instead of being the first thing dropped.
Merging a repository's old app data — on relocate, or when older path-keyed
records are folded onto its stable identity — no longer lets duplicate legacy
records (including records without ids) through.
Your AI ignore patterns now apply when you regenerate the description of an
already-open pull request or merge request, not only when you create one.
Excluded files are dropped from the forge's own diff before it reaches the
provider, and the prompt states how many were held back rather than passing the
diff off as complete; if every changed file is excluded, nothing is sent at all.
The error shown when a history-rewrite operation is blocked by uncommitted
changes no longer contains garbled characters — the dash renders properly.
Security audits no longer assume GitDesktop's own tech stack. The audit prompt told the
model, as fact, that the code in front of it was Rust and React, and applied exemptions
written for that stack to every repository you audit. Anything reachable through
environment variables or command-line flags was trusted outright (untrue for a server, a
container, or a shared CI runner), and missing authorization was waved off in frontend code on
the assumption that a separate backend was re-checking it. Each of those rules is now judged
against the code actually under review, and an audit sizes up the change's own language, trust
boundary, and existing validators first. Prototype pollution is now a named category too.
More vulnerability classes can actually be reported. The audit's list of risk categories
read as closed, so a real issue that fit none of its buckets — cross-site request forgery or a
missing origin check, over-permissive CORS, clickjacking — had nowhere to be filed; the list is
now explicitly open-ended. Memory-safety problems are also caught in the unsafe corners of
otherwise-managed languages (Java's sun.misc.Unsafe, Swift's Unsafe*Pointer, a Kotlin/JNI
boundary), and a value read from a cloned repository's own content and passed to a spawned
command is no longer treated as trusted just because the tool runs on your machine.
Sharper severity and confidence on security findings.Critical is now a severity that a
finding can actually carry — remote code execution, code execution triggered by content you
merely clone or open, full system compromise, or a mass data breach — where before it was
referenced by the reporting rules but never defined, so the worst issues had nowhere to go but
High. Confidence is now calibrated by what the reviewer actually saw, and the flat
">80% confident" rule that contradicted the severity-scaled thresholds is gone.
Updating a single submodule whose path contains [, * or ? now updates
that submodule. It previously initialized and checked out a different one
whose path happened to match, and left the one you asked for untouched.