Repository navigation
Releases: abgebaumt/forkyard
Releases · abgebaumt/forkyard
Release list
Forkyard v1.1.0
Added
- Crash reports: the app now keeps a redacted log (
logs/forkyard.login the data folder). If it
panics or ends without shutting down, it saves a report there and offers it on the next start
(View, Save…, Discard; also “Show crash reports” in the command palette). Nothing is uploaded. - Reflog: a view of where HEAD or a branch has pointed, newest first – including commits no branch
reaches any more (shown, but without actions). Selecting an entry shows the commit; its menu creates a
branch there, checks it out, resets the current branch to it (with undo) or copies the SHA. Open it
from the command palette (“Show reflog”) or from a branch’s menu. - Bisect: “Start bisect …” on one or two commits in the graph. A bar above the graph shows “Step n of ~m”
with Good, Bad, Skip and End, the rows mark good, bad and skipped commits, and the first bad commit is
named as soon as it is certain. A bisect started on the command line is picked up, including its own terms. - Collapse merges: the arrow on a merge row (or ← / → on the selected merge) hides the commits the merge
brought in and shows “+n commits”; “Collapse all merges” / “Expand all merges” (Ctrl+Shift+[ /
Ctrl+Shift+]) also covers pages loaded later. Commits a branch or tag points to stay visible. - The graph marks commits of the checked-out branch that are not pushed yet (↑) and commits of its
upstream that are not pulled yet (↓). - Image diff: besides side by side, images can be compared by swiping, as an onion skin (opacity
slider) or as a pixel difference that highlights changed pixels and dims the rest. Images of
different sizes are aligned at the top left; the last mode is remembered. - Ticket links: issue numbers and ticket keys in commit messages (details and graph) open in the
browser. Sources: the repository's host (#123, on GitLab also!123), presets for Jira, Linear,
YouTrack and Redmine, own patterns with an address template (Settings › Project › Ticket links),
and a.forkyard/links.jsonin the repository
({ "version": 1, "rules": [{ "id": "ops", "pattern": "OPS-(\\d+)", "url": "https://ops.example/t/$1" }] }).
Patterns are checked; the file only creates links and runs nothing. - Conflict preview: before a merge, rebase, cherry-pick or revert the app checks – without touching
the working directory – whether Git would stop on conflicts, names the files (for a series also
the first conflicting commit) and lets you go ahead anyway. The rebase tool shows the result live. - Partial stash: selected lines and hunks from the diff view can be stashed (“Stash selection …”);
everything else stays in the index and the working directory. Undo restores the lines and drops
the stash. - Rebase with dependent branches: “Move dependent branches along” rebases stacked branches in the
same step (--update-refs); one undo resets all of them. - Push several branches and tags at once (“Push with more branches and tags …”), with “All or
nothing” (--atomic) and a result per ref. Forcing a branch always uses--force-with-lease. - Delete a remote branch on its server: “Delete … on origin …” in the menu of a remote branch (sidebar
and graph), “Delete … on remote …” on a local branch with an upstream, and “Delete branch on remote …”
in the command palette. The prompt names remote and branch and the local branch that stays; if
someone else already deleted it, the app says so and removes the stale remote branch. - Submodules can be moved to another folder (“Move …”).
- After checkout (also of a new branch or a pull request), pull, merge, cherry-pick, revert, hard
reset, a finished rebase, gitflow finish, bisect steps and undo/redo, changed submodules are
updated in the background; a failure shows a warning. A submodule with commits checked out that
no branch holds is left alone and named in the warning. Can be switched off per project. - Git LFS file locks: the Git LFS dialog lists the repository’s locks with a filter and unlocks
your own or – after a prompt naming owner and file – other people’s locks. Changed files and the
file list of a commit show a lock symbol with the owner, a right-click locks or unlocks files,
and the commit panel warns when staged files are locked by someone else (committing stays
possible). The list is read again after every fetch; a server without file locking says so
instead of showing an empty list. - Custom commands: your own programs, Git commands and web addresses with placeholders (
${repo},
${sha},${branch},${file},${remote},${input:<id>}) and an input form, in the command
palette and the context menus of commits, branches, files and submodules (Settings → Custom
commands, with import and export as JSON). Values are always passed as single arguments, never
through a shell; a command can show the finished line before it runs, and runs can be cancelled.
A repository can bring commands in.forkyard/commands.json; they only run after you approve
exactly that version of the file. Seedocs/custom-commands.md. - Command line:
forkyard --helpandforkyard --versionanswer without opening a window. The
Windows installers put the program folder on the PATH and remove it on uninstall, deb and rpm
install/usr/bin/forkyard, and for the AppImage and the macOS app the command palette offers
“Install command-line command”. - Statistics: a “Statistics” view per repository (toolbar or command palette) with commits by
weekday and hour, commits over time, authors, a treemap of the most changed files, hotspots,
knowledge per folder with bus factor, code age fromgit blameon the largest text files,
and records. It runs as a cancellable background job for a period and branch; results are
cached per commit and period (numbers only, never commit contents). - Hosts: Gitea and Forgejo (including Codeberg and self-hosted instances), Bitbucket Cloud and Azure
DevOps join GitHub and GitLab – pull requests (list, read, create, change, comment, merge, close,
check out) and issues; on Azure DevOps these are work items, which can also be created from the app.
Remotes are recognised in their HTTPS and SSH forms (includingssh.dev.azure.com,
vs-ssh.visualstudio.comandaltssh.bitbucket.org). Tokens stay in the system keychain;
Bitbucket signs in with the account e-mail and an API token. - Update check: once a day (and on “Check for updates…” in the command palette or Settings › About)
the app asks GitHub for the newest stable release. A newer version shows up quietly in the status
bar and once as a message with an excerpt of the release notes; “View release” opens the release
page in the browser, “Skip this version” silences it. The request sends nothing but the app version
in the user agent; drafts and prereleases are ignored, nothing is downloaded or installed. Turn it
off under Settings › About › Check for updates automatically.
Changed
- Redaction also removes bare GitHub (
ghp_…,github_pat_…) and GitLab (glpat-…) tokens. - The app only offers what a host can do: merge methods, drafts, reviewers, labels, reopening, checking
out pull requests from forks and the issue tracker follow the host (and the repository's settings). - Settings › "GitHub and GitLab" is now Settings › Hosts.
- Redaction also removes Atlassian API tokens and Bitbucket app passwords (
ATATT…,ATBB…). - Switching profiles and the author name hint only promise the profile identity when it is written to
the gitconfig; a new profile takes over the active profile's gitconfig setting. - Ending the app with SIGTERM, SIGINT, SIGHUP or by closing the console counts as a clean exit.
Fixed
- A host request whose network read is interrupted by a signal (for example when a Git process ends at
the same moment) is retried and no longer reported as "not reachable". - Statistics: the code age is measured against today instead of the last commit, so a repository
nobody touched for years no longer looks young; a cached result is sorted again against today. - Statistics: a renamed file or moved folder keeps its history from before the rename in hotspots,
the treemap and knowledge per folder. - Statistics: knowledge per folder says what it measures – the share of changed lines per person.
- Statistics left open past midnight are computed again for the new day instead of showing
yesterday's period and code age as up to date. - Statistics of a repository without commits say "No commits yet" instead of pointing to a longer
period. - Statistics: the dates under “Commits over time” no longer overlap when the period spans two years.
- A failed commit signature is reported as a signing error instead of "not found".
- Applying a stash restores its untracked files through the stash itself, and a patch from a stash
includes them. - Partial patches keep an old last line without a final newline behind the lines it followed.
- Backups and patch exports copy the index with its original timestamp, so files rewritten in the
same instant are no longer seen as unchanged. - Opening a repository reads the LFS patterns from
.gitattributesand no longer installs LFS hooks. - A remembered account also answers the credential prompts of
git-lfs. - The rebase step counter counts only the commits that are replayed.
- Resetting to a commit outside the loaded graph counts only the commits that really leave the branch.
- New refs in freshly created ref folders are noticed without a reload.
- "Load more" in the sidebar sits below the pull request rows.
- The pull request view leaves out the labels block for hosts without labels.
- A commit's changed files show the LFS lock symbol.
- A local (
file://) remote counts as an LFS server without file locking. - The reflog keeps its selection when new entries arrive and shows the highlighted entry in the commit
panel when it opens. - A bisect started in a terminal is noticed.
- A custom command's...
Forkyard v1.0.0
The first public release of Forkyard: a fast, local Git client for the desktop with a real commit graph, line staging, a three-way merge tool and an Undo button for Git. No account, no telemetry, no cloud.
History and graph
- Commit graph with branch lanes, merge lines, ref labels and a WIP row, laid out in Rust and drawn on a canvas
- Search by message, SHA and author; file history and blame
- Compare any two commits, or a commit with your working directory
- Pin, hide or solo branches; smart branch visibility for large repositories
Committing
- Stage files, hunks or single lines – CRLF, Latin-1 and missing final newlines included
- Amend, commit and push in one step, commit templates, co-author trailers
- Side-by-side and inline diff with word-level highlighting and syntax colours
- Built-in editor with Markdown preview
Branching and merging
- Drag a branch onto another to merge, rebase or open a pull request
- Interactive rebase: pick, reword, squash, drop and reorder
- Three-pane conflict tool with an editable result
- Cherry-pick, revert, reset (soft/mixed/hard), stashes with names and per-file apply
Everything around it
- Undo for Git: destructive actions create a backup ref first, so
Ctrl+Zbrings your work back - Tabs for several repositories, workspaces, profiles (e.g. work and private)
- Settings on three levels: global, per profile, per project (identity, SSH key, pull mode)
- HTTPS and SSH credentials in the OS keychain, SSH key generation, proxy and custom CA
- GitHub and GitLab: pull requests and issues through the official APIs
- Worktrees, submodules, Git LFS, Git Flow, commit signing (GPG/SSH), hooks
- Repositories whose config or hooks would run programs stay locked until you trust them
- Command palette, keyboard shortcuts, embedded terminal, light and dark theme, English and German
Install
Installers for Windows (x64, ARM64), macOS (Apple Silicon, Intel) and Linux (.deb, .rpm, .AppImage) are attached below; SHA256SUMS.txt lists the checksums. Forkyard needs Git 2.39 or newer.