The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.3.1 - 2023-12-01
Version 1.3.1 includes a small change to requestpull
and performance improvements.
requestpull
now uses a Markdown-compatible comment syntax for its editor template. This means that headings can be included without strange spacing and that editor previews work out-of-the-box.
branch
,clone
,identify
,pull
, andpush
now handle repositories with >100K refs.
1.3.0 - 2022-03-03
Version 1.3 improves the behavior of the pull
command
on repositories with lots of branches.
pull
now accepts a--pattern
flag.
- If multiple
--pattern
flags are given tobranch
, the union of the patterns will be used instead of just the last one.
pull
no longer will attempt to delete a currently checked-out branch.pull
will no longer stop on the first failing branch mutation after a successful fetch.
1.2.1 - 2022-02-26
1.2.1 contains a packaging/testing bugfix, but is otherwise identical to 1.2.0.
- The test suite now propagates
PATH
to the editor and gg. This fixes the check phase in Nix packaging.
1.2.0 - 2022-02-24
Version 1.2 includes features to handle repositories with lots of branches.
- gg can now be installed via Nix! See https://gg-scm.io/install for instructions.
push
andcommit
have a new-hooks=0
flag. (#153)pull
has a new--force-tags
flag. (#155)branch
has a new--pattern
flag to filter listed branches. (#156)
- Local branches are moved under
refs/gg-old/
duringpull
when they are deleted from a remote. (#118)
GIT_EDITOR
is now always invoked from the root of the working copy to match with the behavior of Git. (#152)revert
now prints an error message if used on a nonexistent file in a new repository.
1.1.0 - 2020-12-13
Version 1.1 is the second stable release of gg and includes new commands,
improved gg branch
output, simpler GitHub integration, and a Homebrew formula.
- New
addremove
command that adds new files and removes missing ones. (#95) - gg has a new command,
github-login
, which obtains a GitHub authorization token using a CLI-based OAuth flow. (#122) branch
has a new--sort
flag to control the sort order.- gg can now be installed via Homebrew! See https://gg-scm.io/install for instructions.
branch
shows the commit hash, author, and summary for each branch.branch
now sorts by descending commit date by default. (#101)
status
andbranch
now display color on Windows. (#125)- Released binaries are smaller: they no longer contain debug information. (#121)
commit --amend
no longer exits with an error if the commit contains a rename. (#129)rebase
displays a simpler error message if the-dst
argument doesn't exist. (#127)
- gg now has pre-built Windows binaries! (#48)
- The documentation has been moved to a new repository. (#119)
1.0.2 - 2020-09-01
1.0.2 is an organizational release: gg moved to a new GitHub organization, released its internals as a standalone Go library, and released Debian/Ubuntu packages!
- gg now has an APT repository with Debian packages! (#49) See https://gg-scm.io/ for installation instructions. Special thanks to my sponsors for covering hosting costs!
gg-scm.io/pkg/internal/git
is now available asgg-scm.io/pkg/git
. To support this change, the main repository's import path has changed fromgg-scm.io/pkg
togg-scm.io/tool
.- gg has moved to a new organization on GitHub: https://github.com/gg-scm.
Most URLs will redirect automatically, but please update any remotes or links
pointing to
zombiezen/gg
. - CHANGELOG.md now uses the Keep a Changelog format.
1.0.1 - 2020-06-22
1.0.1 is a small bugfix release to 1.0.0.
gg push --new-branch
fails if not given a-r
flag.
1.0.0 - 2020-06-21
1.0 is the first stable release of gg, developed over years of daily use in a variety of workflows. With tab completion and command semantics much closer to Mercurial, the UX of gg has never been better.
gg 1.0 supports Git 2.20.1 and above.
gg pull
now pulls all branches and fast-forwards local ones if possible. When pulling from an unnamed remote repository,gg pull
will place the branches into arefs/ggpull/...
namespace. (#108)gg push
now pushes all branches unless limited with the-r
flag. (#100)- Tab completion for bash and zsh. (#18)
gg requestpull
accepts a new-draft
flag. (#104)gg requestpull
will copy the repository's pull request template into the opened editor. (#110)
- The branch name created by
gg init
is nowmain
. (#115) gg log
now logs all revisions by default. Usegg log -r @
to get the old behavior. (#86)gg log
now always usesgit log --date-order
under the hood. As always, if you prefer tighter control over the log, usegit log
directly.gg branch --delete
is now implemented in terms ofgit update-ref
instead ofgit branch --delete
.- The
gg push --create
flag is nowgg push --new-branch
to match Mercurial. - gg tests are now run by GitHub Actions instead of Travis. Shout out to Nat Friedman for the invite!
- When
gg requestpull
opens an editor, the file will have a.md
extension. (#113) gg histedit
will now set the--autosquash
option when runninggit rebase
. (#114)
gg update
no longer errors if local branch is ahead of remote branch. (#103)gg rebase --continue
no longer adds untracked files (#107)gg gerrithook
will now work properly when in run in a subdirectory of the Git repository. (#105)gg commit -amend
now works on the repository's first commit. (#106)gg revert
will show an error message if it is given a file that doesn't exist. (#58)gg branch
will no longer fail on an empty repository.
0.7.1 - 2019-02-13
The release scripts for 0.7.0 failed, so 0.7.1 is the first actual release of 0.7.
0.7.0 - 2019-02-13
0.7 is a huge technical milestone for gg: most interactions with Git are now going through a comprehensively tested Go library instead of constructing command-line arguments ad-hoc. This means more input validation and less surface area for bugs.
gg 0.7 drops support for Git 2.7.4: 2.11.0 is now the earliest supported version of Git.
- New command:
identify
to get the current commit hash. (#94) commit
uses a Mercurial-like commit message template when the editor is invoked.pull
now pulls all refs from the remote instead of just one. (#87)- The
update
command has been overhauled to be even closer to Mercurial semantics.update
now uses "merge" behavior all the time (#93) and will fast-forward before switching the working copy to a new branch. update
now has a--clean
flag (#92)mail
now accepts comma-separated reviewers in-R
flag. (#83)gerrithook
now caches the hook script it downloads. (#61)
- As mentioned in the introduction, most interactions with the Git subprocess go through a high-level API now to reduce escaping issues. This should make gg more architecturally robust.
- Previous versions of gg would never send
SIGTERM
correctly to its Git subprocess on receiving an interrupt, instead just waiting for the command to finish. This has been fixed. backout
now correctly attaches stdin to the editor. (#85)push
now correctly consults the fetch URL when evaluating whether a push would result in a creation. (#75)- gg now escapes pathspec characters on an as-needed basis, which should reduce most of the confusing error messages bubbled up from Git. (#57)
update
now uses more Mercurial-like logic for updating branches, correcting surprising behavior when pulling from fork branches. (#80)update
now correctly merges the local state when given a branch name instead of exiting. (#76)commit
no longer tries to commit untracked files when given a directory argument. (#74)gerrithook
now respects thecore.hooksPath
configuration setting. (#89)
One of the known issues in 0.6 is still present in 0.7:
revert
does not produce errors if you pass it unknown files. (#58). This may be confusing, but does not negatively affect your data.
0.6.1 - 2018-08-22
gg --version
no longer crashes (#71)gg clone
does not try to clone to/
(#70)gg status
no longer crashes when encountering a renamed file on Git 2.11. (#60)
- New website with docs! Take a look at gg-scm.io. The site includes workflow guides and the command reference. (#23, #40)
- The new
requestpull
command creates GitHub pull requests from the command line. (#52) revert
now creates backup files when reverting modified files. See therevert
docs for more details. (#39)- The new
backout
command creates commits that "undo" the effect of previous commits. (#46) - The new
cat
command allows viewing files from old commits. (#45) - Ignored files can be tracked by naming them explicitly using
add
. (#51)
status
no longer crashes on newer versions of Git that detect renames in the working copy. (#44)revert
now correctly operates on added files (#54, #55)add
is now more robust when passed a directory. (#35)- Git subprocesses are now sent
SIGTERM
if gg is sent any interrupt or termination signals. (#64)
There are a few known issues in 0.6:
revert
does not produce errors if you pass it unknown files. (#58). This may be confusing, but does not negatively affect your data.- Git 2.11 (the default version used on Debian) emits malformed output on working copy renames which causes gg to crash. (#60) The workaround here is to install a newer version of Git.
0.5.1 - 2018-05-31
- Running
commit
with no arguments no longer emits a misleading "fatal" error message. (#43)
0.5.0 - 2018-05-30
diff
now has more flags for controlling comparisons:-U
,--ignore-space-change
,--ignore-blank-lines
,--ignore-all-space
,--ignore-space-at-eol
,-M
,-C
, and--copies-unmodified
. Seegg help diff
for more details. (#26)log
now has more flags for controlling output:--reverse
,--stat
, and--follow-first
. (#22 and #41)push
andmail
now infer the destination ref for commits that are only present in one branch. For example, a command likegg push -r main~
will push tomain
on the destination. (#31)rebase --continue
andhistedit --continue
will now automatically amend the current commit if changes were made. (#21)rm
has a-r
flag (#24)
- Fix crash when running
diff
before first commit (#30) - When
push
checks whether a ref exists for-create
, it will use the push URL instead of the fetch URL. (#28) - Running
add
on the working directory root now works. (#29) rebase
andhistedit
no longer use--fork-point
, since it can cause unexpected, hard-to-debug results.commit
now works properly when finishing a merge. (#38)merge
no longer creates a commit. (#42)
0.4.2 - 2018-05-02
histedit
now works when passing a non-ref argument. (#25)rebase -src
now behaves as documented when given a revision that is unrelated to HEAD. (#27)
0.4.1 - 2018-04-18
- Instead of rebasing onto the upstream,
histedit
will keep the current branch at its fork point. This was always the intended behavior, but I didn't have a test, so I forgot to implement it. (#20)
0.4.0 - 2018-04-18
- Add
upstream
command for querying and setting upstream branches. (#15) add
can now be used to mark unmerged files as resolved. (#12)- gg commands that read configuration settings from git now do so in a single batch instead of invoking Git multiple times. This potentially improves performance of certain commands like status.
histedit
now has an-exec
flag, mirroringgit rebase --exec
.mail
now has flags to control sending of notifications.pull
now fetches all tags from a remote by default. Use-tags=0
to disable this behavior. (#17)
0.3.0 - 2018-04-06
- Add
evolve
command for syncing Gerrit changes. (#14) - Add
gerrithook
command for installing or removing the Gerrit Change ID hook. (#13)
rebase -dst
now always defaults to the upstream branch, whereas sometimes it would take from the source flags.
0.2.1 - 2018-04-03
histedit
flags no longer give incorrect usage errors. (#11)
0.2.0 - 2018-04-03
push
has a new-f
flag that usesgit push --force-with-lease
. (#9)mail
now warns if there are uncommitted changes. (#8)status
will use colorized output when appropriate. It can be controlled using thecolor.ggstatus
configuration setting. (#1)- Added the
rebase
andhistedit
commands. (#5) - Added the
merge
command. (#6)
commit -amend
with no changes now opens the editor instead of failing. (#7)- Running
commit
in a subdirectory of the working copy will no longer fail when committing a removed file. (#10)
0.1.3 - 2018-03-23
First public binary release.