Current versions:
Stable: 1.7.4 Beta: 1.7.5 Alpha: 1.7.5- Fixed an issue where
gt submitwould incorrectly warn about out-of-date trunk when trunk was up-to-date. - Fixed a bug where
gt submitwould fail with a force-with-lease error with custom fetch refspecs (or shallow clones). - Added automatic re-tries in some cases to improve
gt submitreliability.
- Added gt upgrade command to update the CLI.
- Introduced automatic background updates (configurable via user settings).
- Added a feature to automatically fast-forward the trunk to the upstream merge base when it’s out of sync, improving UX during sync operations.
- Added a feature that prevents submitting changes after a branch has been merged or added to a merge queue.
- Merged branches are now shown as merged in status and are uneditable to prevent accidental edits.
- Performance improvements to gt log —short and gt checkout
- Improved messaging to help users resolve “BlockedWhileMerging” errors by suggesting next steps in the CLI.
- Fixed messaging in gt demo stack output to use “upstack” instead of “downstack” for descendant branches.
- Fixed a critical logging regression that caused loss of debug logs.
- Fixed an issue where the CLI wouldn’t update the trunk when fetching if a branch hadn’t yet been submitted.
- Added a feature to block submits and modifications to merging branches.
- Added various performance optimizations on sync/get commands.
- Fixed issue where syncing or fetching a frozen branch would unfreeze it.
- Added controls to show/hide inline tips.
- Added
--reset-authorflag togt modifyfor resetting commit authorship. - Added the ability to
gt getPRs opened outside of Graphite. - Added
--upstackand--downstackoptions togt delete - Fixed bug where progress indicators would sometimes interfere with prompts for ssh key passphrases.
- Fixed autocomplete output formatting for better terminal compatibility.
- Added new
gt freezeandgt unfreezecommands. Freezing a branch prevents modifications to that branch. - New branches from
gt getwill be frozen by default. - Added warnings for newly empty branches after restack operations.
- Added a cap to debug log size.
- Improved
gt feedbackexperience and reliability. - Fixed issue where
gt undocould remove unstaged or untracked changes. - Fixed bug where
gt undosometimes failed aftergt continue. - Fixed issue where org prefixes were duplicated for team reviewers in PRs.
- Fixed branch sync to correctly detect trunk status when upstream is missing.
- Fixed issue where
gt syncwould hang when branches were too far behind trunk. - Automatically set
--no-interactivemode when stdin/stdout are not TTYs.
- Added warnings when trunk is out of date during
gt submit. - Fixed an issue where
gt syncandgt getcould result in slow operations. - Fixed an issue where
gt feedbackincorrectly reported a failure. - Fixed an issue where
gt submitincorrectly required the--forceflag. - Fixed an issue where
gt logwith-n 0would report the incorrect branch. - Fixed an issue where
gt revertwould fail to perform any action. - Fixed an issue where git hooks configured absolute paths would not be found.
- Fixed an issue where
gt submitwould incorrectly report a branch as having a “New parent”. gt submit --branchnow validates that a branch name is provided when the flag is used.- Fixed an issue where
gt absorbwould fail with an error message “Shas does not match current stack”. - Fixed an issue where rebasing empty branch could cause incorrect metadata.
- Fixed an issue where
gt trackwould not recover a diverged branch if the branch was already tracked. - GT MCP beta released.
- Add an option to cancel the operation when
gt getorgt syncencounter merge conflicts. - Fixed an issue where
gt submitwould incorrectly warn about missing remote changes.
- Added logging of processes holding index.lock when Git commands fail due to lock contention.
- Extended debug log expiry from 1 to 7 days for better access to historical logs.
- Added validation for unexpected arguments in the
gt checkoutcommand to avoid accidental invocations. - Fixed an issue where some vscode extension activity could cause excessive log file usage.
- Fixed a bug where
gt submitandgt synccould incorrectly report a new remote version. - Fixed a bug where
gt submitmay try to push the same branch twice. - Fixed a bug where help text would be displayed in a single column when piped to another command.
- Fixed an issue where polling in the vscode extension could cause large amounts of log file usage.
- Fixed a bug in
gt submitandgt syncthat caused performance degradation and crashes when pull requests were modified outside of Graphite.
gt trackshows the exact number of commits that will go into the new branch, making it easier to spot oversized stacks.- Updated git fetch commands to no longer fetch tags, reducing network usage and speeding up operations.
- Fixed a bug in
gt prwhere branch names were interpreted as a PR number if they started with a digit. - Fixed a bug in
gt submitwhere PR descriptions were being generated larger than the GitHub PR description limit. - Fixed a bug in
gt submitwhere PR titles were being generated larger than the GitHub PR title limit. - Fixed a bug in
gt submitwhere pushing all the branches in a stack could partially fail leading to inconsistent diffs in some PRs. - Fixed a bug in
gt submitwhere temporary branches were not being cleaned up correctly. - Fixed a bug in
gt createwhere the branch name was incorrectly added to the commit message. - Fixed a bug where in certain cases, trunk commits could be included in a tracked branch, resulting in many Graphite operations hanging or failing.
- Fixed a bug where certain cases of syncing a branch submitted outside of Graphite would crash the CLI.
- Added better protections against running too many
gitsubprocesses.
- Fixed a bug where in certain cases, trunk commits could be included in a tracked branch, resulting in many Graphite operations hanging or failing.
- Fixed a bug where certain cases of syncing a branch submitted outside of Graphite would crash the CLI.
- Added better protections against running too many
gitsubprocesses.
- Added support for multiple
-mflags ingt create,gt modify, andgt squash. - Provided additional context when commands fail due to Graphite maintenance and incidents.
- Use commit message for branch name if there are no staged changes.
- Updated output colors to avoid difficult to read output.
- Fixed a bug where
gt feedbackcould fail due to large log files. - Fixed a bug where the remote repository could be marked as ”.
- Fixed a bug where a large number of commits can cause “Invalid string length” exceptions.
- Fixed a bug where whitespace in the repository path is not handled correctly when worktrees are used.
- Dropped official support for Node 18 in anticipation of its end-of-life date on 2024-04-30.
- Removed
gt interactive
- Introduced a progress bar for
git fetchandgit pushoperations. - Fixed an issue where feature flags could be inadvertently disabled.
- Adjusted some command output formatting for consistency.
- Cleanup
graphite-basebranches if a submit fails to push to remote - Fixed a bug where
graphite-basebranches were incorrectly introduced in trailing trunk multi-trunk configurations - Fixed a bug where
gt submitcould lead to incorrect diffs upstack if submit was not run on the full stack - Fixed a bug where
gt renamedid not use configured branch prefixes - Fixed a bug where
gtcommands could fail withEAGAINerrors - Fixed a bug where
gt deletecould fail when run on untracked branches
- Fixed a bug where
gt submiton a stack would lead to temporary incorrect diffs on the upstack remote PRs - Fixed a bug where
gt syncfailed with"RangeError: Invalid string length" - Updated
gt renameto fail if the user aborts the command - Updated
gt squashto fail if the squash command does nothing - Updated all output to properly respect the
--no-interactiveflag (e.g.gt log,gt info…)
- Introduced
gt abort, which aborts the current rebase operation and restores the repository state to before the original command that introduced the conflict - Introduced
gt undo, which undoes the most recent Graphite mutation, restoring the repository to its state before the mutation was applied - Fixed a bug where submitting a moved branch could temporarily result in incorrect diffs on remote
- Updated
gt createto prompt for a branch name for empty branches if one was not provided
- Internal improvements to config files
- Add linux arm64 build to releases
- Added additional debugging information for pr info updates
- Fixed a bug in
gt demothat would corrupt the repo’s name and owner - Updated sending non-info cli output to stderr instead of sending everything to stdout
- Fixed a bug where
gt syncwould not update trunk if there were no previously submitted branches - Updated
gt submit --branchto work while checked out untracked branches - Updated support for git pre-push hooks on Windows machines
- Added support for working with and updating branches checked out across worktrees
- Added support for working with branches automatically rebased by graphite
- Fixed a bug where adding an undefined trunk would corrupt cli metadata
- Fixed a bug where
gt sync --allwould only clean up branches on the current trunk - Improved
gt submitperformance by skipping unnecessary fetches - Improved performance of deleting branches by only deleting required metadata
- Updated
gt checkoutto work while on a detached head - Updated
gt submitto submit branches that have never been submitted with Graphite - Updated
gt syncto better handle cases where the branch was updated outside of Graphite - Updated
gt init --trunkto warn against setting a trunk that does not exist locally - Updated
gt syncandgt getto work on untracked branches
- Added new
gt unlinkcommand to unlink a branch from the currently associated PR - Added better support for re-using branch names
- Added support for passing a branch name to
gt info - Added installation information to CLI releases
- Fixed a bug where rebases would not handle commits without a parent commit (e.g. original or orphaned commits)
- Fixed a bug where rebases with merge commits would cause conflicts with already merged commits
- Fixed a bug where request error logs could cause circular structure errors
- Updated
gt renameto use the correct name when asking for a rename confirmation - Updated
gt create --insertto leave descendants in an un-restacked state when there are conflicts - Updated
gt deleteto also prune branches - Updated pre-push git hooks to better handle running in repo root
- Added a
--stackflag togt checkoutto only show current stack - Fixed a bug where
gt logandgt checkoutdon’t work on untracked branches - Fixed a bug where unsetting a trunk would not fully unset it
- Fixed a bug where
gtthrows a cannot read undefined error while reading “validationResult” - Fixed a bug where
gt trackmight get into an infinite loop while recovering diverged branches - Improved merge conflict status to handle unstaged changes during rebasing
- Updated instructions for committing untracked files to be more clear
- Updated networking error diagnostics
- Updated
gt pr,gt docs, andgt dashto print out the URL being opened
- Added support for
--verbose/-vingt createandgt modifyto include the diff in the commit message template - Added a
--addflag togt trunkto configure an additional trunk branch - Updated list of unmerged conflict files to print paths relative to the current working directory
- Updated
gt createto suppress the detached HEAD message on every create - Update pre-push hook error messages to include more details
- Updated
gt demoto work in repos the user cannot submit to yet - Fixed a bug where the branch name date prefix was incorrect in
gt config - Fixed a bug where
gt submitwould not fetch the branch before submitting to determine if it needs submitting - Fixed a bug where
gt continuewould swallow the post-rewrite git hook output - Fixed a bug where
gt trackwould incorrectly tell you to track the branch - Fixed a bug where the
--forceflag was not respected ingt submitwhen the remote was updated - Fixed a bug in the interactive selector with
--allwhere trunks could not be correctly selected
- Added a
--trunk/-ttogt checkoutto switch to the current trunk - Fixed bug where
gt syncwould try to update a trunk you don’t have configured - Fixed bug in
gt demothat incorrectly created a “-p” directory to run the demo in - Updated
gt init --resetto also reset PR metadata - Reduced the maximum number of parallel git calls in order to reduce spawn errors
- This version of the Graphite CLI adds support for working on multiple trunks that will be rolled out over the coming weeks via a server-side feature flag.
- Updated
gt squashto no-op when there are no commits to squash or only a single commit - Updated all prompt suggestions to support fuzzy searching branches
- Updated
gt demoto initialize Graphite automatically if the current repo has not yet been initialized
- Updated
gt absorbto print the number of hunks that were not absorbed - Updated
gt logto not showupdated remotelysince it does not respect the new sync changes - Fixed bug where
gt syncwould always ask to reconcile when there were local changes
- Updated
gt modifyto print out conflicts when it cannot restack cleanly - Added better error handling in
gt sync/getfor server-side errors - Fixed more cases of the bug where local version was being overwritten by remote even when user selected
nofrom prompt - Fixed bug where remote tracking errors would cause commands to fail completely
- Fixed bug where staged changes were incorrectly detected because of a stale index cache
- Updated
gt feedbackto not require to be run in a repo - Fixed bug where a command could trigger thousands of parallel git commands at once causing spawn issues
- Fixed bug where
gt getwould try to checkout a branch that was just deleted
-
Updated
gt modifyto leave descendants in an unrestacked state when there are conflicts. -
Updated
gt splitbehavior to skip git hooks. -
Fixed bug where local version was being overwritten by remote even when user selected
nofrom prompt. -
Fixed bug where remote rebase-only changes were not reconciled during
gt sync. - Fixed bug where staged changes were incorrectly detected as unstaged.
- Fixed bug where files changed in parent directories were not detected.
- Fixed bug where children of split branches were not being tracked.
- Fixed bug where pre-push hooks were not being run from the repo root.
- Removed references to deprecated command names.
-
Fixed multiple issues with the new versions of
gt get,gt sync, andgt submit. The new versions will be rolled back out with this release. -
Fixed an issue where
post-checkouthooks were swallowed, resulting in issues when interactive scripts are used. - Fixed some typos in command output.
-
gt demonow skips all Git hooks (with an implicit global--no-verify). -
gt syncno longer prints outRestacking branchesif there are no branches to restack. -
Added details about troubleshooting to
gt --help.
-
Fixed an issue where
gt submitcould fail in certain cases due to the format of a Git remote URL. -
Fixed an issue where the wrong branch name was referenced by
gt move’s prompt. -
Fixed an issue where
gt absorbcould fail in certain environments. -
Fixed an issue where
gt log shortcould incorrectly show a branch as “updated remotely” when it was not. -
Added interactivity to
gt feedback.
- Fixed a bug where
gt submitwould hang in certain cases.
-
Updated
gt submitto match the new behavior ofgt syncandgt get. -
gt submitnow skips branches with no commits between head and base and their descendants, instead of failing outright (GitHub does not allow PRs with no commits). -
gt submitnow prompts to restack if the--restackflag is not passed and it would fail without restacking. -
Fixed a bug where
gt submitwould restack in certain cases when the--restackflag was not passed. -
Fixed a bug where
gt submitwas not prompting to choose between pasting template/commit messages and editing them. - Fixed a bug where legacy scoped submit commands were not enforcing that branches be restacked before submitting.
- Deleting branches in
gt sync,gt get,gt submit, or withgt deletenow prints the SHA the branch was at before deletion like Git, as there is no reflog for deleted branches.
-
Added better error messaging for the new version of
gt syncwhen unauthed. -
Fixed a bug where commands that open a URL would fail if
xdg-openwas not installed, instead of printing the URL to the terminal. -
Fixed a bug where
gt getwould not set up the remote-tracking branch properly. -
Fixed a bug in the new version of
gt getandgt syncwhere branches would not get newly associated with PRs. -
Fixed a typo in
gt absorb.
- This version of the Graphite CLI includes a significant update to
gt syncandgt getthat will be rolled out over the coming weeks via a server-side feature flag.
- The primary goal of these changes is to improve the experience of syncing remote changes to your local branches, ensuring that flows like collaborating on a stack or applying suggested edits to a PR are seamless and reliable.
-
Notably,
gt syncnow syncs all branches, where previously it just synced trunk. This brings it closer to the behavior ofgt get. -
Conversely,
gt getwith no argument passed is essentially “gt syncfor the currently checked out stack.” - The full behavior is:
- Update the trunk branch to match remote
- Clean up branches associated with merged or closed PRs
- Sync any remote changes to local branches
- Restack branches as needed
- If you’d like to be included in the initial rollout of these changes, please let us know in the #cli-beta channel on our Community Slack. Since we are using a server-side feature flag, updating to 1.3.0 alone will not enable the new behavior.
- The changes are largely based on your feedback, and we’re excited to see how they improve your experience with Graphite. THANK YOU!
-
gt createnow applies the branch prefix to branch names passed in directly (e.g.gt create branch-namewith a prefix ofprefix/will yield a branch calledprefix/branch-name). This behavior can be disabled ingt config. If the branch name already begins with the prefix, it will not be added again. -
Graphite now sets the environment variable
GTto1, which can be checked by subprocesses like an editor or Git hook to determine if they are being run from Graphite.
-
Fixed a bug where
gt absorbwould fail if the git config to detect copies in diffs was enabled. -
Fixed a bug where
gt split --by-hunkwould leave the user in a detached state if interrupted. -
If no changes are staged in a step of
gt split --by-hunk, it will now prompt to stage changes again instead of exiting with an error.
- Slightly updated help text and error messages for
gt fold.
- Fixed a segfault issue caused by a dependency.
- Added support for `gt demo` to use a temporary repository if run from outside of a repository.
- Added support for `gt demo` to be run without authenticating the CLI.
- Fixed an issue where tab autocompletion did not work inside of `gt demo`.
- Added support for `gt create` to use AI to populate commit message and branch name. This will be rolled out via a server-side feature flag over the coming weeks.
-
By default,
gt createwill now replace slashes in commit messages when inferring branch names, and will convert uppercase letters to lowercase. Both of these new behaviors can be disabled in `gt config`. -
Added individual
--edit-titleand--edit-descriptionflags togt submitto allow for editing the PR title and body, respectively.--no-edit-titleand--no-edit-descriptioncan be used to skip the prompts for each. Note that--editand--no-editwill still work as before. -
Added support for
gt submitto use AI to populate PR titles and description. This will be rolled out via a server-side feature flag over the coming weeks. -
When creating new PRs,
gt submitwill continue to a web browser to edit PR metadata.--clican be passed to use the CLI flow. -
Added a setting to
gt configto toggle the above behavior: i.e., use the CLI instead of web by default. In that case, `—web` can be passed to use the web flow.
- Fixed an issue resulting in certain commands failing when using a YubiKey-protected SSH key.
-
Fixed an issue where
gt demowould not work on Windows.
-
Debug logs are now always written, even when the
--debugflag is not passed. -
The
--debugflag now logs to the terminal as well as to a file. -
gt feedback <message> --with-debug-contextnow sends our engineers all debug logs from the past 24 hours.
- Adjusted the set of branches that might be included in the new prompt to update upstack branches.
-
Fixed an issue where staged changes could be discarded inadvertently during a
gt sync. -
Fixed an issue where
gt demowould fail on Windows. -
Added an NPM
postinstallscript to ensure NodeJS version compatibility.
-
gt submitnow prompts to update upstack branches with open PRs when run from a mid-stack branch. -
gt submitis now able to detect when GitHub/Graphite sync is not enabled for a repository. We’ll be rolling out the check for this over the coming weeks. -
A warning is now displayed when branches diverge from Graphite’s tracking, and a new flow has been added to
gt trackto remediate diverged branches. -
gt logis now sorted stably.
-
Fixed the
gt sqalias forgt squash. -
Fixed an issue where
gt submitwould fail (before submitting upstack branches) if run from a merged branch. -
Fixed an issue where
gt submitwould fail if a pre-push hook had spaces in its path. - Ensured better error messaging for various commands when a rebase is in progress.
-
Removed the
--show-delete-progressflag ofgt submit.
Fixed an issue where
gt submit would fail in repositories using git-lfs.- Adjusted some copy in
gt absorb - Fixed an issue where
gt absorbonly worked when run from the root of a repository - Fixed an issue where aborting a
gt createcould leave you in a detached state - Added protections against creating server-side PR dependency cycles
- Fixed an issue where the
gt abalias for absorb wasn’t recognized - Fixed an issue where
gt absorb --patchhung instead of opening the patch selector - Fixed an issue where invalid Graphite metadata would prevent any command from being run
- Introduced
gt absorb, which automatically amends staged changes to commits in your stack - You can now select which PR template will be used by default in
gt config gt checkout -now selects the last branch that was checked out, just like Gitgt syncnow denotes the currently checked out branch when it was unable to restack it cleanly- Added clearer messaging for the action needed to avoid detected merge conflicts on
submit - Fixed an issue where pressing Escape in an interactive prompt selected the current option
- Fixed an issue where GitHub pull request templates with extensions other than .txt and .md were not detected
- Fixed an issue where invalid/expired auth on
gt getresulted in an unclear error message - Fixed an issue where
gt getwould not work for stacked branches if using a YubiKey-protected SSH key - Fixed an issue where
gt trackwould display remote-tracking branches as potential parents
- Fixed bug in
createandmodifywhere we showed--updateas an option when there were only unstaged changes (now we only show--alland--patch) - We now show
--patchas an option forcreateandmodifyeven when there are only untracked changes - Added interface to let users pick untracked files to track in
--patchmode (increateandmodify) - Improved error messaging for
gt getfor when we can’t find a PR for the requested branch - Updated
gt get <trunk>functionality to checkout the trunk branch - Improved error messaging for when a user tries to fold a branch into main
- Added an example to
gt fold --help - Fixed bug where
gt renamecould cause branches to become untracked - Added support for
pre-pushgit hook
- Added an alias
gt --help --all, which is equivalent togt --help --all-commands
- Added an option to change the trunk branch name in
gt config - Removed prompt to submit on web when the
--no-editflag is passed togt submit - Updated
gt --help --all-commands - Added
gt completiontogt --help --all
- Fixed a bug where
gt demowould error out once the user attempts to rungt create
-
Fixed a bug where
gt submitwould unnecessarily prompt that the branch would conflict with remote. -
Fixed a bug where
gt syncfailed with"RangeError: Invalid string length" -
Updated
gt renameto fail if the user aborts the command -
Updated
gt squashto fail if the squash command does nothing -
Updated all output to properly respect the
--no-interactiveflag (e.g.gt log,gt info…) -
Updated
gt init --resetto also reset PR metadata - Reduced the maximum number of parallel git calls in order to reduce spawn errors
-
Added new
gt demofeature which interactively teaches you how to usegtto create pull requests and stacks.-
Run
gt demo pull-requestfrom any repo to create a sample PR. -
Run
gt demo stackfrom any repo to create a sample stack of PRs.
-
Run
-
Made improvements to
gt help --all-commands- Organized the commands into sections, for better scanning & readability
- Updated each command description to be shorter on this help page, for better readability
- Added docs links to the bottom of the help output
- Configured wrap width of the output to be more responsive to your terminal size
-
Colorized anything in
backticksin the help output
-
Fixed error messaging in
gt prto show the branch name when we couldn’t find an open PR for the current branch -
Fixed the copy in
gt guide workflowbased on community feedback. -
Fixed
gt mergeto correctly handle the case when a branch is locked. -
Fixed a bug with
gt getwhere it was not correctly checking out the branch after syncing it
- Improved error messaging when config file is invalid.
-
Updated
gt submitbehavior when upstack branches have merged. -
Added
gt interactivecommand to open the Graphite Interactive extension. -
Updated
gt authto print more information about the user’s auth status.
- Fixed an issue where
gt trackwould hang if no parent was explicitly passed to the command.
- Fixed bug where “needs restack” was not printing out in
gt log short.
-
Updated
gt --helpto be an overview ofgtand the Graphite workflow. -
Moved the previous command help reference to
gt --help --all-commands. - Added an inline CLI guide to the Graphite workflow, available underneath `gt guide workflow`.
- Fixed bug where aliases were not respected.
- Added retry when fetching branch from remote fails.
-
Updated the
gt submit --draftflag to only no longer convert already published PRs back to drafts. -
Added support for team reviewers. Team reviewers can either be specified using
gt submit --team-reviewers slugor throughgt submit --reviewers org/slug.
-
Added output to
log shortwhen a branch needs to be fetched from remote (usinggt get). -
Added output after
gt checkoutspecifying whether a branch needs to be submitted, fetched, or restacked.
- Removed a reference to legacy command names.
-
Improved how PR descriptions are persisted across aborted
submitruns. - Modified version prompting so users are only asked to upgrade their CLIs once per day.
- Fixed a bug in remote changes detection.
-
Added an
--updateoption forcreateandmodifythat stages changes to all already-tracked files. -
Added support for
gt get <pr-number>. -
Added a
--commentflag tosubmitwhich will add a comment with the provided text to the submitted PR. -
Added additional debugging information to the output file of the
--debugflag.
- Fixed a bug where the incorrect version number was displayed after running
gt getfor a remote branch
-
Added
gt aliases --legacycommand to automatically add all of the old shortcuts to your aliases configuration. - Added ability to navigate through prompts using ctrl+n and ctrl+p.
-
Updated
submitdescription behavior to include commit messages if no default template exists. - Updated how we detect if there are remote changes to a PR that need to be resolved.
- Fixed a bug where local state could become corrupt after switching trunk branch.
- Fixed a bug where we were syncing information for untracked branches.
-
Fixed incorrect
restackdeprecation warning.
-
Updated the default behavior on
gt submitto not restack branches. -
Added an optional
--restackflag togt submit. -
Always prompt on
gt submitif the branch will have conflicts with main.
-
Fixed a stray line of output in
gt create. - Fixed an issue where syncing PR data from remote could set the wrong parent.
-
Updated
--helpoutput to be more consistent and more helpful. -
Added a new command
gt aliasesto open up the alias file in your editor. -
Now removes
~/.graphite_user_configonce your configuration has been moved to the new location to reduce confusion.
-
gt submitnow opens the PR in your browser if you pass the--viewflag. -
gt renamenow prompts instead of immediately failing if you don’t pass--forcewhen required. -
gt upinteractive selection now prompts you a single time instead of at each level (similar to thetopchange from v1.0.2).
-
Fixed the
gt prcommand. - Fixed a bug where no error message was printed when you try to create a branch with an invalid or existing name.
- Updated branch naming validation to more closely match the Git specification. Please let us know if you see any inconsistencies.
-
Fixed an issue where restacking did not respect the
commit.gpgSignconfiguration value. -
Fixed an issue where
createwith just a branch name incorrectly failed to execute. -
Fixed an issue where the
git --versioncheck failed on Windows (and likely certain other git distributions).
-
gt topinteractive selection now offers which tip to travel to instead of prompting at each intermediate step. We’ll be porting the same behavior togt upsoon.- The--debugflag now logs to a file instead of stdout.- Clearer error messaging for outdated Git version. -
Fixed a bug where
gt synccould reset the index and working tree, and improved error handling in similar cases with uncommitted changes.- Fixed the error messge when running a deprecated command to print the correct alias file location.
- Fixed a bug where
gt submit --stackdid not work from the trunk branch.
Renaming and configuration
-
All commands that fell under
branch,stack,upstack,downstack,repo, anduserhave been renamed to drop the noun. Old command names still work, but will be removed in an upcoming version. -
The full list of commands is available in
gt --helpor at https://graphite.dev/graphite-cli-v1-command-names. -
Graphite now supports custom aliasing for any command via
~/.config/graphite/aliases(or$XDG_CONFIG_HOME/graphite/aliases). - A preset to copy into this file to keep the old short command names is found at https://graphite.dev/docs/legacy-alias-preset.
-
All Graphite configuration now lives in the interactive
gt configcommand. -
Graphite’s user-level configuration files are now XDG Base Directory Specification compliant, or stored in
~/.config/graphiteby default.
gt create-
gt createis the new command to create a Graphite branch (formerlybranch create) -
gt createnow supports inferring a branch name from the commit editor, which means it is now possible to run it with no arguments. -
If you have unstaged changes and no staged changes when running
gt create, you are now asked whether you’d like to stage and commit them as part of the new branch.
gt modify-
gt modifyis the new command to modify a Graphite branch (formerlygt commit amend/gt commit create). -
The default behavior is to amend the current commit on the branch, unless the branch has no commits or
--commitis passed. -
When amending a commit, the editor is not opened by default unless
-e/--editis passed. -
If you have unstaged changes and no staged changes when running
gt amend, you are now asked whether you’d like to stage them before running the amend or commit operation. -
gt branch edithas been moved togt modify --interactive-rebase
gt sync-
gt syncis the new command to update your trunk branch, clean up merged branches, and restack most branches in your repo. -
gt syncnow restacks all branches by default (no longer need-r). -
If any branch has conflicts with its parent branch, instead of launching you into a conflict resolution,
syncwill print out the list of conflicting branches so that you can rungt restackon them.
gt submit-
gt submitis the new command to push branches to GitHub and create stacked PRs for them. -
gt submitsubmits the currently checked out branch and its ancestors (dependent branches) by default. -
gt ssis included in the alias file by default as an alias forgt submit --stack, which replicates the behavior of the oldgt stack submit -
gt submitnow handles cases where branches in your stack have merged or been updated remotely, as long as there are no rebase conflicts to resolve. This includes both incorporating remote changes and removing merged branches from the stack. -
gt submitnow ensures that your branches are restacked instead of failing when they aren’t.
Entirely new commands
-
gt popto delete the current branch and check out its parent without modifying the working tree. Can’t be run if the current branch has children. -
gt trunkto navigate directly to your trunk branch. -
gt parentto print out the raw parent of the branch (for scripting). -
gt childrento print out the raw children of the branch, line by line (for scripting). -
gt revert(experimental) to create a branch that reverts a commit in your trunk branch.
Other changes
-
Added a new
--statflag togt infothat prints out a diffstat instead of a full diff. Compatible with either--diffor--patch. -
gt create --insertnow asks which siblings should be moved onto the new branch if there are more than one of them. - Performance improvements.
Bug fixes
- Fixed a bug where stray output was printed while completing command names.
- Fixed an issue where a single optional PR template was interpreted as required PR template.
- Fixed a bug where branch prefixes could not end with a slash.
-
Fixed a bug where
split --hunkwould not work for branches that added new files. -
Fixed a bug where the branches created by
splitwere all based on the parent of the split branch instead of being stacked correctly. -
Fixed a bug where the
--patchflag tocreateandmodifydid not include new files.
Notes
-
The
testcommand has been temporarily removed due to persistent bugginess, but will be added back when we have time to dedicate to making it work well. For now, one option is to script using the newgt childrenandgt parentcommands, which should handle most use cases. -
We are still working on further improvements to
syncand would love your feedback in this area! -
We’d also love to hear about how we can make
revertwork best for you! - As of the release of this version, certain parts of the web app and docs may still reference the old command names. We’re updating those places as you read this!
- Added autocomplete support for the renamed commands.
- Fixed a bug in
getwhen the PR does not exist locally. - Fixed a bug where an
git range-difffailure could block submit.
- Introduced an environment variable to preview the command rename and custom aliasing system that will be released next week as Graphite CLI v1. For more details, see https://graphite.dev/graphite-cli-v1-command-names.
- Introduced a new interactive command
gt configwhich covers all user- and repo-level configurations. Thegt userandgt repotop-level commands will be deprecated in an upcoming release. checkoutnow prompts tosyncwhen the branch’s PR has been merged.getno longer fetches branches for merged PRs.- Fixed a bug where having the VSCode extension open while restacking could corrupt cached stack data.
- Fixed a bug where restacks would get stuck in a confusing/corrupt state due to concurrent git processes (i.e. VSCode extesnion).
- Fixed a bug where an
git range-difffailure could block submit.
- Fixed a bug where users with a Yubikey-protected SSH key were unable to
sync. - Fixed a bug where an uncaught IPC exception would appear after running a command.
- The cool part is that turning this configuration on allows you to set custom aliases via the
~/.graphite_aliasesfile, which we know some of you have been asking us about for quite a while!
- Fixed a bug where the wrong version could be shown in
gt log. - Fixed a bug where
getdidn’t work to fetch new branches. - Cleaned up a suggestion to run
submit --force - Removed the interactive portion at the end of
initfor branch tracking (hint abouttrackis still shown). GT_RENAMEflag now displays the correct command names in suggestions.
- You guessed it — more performance improvements!
-
submitcommands now automatically pull in changes from remote and rebase on top of them when your local changes don’t conflict with them. -
downstack getnow shows which version of the PR has been fetched. -
gt lognow shows the last submitted version of each PR, as well as whether you need to `submit` or `get`. -
branch checkoutnow informs you if you need toget. -
Fixed an issue where
branch checkout --patchfailed with an incorrect error message. -
Fixed an issue where
downstack getfailed with an incorrect error message. -
Fixed some issues with inconsistent failures in
get -
Added an experimental
graphite_aliasesfile (see below)
~/.graphite_aliases file, which we know some of you have been asking us about for quite a while!- More performance improvements!
-
Fixed an issue where mangled output was displayed in
gt user editor. -
Fixed an issue where
downstack mergedidn’t exit if the PR was already merging/merged. -
Fixed an issue where
downstack getdid not work.
- More performance improvements!
-
Added a clearer warning about Node.js version compatibility for
npminstalls. -
Fixed an issue where
--forceinsubmitwas not respected. -
Building on a change from 0.22.1,
downstack getnow automatically pulls in changes from GitHub if the local state of the branch matches a submitted version of the branch’s open pull request, **even if rebased**. -
submitnow prompts for adownstack getin cases where there are remote changes that need to be synced.
- Many small performance improvements!
-
Added a
--rerequest-reviewflag tosubmitcommands that rerequests review from anyone who has reviewed the PR. -
submitis now blocked by an ongoing rebase. -
--quietis now respected by underlyinggit commitcalls.
-
Fixed a bug where
prNumberwas incorrectly displayed in thegt logoutput instead of the actual PR number. -
downstack getnow automatically pulls in changes from GitHub if the local state of the branch matches a submitted version of the branch’s open pull request. -
submitcommands now suggest runningdownstack getwhen the above situation is detected. -
YubiKey prompting for SSH is now moved behind a config, in order to address some bugs that passing through the YubiKey prompt introduced. If you are using a YubiKey to authenticate with GitHub, you can enable this config with
gt user yubikey --enable. -
Added a global
--cwdflag to run any Graphite command in a directory other than the one it is initiated from.
-
Added a new
gt downstack mergecommand to merge stacks and PRs directly from the CLI. -
submitcommands now display code updates and metadata updates as two different statuses in the list of updates.
- We had a few versions’ worth of iterating on internal issues and the new release process from our monorepo, thanks for bearing with us!
- We pushed a few patch versions to npm and brew between 0.20.24 and now, but there were no major changes in any of them, so they are not listed in the changelog.
-
gt lognow shows the PR’s overall status (consistent with Graphite app; takes stacks into account). -
Added a new
-mflag tosubmitcommands that enables “merge when ready” on the Graphite app, merging the PR if it is already ready to be merged. -
Added a new option
--exclude-templatestogt user submit-bodywhich specifies that the PR template should not be included in the default PR description when--include-commit-messagesis enabled. - Fixed a few long-standing performance issues that affected all commands, most noticeably shorter-running ones.
- Fixed an issue where the Yubikey prompt shown by git commands was not being diplayed.
- Fixed an issue where the `branch track` command was missing.
- Added the request ID to HTTP error message output for better user issue debugging
- No changes, had to bump a new version to get around accidentally pushing v0.20.19 to
npmas v0.20.20
gt dashcommands now use the app URL from the user’s profile when passing links toopen.
- When editing a PR description, the temporary file is now named
GRAPHITE_PR_DESCRIPTION.md. This allows for Markdown syntax highlighting, and also adding additional editor config by specifically targeting this file name.
-
Fixed a bug where
gt changelogwas broken for the binary version of the CLI (e.g. installed viabrew). -
Fixed a bug where
gt branch editwas accidentally removed from the CLI. Thank you @vampire! -
Added
fishcompletion support viagt fish >> ~/.config/fish/completions/gt.fish! Thank you @szamanr!
- This should fix the npm install issues!
- Fixed a bug where
repo syncattempts to delete branches that were never associated with a PR.
- Add setting trunk to remote version if it cannot be fast-forwarded.
- Add
--alwaysflag to submit to always push updates, even if the branch has not changed.
- Tweaked git passthrough copy to make it clear that a command was run.
-
Fixed a bug where
testcommands didn’t support multiple separators in a branch name. -
Replaced individual
gt ls-remotecalls onsubmitwith a single one, which should speed up submission significantly! - Fixed a bug where PR data was not being synced in the background.
-
gt stack submitnow prompts for submission info inline after each individual branch, instead of after all branches. -
The
--edit/-eflag onsubmitcommands now allows updating the PR title and body. -
The
--reviewers/-rflag onsubmitcommands can now update existing PRs. -
The
--reviewers/-rflag onsubmitcommands now accepts a string of comma separated reviewers (e.g.user1, user2). -
gt commit amendno longer requires staged changes. -
gt commit amendno longer allowed on empty branches. -
gt commit create/amendno longer allowed during a rebase. - Improved suggested messages when encountering errors during a rebase.
- Improved error messaging by showing error code and number when available.
-
Improved error reporting when running
testcommands.
- Changed many error messages to be more actionable, and changed some tips to always-visible messages.
-
Improved accuracy of checking whether a branch is up to date on
submit. -
The
--edit/-eflag onsubmitnow opens an editor for each PR without prompting first. Passing no flag still prompts the user whether they’d like to open an editor, and--no-editstill skips the prompt, -
The
--select/-sflag ofsubmitnow prompts about which branches to include in the submit as the first step so that it can validate that the correct dependencies are included in the submit scope. - Fixed a bug preventing creation of a debug context within a large repository.
-
Fixed a bug logging output for
gt branch teston branches with a slash in the name. - Running git commands no longer opens another terminal on Windows.
- Addressed one remaining gap in pager parity with git: set the environment variables
LESS=FRXandLV=-cif unset.
- Fixed remaining issues with pager by switching from a temp file to a pipe.
-
Fixed a bug where
gt log shortwouldn’t show the filled-in circle for branches needing a restack. -
Fixed a bug where
gt branch splituntracked children of the branch being split if the last branch in the split kept its name.
- Improved error mesaging around failed pager execution.
-
gt log,gt changelog, andgt branch infonow display in a pager. The pager defaults to your git pager, but can be overridden with (for example)gt user pager --set 'less -FRX'. -
Fixed a bug where
--no-editonsubmitwould automatically open new PRs in draft mode (it now prompts unless--draft,--publish, or--no-interactiveis set). - Fixed a bug where killing the CLI during submit could result in being unable to submit again (due to a temporary filename clash).
-
Fixed colors for
gt branch info --patch. - Fixed a bug related to buffer size for certain git commands.
- Fixed the error displayed when attempting to install Graphite on old Node.js versions.
-
submitafter an aborted submit now asks the user whether they’d like to use their cached PR body instead of always using it. -
gt branch splitnow tracks untracked branches automatically before splitting. -
gt branch untracknow untracks the current branch if no branch name is provided. -
Fixed an issue where
gt branch createwould fail instead of creating a branch with no commit in certain cases. -
Fixed
gt branch edit.
-
Fixed
gt changelog. -
Fixed
submit,downstack editfor editor commands containing spaces. -
Fixed
git pusherrors being swallowed on submit.
-
Added
gt changelogandgt docs. You probably want to pipe the changelog to a pager or file :). -
Fixed a bug where a
git rebase --abortafter a restack conflict would result in Graphite being wrong about the current branch. -
Improved
testcommand output. - Internal improvements.
- Minor internal fix.
- Fixed an issue preventing installation.
- Fixed an issue preventing installation.
-
Added a new command
gt branch splitthat allows the user to interactive split a branch into multiple dependent branches. There are two styles of operation:-
--by-commitmode (aliases--commit,-c) prompts the user to select the commits within the branch that they’d like to have branches at. -
--by-hunkmode (aliases--hunk,-h) prompts the user to create a series of single-commit branches from the changes of the branch using thegit add --patchinterface.
-
-
Greatly improved
gt log shortreadability. Give it a try! -
gt branch create,gt commit create, andgt commit amendnow support the-p/--patchoption (likegit commit --patch). Please note that this won’t be the most useful option until autostashing is implemented, planned soon. -
Branch navigation commands now notify the user if the branch being checked out is either
- behind its parent (needs restacking)
- upstack of a branch that is behind its parent
- untracked
-
gt logandgt log shortnow show untracked branches when--show-untracked/-uis passed in. -
gt branch checkoutnow includes untracked branches in the selector when--show-untracked/-uis passed in. -
Added
-nas an alias for--no-editforsubmit. Try outgt ss -npto quickly publish your changes! -
Added
--select/-soption forsubmitto select which branches to push. -
Added
--force/-foptionsubmitto do a force-push, i.e.git push -f, instead of the defaultgit push --force-with-lease. - Added a non-blocking note if the user submits a branch that is not restacked on trunk.
- On trying to submit branches with PRs already closed/merged, instead of failing immediately users will be prompted to choose either to abort or create new PRs.
-
submitnow correctly sets the upstream of the pushed branch. -
You can now configure whether you’d like commit messages in PR bodies by default behind the configuration
gt user submit-body --include-commit-messages. Disabled by default. Usegt user submit-body --no-include-commit-messagesto disable. -
Added
--force/-fforgt downstack getto always overwrite local branches. -
gt downstack trackcan now take a positional branch name argument (likegt branch track). -
Added
--diff/-dforgt branch infoto show the diff of the whole branch (unlike--patch/-pwhich shows the diff of each commit). - Interactive prompts autocomplete is now case-insensitive.
-
gt --helpnow includes a link to the CLI documention. -
Improved
gt repo initcopy. -
Improved error messaging for when an internal
gitcommand fails. -
Improved error messaging for when a
submitcommand fails due to a GitHub API error. -
Improved
testcommand output. -
Improved clarity of positional arguments for all commands with them in
--help - Improved performance of internal cache.
- Improved telemetry.
-
Fixed a bug where
testcommands were completely broken. -
Fixed a bug where
upstack ontoautocomplete did not work ifusoshortcut was used. -
Fixed a bug where
--no-interactiveand--no-editwere not handled properly forsubmit -
Fixed a bug where
gt logwould break on the initial commit of a repository. -
Fixed a bug where trunk would be in the list of branches to track in
gt repo init - Fixed a bug where the error message for old versions of Node.js wouldn’t show up.
- Added cycle detection for parent pointers.
-
Fixed a bug where continue state could be corrupted by running a
gtcommand before runninggt continue. -
Fixed a bug where
upstack ontocould target untracked branches, resulting in corrupted state. - Fixed a bug where renaming a branch to its current name resulted in corrupted state.
-
Added
dstras an alias fordownstack track. - Slightly improved rebase conflict printout.
-
Added a new command
gt downstack trackthat, from an untracked branch, allows you to track recursively by choosing the parent until you reach a tracked branch. Use--force/-fto automatically select the nearest ancestor of each branch, which should give behavior similar togt stack fix --regenof old. -
Added a new command
gt branch foldthat folds the changes of the current branch into the parent branch. Uses the parent branch’s name for the new branch with default; pass in--keep/-kto use the current branch’s name instead. -
Added a new command
gt branch squashthat turns a branch of multiple commits into a single-commit branch. Takes--message/-mand--no-edit/-narguments just likegt commit amend, and defaults to using the message of the first commit on the branch. -
Fixed a bug where if neither
--draftnor--submitwas passed, updated PRs would always be published if previously drafts, and new PRs would be published instead of being created as draft. -
Fixed a bug where
gt branch track --forcewouldn’t always select the nearest ancestor. -
Fixed a bug where
gtwith no command would throw an uncaught exception instead of displaying the help message. - Fixed a bug where cancelling certain interactive prompts would result in undefined behavior.
-
Based on a user survey, we’ve slightly changed the defaults for PR title and description on
submitcommands.- PR Title defaults to the title of the first (or only) commit on the branch.
- PR Description defaults to a list of commit messages followed by a PR template, if one exists.
-
branch infoandlognow show the commit hash of trunk. -
Added a
repo init --resetwhich clears all Graphite metadata. -
Added a new user-scoped configuration enabled by
gt user restack-date --use-author-datewhich when enabled passes--committer-date-is-author-dateto the internalgit rebaseof restack operations. To return to the default, usegt user restack-date --no-use-author-date. -
Added autocompletion for the
branch updisambiguation prompt. -
Added
gt dpras a shortcut forgt dash pr -
Renamed the
--no-draftoption for `submit` commands to--publish/-p. There are three modes of operation for the command:- By default, leave existing PRs in the same state and create new PRs in draft mode.
-
When
--draft/-dis passed, all PRs in the submit scope will be marked as draft. -
When
--publish/-pis passed, all PRs in the submit scope will be marked ready for review.
-
Added an interactive prompt for
gt branch renamewhen no new name is passed in. -
Added a
--force/-foption forgt branch trackthat skips the interactive prompt by picking the nearest tracked ancestor. -
Fixed a bug where
branch submitanddownstack submitbase validation would fail incorrectly on certain operating systems. - Fixed a bug where leftover cached metadata across CLI versions could result in inconsistent state.
-
Changed the flow of
gt branch track. Now, it tracks the current branch by default, unless another branch is specified. By default, prompts the user to select a branch to be its parent if there are multiple possibilities, or you can pass in a--parent. -
Updated the new
log shortview to be more comprehensible (uses diagram symbols fromlog). -
Fixed a bug where
--restackwouldn’t restack all branches as expected ifgt repo syncwas run from trunk. -
Fixed a bug where
gt sswould fail if run from trunk. -
Fixed a bug where
gt downstack getwould fail to get branches that existed locally but were untracked bygt. -
Fixed a bug where after a
git rebase, Graphite metadata could end up in a broken state. -
Fixed a bug that prevented
gt feedback --with-debug-contextfrom working as expected. -
Fixed a bug where
gt upstack ontointeractive selection could appear wonky. - Fixed some copy in v0.19 newly added features.
-
Fixed an issue where
downstack getwas completely broken. -
Replaced the emoji for
Pushing to remote and creating/updating PRs...step ofsubmit -
Fixed an issue where
gt branch editwould only work if the branch was not in need of restacking. -
Added support to rebase local changes on top of remote for
downstack get -
Fixed a bug where choosing to cancel
submitbecause of an empty branch did not abort correctly.
- Removed some development tooling as a workaround to unblock Homebrew release. Sorry for the delay!
- Fixed a shebang issue that resulted from trying to clean up Node.js v18 warnings. Added a different fix to prevent Node.js warnings from showing up in CLI output.
- Fixed a bug with Node.js v14 support.
- Changed the Homebrew Node.js dependency to v16, which is the same as we use for development.
-
Ensured every commonly used command has an alias and changed a few names. A current list of commands will be included in the Community Slack with this release.
-
gt branch showis nowgt branch info. As this command is relatively new, we are not leavingshowas an alias. -
gt branch create --restackis nowgt branch create --insert. This was the originally intended name, and it does something different thangt repo sync --restack -
gt downstack syncis nowgt downstack get. It was confusing to have twosynccommands do entirely different things! -
The old names
gt branch prevandgt branch nextfordownandupare now fully deprecated.
-
- Updated a significant portion of the info and error messages spanning almost every command.
-
Ensured every command has up-to-date and helpful
--help. - Added a number of tips to various commands.
- Greatly improved autcompletion —now every command has autocomplete for nouns, verbs, flags, and branch names when applicable.
-
gt branch checkout,gt upstack onto, andgt branch tracknow all have substring autocompletion for interactive branch selection. Enjoy! :D -
gt authandgt usercommands can now be run outside of a Git repository. -
Removed the concept of “ignored branches” from
gt repo init, and the user config.Removed thegt repo ignored-branchescommand. -
Removed
gt <scope> fix.fixis now an alias forrestack. -
Removed
gt <scope> validate -
Removed
gt branch parent,gt branch children, andgt branch pr-info. All of this information is now found ingt branch info.gt branch renameis now the only way to reset PR info for a branch, as PR info is now synced by branch name for the open PR with that name. -
Removed
gt repo fix. -
Removed
gt repo trunk. You can change the trunk branch by runninggt repo init --trunk <trunkName>. -
Removed
execfunctionality ofgt downstack edit—we recommend usinggt stack testfor running a command on each branch in your stack. -
Added a new command
gt branch track. In order to track an existing git branch<branchName>, ensure that it is based on a Graphite branch<parentBranchName>, and then with<parentBranchName>checked out, rungt branch track <branchName>to start tracking it as a Graphite branch.-
You can also specify a
--parentingt branch trackinstead of checking out the desired parent before running the command. -
If run without a branch to track
gt branch tracksuggests branches that have the current branch/specified parent in their history.
-
You can also specify a
-
Added
gt branch untrackto remove Graphite metadata for a branch. -
Added a new flow to
gt repo initfor letting users new to Graphite convert an existing “stack” of branches into a Graphite stack. Essentially callsgt branch trackin a loop. -
Added a new verb
gt <scope> restackfor thebranch,upstack,downstack, andstacknouns. For each branch in the scope, this command checks if the branch is based on its parent, and rebases it if necessary.gt upstack fixandgt stack fixwill alias torestackfor a couple versions. -
Improved
gt log short- the view now essentially a single-line-per-branch version ofgt log. The old style can still be accessed withgt log short --classic.
--reverse option to gt log and gt log short/. Helpful for big stacks!-
Added
--stackoption forgt logandgt log short. Only displays the current stack (i.e. what `gt stack submit` would submit). -
Added
--steps <n>option forgt logandgt log short. Implies--stackand only shows `n` levels above and below the current branch. -
Rebase conflict message now shows a
gt log short --steps 3centered at the branch being resolved. -
Interactive selection for
gt branch checkoutandgt upstack ontonow uses the newgt log shortview. Much easier to see what you’re doing with long branch names! -
gt dashcan now open the PR page for the current branch or a specified one:gt dash pr [numberOrBranchName] -
gt branch infocan now show the current PR description with--description. -
Added
upstackanddownstackcounterparts ofgt branch test. -
gt branch deletenow restacks the deleted branch’s children onto its parent. -
Removed the
--resubmitflow fromrepo sync—we may add it back in the future. -
Added a
--restackoption torepo sync, which restacks the current branch and any branches in stacks with cleaned up branches. We imagine a common flow if you know that you don’t have conflicts with trunk will begt rs -rf. Or evengt rs -rf && gt ss. -
Fixed a bug where
--draftand--no-draftonsubmitcommands would unnecessarily submit unchanged PRs. - Fixed bugs related to rebases not being performed properly that often resulted in confusing state and messaging.
- Now fails gracefully if running on an unsupported Node.js version (requires Node.js version 14 or higher)
- The Graphite CLI experience survey is no longer shown when commands are run in non-interactive mode.
gt downstack get has been outscoped for this release in order to get it to you sooner! We’re still excited to put it out soon.-
Fixed a pervasive bug that prevented using
gton Windows at all — there are likely still remaining issues to work out before we have full support, and we still recommend using WSL for the most stable Graphite experience. Thanks to our community for helping out here! -
Fixed a bug where
git pusherror messages would not be displayed onsubmit, resulting in confusion around whether pushes were failing because of e.g.pre-pushhooks or--force-with-leaseerrors. -
Added better support for multiple checkouts (i.e.
git worktre`). We consider our support experimental, see the new section of the docs for details.
-
Fixed a bug where running
gt branch renameon submitted branches would result ingtbecoming largely unusable. -
Added a new
--force/-foption togt branch renamethat is required for already-submitted branches. -
gt branch renamenow respects character replacement settings.
-
.and/are no longer replaced in branch names. -
Fixed a regression where the current branch wouldn’t be selected by default in
gt branch checkoutinteractive mode. -
Upgraded
nodeandyarndependencies, please let us know if you see any weirdness!
gt downstack syncno longer requires turning on a configuration option to use (for real this time)
-
Rewritten
gt downstack syncusing a different mechanism for fetching remote stack dependencies. -
gt downstack syncno longer requires turning on a configuration option to use. -
Fixed an issue in
submitwhere in-progress PR title wouldn’t be saved if the user cancelled while writing the body.
-
Fixed certain cases of an issue where restacking after
stack editandcommit createwould use an incorrect upstream. A broader fix is coming in v0.19.0. -
Fixed an issue where after certain
downstack editorupstack ontoflows, branches would be pushed to GitHub in an order that caused them to be closed prematurely. -
Added
gt branch-prefix --resetto turn off the user prefix for automatically generated branch names. -
Cleaned up copy in
submitcommands.
-
gt repo syncandgt repo fixnow prompt to delete closed branches in addition to merged ones. -
Added more customization for auto-generated branch name prefixes. Check out
gt user branch-dateandgt user branch-replacement. - Config files are now written with 600 permissions instead of 644.
-
Fixed an issue where
downstack syncwould overwrite the local copy of a branch even if the user chose not to. - Fixed an issue where a misconfigured trunk wouldn’t be brought to the user’s attention.
- Fixed an issue where Graphite would fail to parse repository owner/name.
-
Removed deprecation warning for
gt stacks- it’s been long enough. -
Cleaned up interactive mode copy for
submit.
New functionality
-
Added an experimental command
gt downstack syncto pull down the remote copy of a branch and its downstack dependencies from remote. This feature is gated behind a configuration by default, and we are still working on the documentation. If you would like to try it out and help us iterate on the feature, please join the #experimental channel in the Graphite community Slack server! -
Added additional functionality to
submitto support the experimental collaboration features. Gated by default. -
Added additional functionality to
gt repo syncto support the experimental collaboration features. Gated by default.
New commands
-
Added a new command
gt branch editthat runs a nativegit rebase --interactiveover the commits on the current branch. This command is intended for advanced Git users who want to make use of the commit structure within a branch while working with Graphite. -
Added a new command
gt branch showthat runs a nativegit logover the commits on the current branch. Includes a--patch/-poption to view the diffs.
New ways to use existing commands
-
Added an
--insertoption togt branch createwhich restacks all children of the parent of the new branch onto the new branch itself. -
Added interactive branch selection for
gt upstack onto(similar togt branch checkout). No longer requires a positional argument. -
gt repo syncnow handles--no-interactivecorrectly. -
gt commit amend --no-editnow fails and warns the user when there are no staged changes, just likegt commmit create. -
--no-editis now aliased to-nforgt continueandgt commit amend. -
gt continuenow supports--all/-ato stage all changes. -
submit --no-interactiveno longer un-publishes submitted PRs (unless--draftis specified). -
gt downstack editnow supports anexec/xoption to execute arbitrary shell commands in between branch restacks (based ongit rebase --interactive). -
gt branch deletenow supports deleting the current branch. It checks out the parent (or trunk if Graphite cannot find a parent).
Fixes
-
Fixed a bug where
submit --no-interactivecould prompt the user for reviewers. -
Fixed a bug where
gt repo ownerwould set the remote as well, breakingsyncand resulting in having to manually edit the configuration file to get Graphite working again. -
Fixed a bug where
submitwould fail for certain classes of branch name. -
Fixed a bug where comments in the
gt downstack editfile were not respected. -
Fixed a bug where
pas an alias forpickingt downstack editdid not work properly. -
Fixed a bug where
fixcould swallow a rebase exception and leave the repository in a bad state. -
Fixed a bug where
gt branch checkoutinteractive selection would fail if executed from an untracked branch. -
Fixed a bug where
gt branch deletecould fail to delete the branch but leave it in a corrupt state.
Improvements
-
Improved the speed of
gt downstack editandgt upstack ontoby being smarter about when a rebase is actually necessary. - Improved the speed of stack validation for some commands.
Under the hood
- Added infra to backfill the SHA of branch parent in metadata globally wherever it is safe to do so to prepare for an upcoming update to the stack validation algorithm that we expect to improve performance and reduce hangs.
- Added plenty of tests and refactored code core to many commands for stability and future extensibility.
- Fix an issue introduced in the previous version where the async calls to fill in PR info on
submitwould not be awaited serially, resulting in a poor user experience.
-
synccommands no longer allow pushing to branches associated with closed/merged PRs. -
Rename
gt branch synctogt branch pr-infoas its behavior is not aligned with the other `sync` commands. -
Fix some output formatting for
syncandsubmitcommands. -
Fix an issue where pr data could be overwritten on
submit. - Decreased max branch name length slightly to support an upcoming feature.
- Start tracking SHA of branch parent in metadata, a requirement for some upcoming features.
- This version includes some initial changes to sync branch metadata with remote, gated by a hidden flag.
-
Flipped
gt log shortview to match other log commands andup/downnaming convention.↳→↱! - Graphite now asks for confirmation if the user tries to submit an empty branch.
- Graphite now displays an info message when it creates an empty commit on a new branch.
- The empty commit copy in the commit editor now only appears when Graphite has created an empty commit.
-
Added support for remotes not named
origin- use the newgt repo remotecommand to set the name of your remote. -
Added support for branch names up to GitHub’s max supported length (256 bytes including
/refs/headsgives us room for 245 bytes). - Allowlisted many git commands for passthrough.
-
Added autocomplete support for
gt branch delete. -
Changed force option on
gt branch deletefrom-Dto-f. -
Cleaned up output on
gt branch deletefailure. - Fixed an issue where a branch could not be submitted if its name matched a file in the repository.
-
Fixed an issue where
gt repo max-branch-lengthwouldn’t print the configured value. -
Added more debug information for the
--debugoption.
- Happy Friday! This should fix many hangs that users are experiencing.
-
Graphite no longer cleans up local branches that share a name with merged branches on remote unless they have been associated with the merged PR (via a
submitcommand). - Fix bug where PR info wasn’t being synced periodically.
-
Added a new command
upstack fix, similar tostack fixthat only runs upstack of the current branch. -
commit createandcommit amendnow internally run anupstack fixinstead of astack fix` -
Fix a hang related to
git config diff.externalbeing set. -
Fix autocompletions for
gt branch checkout.
- Support handling corrupted
.graphite_merge_conflictfiles.
-
Add deprecation warnings for
gt branch nextandgt branch previn favor ofgt branch upandgt branch down, respectively. -
Add
gt buandgt bdshortcuts forgt branch upandgt branch down, respectively. -
Change
gt branch deleteshortcut togt bdl. -
Support passing through
gt stashasgit stash. -
Fix bug where
fishusers couldn’t add backticks to commit message using the-moption. - Silence retype errors.
- Minor copy updates.
- Refactored config loading to reduce race conditions.
- Add quotes around commit message in ammend command.
- Minor copy updates.
- Fix bug regarding repository config file reading from repository subdirs.
-
Support numbers when generating a branch name from a commit message through
gt bc -m <message> -
Prompt for a commit message when autogenerating an empty commit when running
branch createwith no staged changes.
- Support creating new branches with no staged changes, by automatically creating an empty commit.
-
Enable changing existing PRs’ draft status using the
--draftflag on submit. -
Add a new command,
gt downstack editwhich enables interactive reordering of stack branches. -
Update implementation of
gt stack submitto avoid GitHub rate limitted when submitting large stacks.
- Enable manually setting reviewers on submit with the
-rflag.
- Allow Graphite to run when there are untracked files.
- Fix issue with detecting downstack/upstack branches on submit
- Fix issue with detecting some PR templates
-
Wildcard matching for ignored branches (
gt repo ignored-branches --set) now accepts glob-patterns -
Option to remove a branch from ignored list (
gt repo ignored-branches --unset) - Submit now supports —update-only option which will only update-existing PRs and not create new ones.
- Bugfix: Submit to honor the —no-verify flag
- Better logging and documentation to clarify behavior
-
Support up and down aliases for
gt branchnext/prev respectively. -
Fix issue where
gt tipscould not be disabled. - Inherit shell editor preference for user from env ($GIT_EDITOR/$EDITOR) and prompt user to set shell editor preference on submit if env not set.
-
Allow user to change editor preference using
gt user editor
- Support for
gt continueto continue the previous Graphite command when interrupted by a rebase.
-
Fix issue with
gt repo syncdeleting metadata for existing branches. -
Reduce merge conflicts caused by
gt commit amend.
- Support for branch autocomplete functionality on gt branch-related commands. Enable this functionality by running `gt completion` and adding the ouputted bash script to your relevant bash profile (e.g. ~/.bashrc, ~/.zshrc).
- Added functionality to query users for feedback on the Graphite CLI.
- Refactor the suite of gt submit commands to make them more easily cancellable; re-ordered submit to edit all PRs locally before doing any writes and cancelling mid-submit will save any previously entered data (e.g. title and body).
-
Submit also now includes a
--dry-runflag to show the user what will be submitted in the invocation. - Submit queries GitHub for PRs before submitting, resolving an issue where submit would sometimes try to create a new PR though one already existed for that head branch/base branch combo on GitHub (Graphite just didn’t know about it).
- Fix
gt commit create -mmulti-word commit messages.
-
Support for
gt stack topandgt stack bottom. -
Adjusted logic for cleaning metadata in
gt repo sync.
- Improve performance of stack logic on repos with a high number of local branches.
-
Allow
gt commit createto be used without-m, launching the system editor. - Infer the body of a PR from the commit message body (if it exists).
-
Add
gt repo trunk --set.
-
Improved
gt repo syncperformance when repos have a high number of stale branches.gt repo syncnow deletes branches more eagerly and has an optional flag to show progress (--show-delete-progress). -
New command
gt repo fixsearches for common problems that cause degraded Graphite performance and suggests common remediations.
-
Tacit support for merge-based workflows; merges no longer cause exponential branching in
gt logand hanggt upstack onto. -
Fixes to recreation of debug state in
gt feedback debug-context --recreate.
-
Assorted improvements to the
gt repo syncmerged branch deletion logic and options to fix dangling branches. -
gt branch parent --resetresets Graphite’s recorded parent for a branch (to undefined). -
gt branch sync --resetresets Graphite’s recorded PR info a branch (to undefined).
-
gt debug-contextcaptures debug metadata from your repository and can send that to Screenplay to help troubleshoot issues. -
gt repo syncnow pulls in PR information for all local branches from GitHub to link any PRs Graphite doesn’t know about/better remove already-merged branches. -
Re-enable metadata deletion from
repo sync. -
Re-enable pull request base pushing from
repo sync. -
gt branch create -mnow has-aflag to include staged changes in the commit.
-
Disable metadata deletion from
repo sync -
Disable pull request base pushing from
repo sync
-
stack submitnow checks if update is needed for each branch. -
Support
upstack submitandbranch submit -
Fixed bug which was preventing
upstackfrom having the aliasus -
Added a command
branch renameto rename branches and correctly update metadata. - Better support cancelling out of prompts.
-
Rename
stack cleantorepo syncand update to be able to be run from any branch. -
Update
repo syncto delete old branch metadata refs. -
Update
repo syncto update PR merge bases if necessary. - Support passing through commands to git which aren’t supported by Graphite.
-
Add experimental command
stack test. - Fix bug causing branches to show up twice in log commands.
-
Show PR and commit info in
logcommand - Add tip advising against creating branches without commits.
- Fix outdated copy reference to gp.
- Print error stack trace when —debug flag is used.
-
Flag midstack untracked branches in
gt lsoutput. -
Improve submit to correctly support
gt stack submitandgt downstack submit - Reduce unnecessary git ref calls to improve performance in large repos.
- Support graceful handling of sigint.
- Fix bug in
gt lsstack traversal.
- Fix bug resulting in always showing tips for
gt ls.
- Disallow branching off an ignored branch.
- Disallow sibling branches on top of trunk branch.
- Establish pattern of toggleable CLI tips.
-
Rewrite
gt lsto improve speed and output formatting. - Optimize git ref traversal and memoization.
-
Support PR templates in
stack submitcommand. -
Update
stack submitto support interactive title and description setting. -
Update
stack submitto support creating draft PRs. - Allow max branch length to be configured (from the default of 50).
- Fix a crash in logging that happened in a edge case involving trailing trunk branches.
-
Hide remote branches in
log longoutput.
- Fix case where commands fail if a branch’s stack parent had been deleted.
-
Fix copy across CLI to use
gtrather than the oldgp. -
Add more shortcut aliases for commands such as
sforsubmit -
Fix copy around
repo-configtorepo -
Add command
branch checkout - Refactor `stacks` command into `log short`
-
Update
logcommand to supportlog,log shortandlog long - Support dropping the space on double-alias shortcuts. Eg `branch next` = `b n` = `bn`, `stack submit` = `ss` etc
- Throw actionable errors if two branches point at the same commit.
-
Add top level
graphitealias such that the CLI can be called using both `gt` and `graphite`.
- Fix
gpalias deprecation warning for homebrew installations.
- Rename graphite CLI alias to
gtfromgpper feedback.
-
Improved performance of
gp stackscommand, particularly in repositories with a large number of stale branches. -
Changed search-space limiting settings to live at the top level and apply to both stacks and log. (
gp repo max-stacks-behind-trunk,gp repo max-days-behind-trunk).
-
Improved performance of
gp logcommand, particularly in repositories with a large number of stale branches. -
Users can now set the maximum number of stacks to show behind trunk in
gp log(gp repo log max-stacks-behind-trunk) as well as the maximum age of stacks to show (gp repo log max-days-behind-trunk). -
gp logalso now has--on-trunkand--behind-trunkoptions. - Improved CLI documentation and copy.
- Autogenerated branch name date format change.
-
stack fix command now has
stack falias. -
branch create command now has
branch calias. -
branch create command now has
branch calias. -
stack regenis deprecated, and is now a flag forstack fix --regen. -
stack fixnow shows an interactive prompt by default.
- Dont zero count months when generating branch names.
- Improve help text for amend.
- Improve help auth print out.
-
Refactor
gp logcommand, while supporting old behavior withgp log --commits/-c - Check for updates in orphaned child process, making all commands faster.
- More helpful validation error messaging.
-
gp branch next/prevnow support interactive choices and stepping multiple branches. -
gp branch create [-m]now doesn’t commit by default. It can also autogenerate branch names from commit messages. -
Added
gp commit create -mfor creating commits and fixing upstack. -
Added
gp commit amend -mfor amending commits and fixing upstack. -
Added
gp user branch-prefix [--set]reading and setting your branch prefix. -
Added
gp branch parent [--set]plumbing command for reading and setting a branch parent. -
Added
gp branch childrenplumbing command for reading the children of a branch.
- Better telemetry for measuring cli performance.
-
gp lalias for log command.
stack fixnow works for a individual stack. (Upstack inclusive for now)
- Fix homebrew release to not include a dev dependency on
chai.
-
Support
--no-verifyflag when runningbranch createto skip precommit hooks. - Validation passes when a branch points to the same commit as trunk HEAD.
-
Add
repo initcommand. -
Self heal
.graphite_repo_configfile. - Always track trunk branch and ignored branches.
-
Update
stack regento always set stack foundations to trunk. -
Update
stack regensuch that, when from from trunk, regenerates all stacks. -
branch next/prevnow traverses based on Graphite’s stack metadata. -
Refactor
gp stacksprint output.
-
Update
stack regento operate across entire stack rather than just upstack. -
stack submitinfers PR title from single-commit branches. -
Using trunk branch inference, ignore trunk parents such as trailing
prodbranches.
-
Begin infering trunk branch from
.gitconfig. - Ignore trunk parent branches during validation and other operations.
- `upstack onto` can now move branches with no parent branches.
-
validatenow passes cases where branches point to the same commit. -
stack fixnow prints better messaging during rebase conflicts. -
Removed unused args from
stack submitandstack fix. - Updated copy
- Dont automatically create repository config file.
- Improved
stack submitcommand and promoted command out of expermental status.
- Update all copy to match new termonology from the 4.0.0 refactor.
- Update
branch createcommand to accept optional positional argument for branch name.
- Fix demo command and downstack string.
- Refactor all command names into a noun-verb subcommand pattern.
-
Introduce concept of
upstackanddownstack. - Simplify documentation.
- Minor bugfixes.
- Fix bug in checking for uncommitted changes.
- Self heal if branch metadata parent somehow becomes self.
- Diff rolls back changes if commit hook fails.
-
Fix bug in metadata stack traversal used by
fixcommand. - Restack fails fast if there are uncommitted changes.
- Slim down size of homebrew artifact.
- Diff now only commits staged changes.
- Support resolving merge conflicts during a recursive restack.
-
Update
synccommand to be visable in--help.
-
Update unlisted
gp synccommand to support trunk argument. -
Update unlisted
gp synccommand to prompt before deleting branches.