-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add 'Quick start interactive rebase' action #3213
Conversation
5d0c2d8
to
323607a
Compare
Coverage summary from CodacySee diff coverage on Codacy
Coverage variation details
Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: Diff coverage details
Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: See your quality gate settings Change summary preferencesYou may notice some variations in coverage metrics with the latest Coverage engine update. For more details, visit the documentation |
Hard to say if this should be deemed a feature or an enhancement, but it's certainly something that I as a user would like to know about so I'm labelling it a feature |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is really nice, I can see myself using this often. A few comments inline below.
More thoughts about the issues that this addresses:
- for moving commits down, I often press 'e' right before the destination that I want to move to; I can then hold
<c-j>
and auto-repeat to move it down, knowing that it will stop at the 'e' commit. Thinking about this, that's really a workaround for the missing feature of marking one or more commits for moving, and then navigating to the destination and invoking a "move marked commits here" command. Maybe that's input for the range select discussion. - I want the same for "squash all fixups above". It would be nice to have a command for "squash all fixups in this branch". This could be done by replacing the confirmation of "squash all fixups above" with a menu.
- For stacked branches, this will rebase the entire stack, which may or may not be what's intended. In many cases it's fine, probably, and if it's not, then users have to fall back to 'e'. Just mentioning it.
pkg/config/user_config.go
Outdated
@@ -822,6 +823,9 @@ func GetDefaultConfig() *UserConfig { | |||
OpenLogMenu: "<c-l>", | |||
OpenInBrowser: "o", | |||
ViewBisectOptions: "b", | |||
// Using shift+I because we may want to use lowercase 'i' as an | |||
// alias for editing a commit. | |||
QuickStartInteractiveRebase: "I", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure I understand the reasoning for shift-I; I'd have expected 'i', like the PR description says. Not sure why 'e' needs another alias.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I started with 'i' but it struck me that the most intuitive thing that 'i' would do would be to start an interactive rebase from the selected commit, whereas quick-start would be more of a special case. So I wanted to give us the freedom to change that in the future without worrying about backwards compatibility.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the most intuitive thing that 'i' would do would be to start an interactive rebase from the selected commit,
Not sure about that; you could also argue that the most intuitive thing that 'i' would do is to do an interactive rebase of your current branch.
Thinking about this more, I'm also against calling this "quick start", as if it's just a special alternative for the "normal" way to start an interactive rebase. This is the normal way to start one (or it could become it), so I would rather call it "Start interactive rebase of current branch", or maybe even just "Start interactive rebase" (the tooltip could explain more). I have watched lazygit newcomers struggle to find out how to interactively rebase a branch, being surprised that they have to select a commit to rebase from.
And binding it to shift-I contributes to conveying that it's somehow special, or an expert or niche thing or something. I really think it deserves to be bound to 'i'.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm happy to do that and see how users like it. I have a premonition that it is a special action for the following reasons:
- this feature isn't built into the git CLI so most people coming from the CLI will expect to be specifying a base commit by default
- the rules we've defined for finding the base commit are specific to our own workflows and may not reflect the typical workflow (e.g. maybe some people expect merges in their rebases, or some people directly commit to the main branch in personal projects, or do want stacked branches to be taken into consideration etc)
Nonetheless, fortune favours the brave, so let's go with 'i', call it 'Start interactive rebase' and explain the logic in a tooltip.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- this feature isn't built into the git CLI so most people coming from the CLI will expect to be specifying a base commit by default
I see a lot of people do git rebase -i master
on the command line. Which isn't the same, but comes close, at least in the intention to mean "rebase my current branch interactively".
Nonetheless, fortune favours the brave, so let's go with 'i', call it 'Start interactive rebase' and explain the logic in a tooltip.
🎉
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see a lot of people do git rebase -i master on the command line.
Ah good point
func (self *LocalCommitsController) quickStartInteractiveRebase() error { | ||
if self.c.Git().Status.WorkingTreeState() != enums.REBASE_MODE_NONE { | ||
return self.c.ErrorMsg(self.c.Tr.AlreadyRebasing) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd prefer this to be a DisabledReason, like we do for amendTo and squashAllFixupsAbove. (We are not super consistent with this, some other commands only check it in the handler, but for new ones it would be good to use DisabledReasons rather more than less.)
More thoughts on this: Status.WorkingTreeState()
is reasonably cheap, but it still needs to hit the file system, so we may not want to use it for DisabledReasons. Maybe we should switch to Model.WorkingTreeStateAtLastCommitRefresh
for that, but then we should check Status.WorkingTreeState()
again in the handler just to be sure. I guess.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair point. Happy to use WorkingTreeStateAtLastCommitRefresh
and we don't need to do another check inside the handler: it's actually harmless if we skip the check: it just means that we'll get 'YOU ARE HERE' on the head commit. That's not something I'm worried about.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's actually harmless if we skip the check: it just means that we'll get 'YOU ARE HERE' on the head commit. That's not something I'm worried about.
No, you'd get a cryptic error from git that you are already in a rebase. That would be pretty unpleasant. You could argue that it's so very unlikely that the model state is out of date that it's not worth worrying about it happening, and that I could agree with.
Also, I was thinking more about the two other places where we now use Status.WorkingTreeState()
for disabled reasons; I think it would be good to change those, too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah sorry, I was thinking about the other edge case where the first commit is a merge (or main branch) commit.
Also, I was thinking more about the two other places where we now use Status.WorkingTreeState() for disabled reasons; I think it would be good to change those, too.
Agreed
|
||
commit, index, ok := lo.FindIndexOf(self.c.Model().Commits, func(c *models.Commit) bool { | ||
return c.IsMerge() || c.Status == models.StatusMerged | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should also be a DisabledReason. Maybe not using the FindIndexOf; I guess checking the merge state of Commits[0]
should be enough for that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can do
pkg/i18n/english.go
Outdated
@@ -1477,6 +1480,9 @@ func EnglishTranslationSet() TranslationSet { | |||
DisabledMenuItemPrefix: "Disabled: ", | |||
NoCommitSelected: "No commit selected", | |||
NoCopiedCommits: "No copied commits", | |||
QuickStartInteractiveRebase: "Quick start interactive rebase", | |||
QuickStartInteractiveRebaseTooltip: "Start an interactive rebase for all commits from HEAD down to the first merge commit or main branch commit.\nIf you would instead like to start an interactive rebase from the selected commit, press {{.editKey}} instead", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nitpick: there are two instead
s in the last sentence.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
haha good catch
One more thing that's important for stacked branches: for 'e' we added code to reselect the same commit again, we need to do the same thing here, for the case that the selection is in one of the lower branches of a stack of branches. See #2954 |
It is nice to be able to hold down the move key to get to the destination, but it's annoying to have to specify the target inbetween. I also want a better UX for this, but I don't know how we would make it easy to move the commits without something like the Bottomless Rebase idea I did a writeup on today (ultimately deciding against it: #3214).
That sounds good to me.
I'm okay with that: I wouldn't want a 'coincidental stack' (which I get from time to time) to interfere with the expected behaviour. |
We could do it without the bottomless rebase idea if we decouple the selection from a "marked to be acted on" state (similar to what we do for cherry-picking). You'd first mark the commits that you want to move, then navigate to the destination, then invoke the "move marked commits here" command. We'd have to do something similar if we wanted to support non-contiguous selections, that's why I said it could be related to the multiselection discussion. But I'm not sure it's a good idea, and we already decided to only support contiguous selections, so best to forget it, maybe. 😄 |
Yeah I'm happy to wait and see how we feel about things once we're comfortable with range select. We might find it's already so easy that we don't need to improve it. |
Working on the code, I think we still need a name for this feature, even if it's only used internally. Just calling it 'Start interactive rebase' is ambiguous because it could be talking about starting from a manually chosen commit or an automatically chosen one. I'm gonna use 'auto-start interactive rebase' internally if there's no objections |
I find "auto" a bit misleading in there, because it sounds like the rebase would start automatically (as in the "hidden rebase" case maybe). I'd have suggested StartInteractiveRebaseForCurrentBranch, but I have no strong opinion. |
I see your point, though with StartInteractiveRebaseForCurrentBranch it could be misconstrued i.e. 'of course it's on my current branch'. I'm gonna lock in quick-start again because it really is a quick way to start a rebase compared to the manual approach. |
Works for me. |
8fd5bf3
to
2e990ce
Compare
ready for re-review @stefanhaller |
Coverage summary from CodacySee diff coverage on Codacy
Coverage variation details
Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: Diff coverage details
Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: See your quality gate settings Change summary preferencesYou may notice some variations in coverage metrics with the latest Coverage engine update. For more details, visit the documentation |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's one problem left with the disabled reason text, I pushed a fixup for that. Apart from that, looks great now!
pkg/i18n/english.go
Outdated
CouldNotQuickStartInteractiveRebase: "Quick start failed: the HEAD commit is a merge commit or is present on the main branch, so there is no appropriate base commit to start the rebase from.", | ||
QuickStartInteractiveRebase: "Start interactive rebase", | ||
QuickStartInteractiveRebaseTooltip: "Start an interactive rebase for the commits on your branch. This will include all commits from the HEAD commit down to the first merge commit or main branch commit.\nIf you would instead like to start an interactive rebase from the selected commit, press `{{.editKey}}`.", | ||
CouldNotQuickStartInteractiveRebase: "Could not start interactive rebase: the HEAD commit is a merge commit or is present on the main branch, so there is no appropriate base commit to start the rebase from. You can start an interactive rebase from a specific commit by selecting the commit and pressing `{{.editKey}}`.", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's weird to see a "Disabled:" tooltip in the keybindings menu that starts with "Could not".
Since this is now only used for the disabled reason and not for regular error checking in the handler, it should be rephrased and renamed. I pushed a fixup (6c9796a) to do this and to change the logic a bit to make this clearer.
With the show-disabled-reasons-as-toasts branch we will still have the problem that the text is much too long for the bottom line view; also, when used as a disabled tooltip in the menu it doesn't need to be this long, since it basically only repeats what the regular tooltip already says. Not totally sure what to do about this, but my feeling is that the Disabled reason should be shortened a lot to be just "No non-main commits to rebase" or something like that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for making that commit. There's two separate things I want to respond to here:
Relying on disabled checks
In the code I see:
// No need to check for nil here, our DisabledReason callback guarantees it's non-nil
The callback actually does not guarantee this, because a background refresh could change self.c.Model().Commits
and the commit that was found before may no longer be found (for example it may be that in another process the main branch was checked out). Although this is super unlikely, if it does happen it will cause a panic via nil pointer exception, and I really don't want lazygit to ever panic.
This means that to be safe we need to unfortunately have some convoluted code and double-handling. The proper solution to this problem is to use a mutex to guarantee that the model does not change while a controller action is being processed and if I recall correctly that's something you've looked into recently. Until that work is done, I'm going to play it safe.
Disabled reasons as toasts
I really don't like the idea of shortening all disabled error messages to fit on one line: some errors are the result of a user accidentally doing something nonsensical, like trying to pull the same branch twice. For that, an error message like 'already pulling this branch' is all you need. But there are some errors that result from a user fundamentally misunderstanding something, and they need help, and that requires a longer error message.
A user might think that 'Start interactive rebase' just picks a convenient base commit somewhat arbitrarily and then get surprised when it fails on the main branch (note that they may have a valid reason to do that e.g. they're just working on a personal project with a single branch). At the very least, they need to be told that if they still want to do an interactive rebase, they can press 'e' on a commit. Expecting the user to go looking for the keybinding tooltip to get that extra info feels wrong. There's also the possibility that the user is on a feature branch but the last commit was a merge, and so our error message would need to capture that too.
In your show-disabled-reasons-as-toasts PR, I mentioned that we could let getDisabledReason function decide whether to show an error as a toast or an error message, and I think this is one such case. Showing 'already rebasing' as a toast is perfect because (almost) nobody believes that you should be able to start a rebase while already rebasing. So in this case we've got two possible error messages, one of which works as a toast and one which doesn't. So we could:
- instead of returning strings from our disabled reason functions, make a DisabledReason struct which contains two fields: a message, and a boolean for whether it's displayed as a toast or a popup, or
- decide whether to render something as a toast based on the length of the message
Also:
also, when used as a disabled tooltip in the menu it doesn't need to be this long, since it basically only repeats what the regular tooltip already says
I'm fine with this
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I retained your language change but reverted the other parts of the change
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see. Too bad that we can't rely on the model not changing concurrently to main thread code (yet).
I made this assumption in other places before, so maybe those need to be audited for the same problem. I can't check myself right now because I'm not at my computer; one case that I remember off the top of my head is checkSelected
in local_commits_controller.go. In that case it's probably still ok, since for the assumption to not hold someone would have to drop all commits of the repo in another process (I think?).
Anyway, for this PR I have no more objections.
A common issue I have is that I want to move a commit from the top of my branch all the way down to the first commit on the branch. To do that, I need to navigate down to the first commit on my branch, press 'e' to start an interactive rebase, then navigate back up to the top of the branch, then move my commit back down to the base. This is annoying. Similarly annoying is moving the commit one-by-one without explicitly starting an interactive rebase, because then each individual step is its own rebase which takes a while in aggregate. This PR allows you to press 'i' from the commits view to start an interactive rebase from an 'appropriate' base. By appropriate, we mean that we want to start from the HEAD and stop when we reach the first merge commit or commit on the main branch. This may end up including more commits than you need, but it doesn't make a difference.
I'm adding a couple more terms: Keybinding and Action, to keep things standardised
Missed a spot when I originally wrote this
Because we obtain disabled reasons after every action, we need to keep the code for doing so super fast. As such, we should not be hitting the filesystem to get rebase state, instead we should just get the cached state. I feel like we should actually be using the cached state everywhere like we do with all our other models if only for the sake of consistency.
6c9796a
to
ee106f9
Compare
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [aquaproj/aqua-registry](https://github.com/aquaproj/aqua-registry) | minor | `v4.154.0` -> `v4.155.1` | | [cli/cli](https://github.com/cli/cli) | minor | `v2.45.0` -> `v2.46.0` | | [derailed/k9s](https://github.com/derailed/k9s) | patch | `v0.32.3` -> `v0.32.4` | | [eza-community/eza](https://github.com/eza-community/eza) | patch | `v0.18.7` -> `v0.18.8` | | [golangci/golangci-lint](https://github.com/golangci/golangci-lint) | minor | `v1.56.2` -> `v1.57.1` | | [gruntwork-io/terragrunt](https://github.com/gruntwork-io/terragrunt) | patch | `v0.55.16` -> `v0.55.20` | | [jesseduffield/lazygit](https://github.com/jesseduffield/lazygit) | minor | `v0.40.2` -> `v0.41.0` | | [junegunn/fzf](https://github.com/junegunn/fzf) | patch | `0.48.0` -> `0.48.1` | | [lsd-rs/lsd](https://github.com/lsd-rs/lsd) | minor | `v1.0.0` -> `v1.1.2` | | [mikefarah/yq](https://github.com/mikefarah/yq) | minor | `v4.42.1` -> `v4.43.1` | | [simulot/immich-go](https://github.com/simulot/immich-go) | minor | `0.12.0` -> `0.13.0` | | [snyk/cli](https://github.com/snyk/cli) | minor | `v1.1284.0` -> `v1.1286.0` | | [starship/starship](https://github.com/starship/starship) | minor | `v1.17.1` -> `v1.18.1` | | [twpayne/chezmoi](https://github.com/twpayne/chezmoi) | patch | `v2.47.1` -> `v2.47.2` | | [weaveworks/eksctl](https://github.com/weaveworks/eksctl) | minor | `v0.174.0` -> `v0.175.0` | --- > [!WARNING] > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Release Notes <details> <summary>aquaproj/aqua-registry (aquaproj/aqua-registry)</summary> ### [`v4.155.1`](https://github.com/aquaproj/aqua-registry/releases/tag/v4.155.1) [Compare Source](https://github.com/aquaproj/aqua-registry/compare/v4.155.0...v4.155.1) [Issues](https://github.com/aquaproj/aqua-registry/issues?q=is%3Aissue+milestone%3Av4.155.0) | [Pull Requests](https://github.com/aquaproj/aqua-registry/pulls?q=is%3Apr+milestone%3Av4.155.0) | https://github.com/aquaproj/aqua-registry/compare/v4.155.0...v4.155.1 ##### Others [#​21239](https://github.com/aquaproj/aqua-registry/issues/21239) Rename the package crates.io/shellharden to anordal/shellharden [@​hituzi-no-sippo](https://github.com/hituzi-no-sippo) shellharden started releasing pre-built binaries, so we changed the package type from `cargo` to `github_release` from shellharden v4.3.1. [https://github.com/anordal/shellharden/pull/57](https://github.com/anordal/shellharden/pull/57) https://github.com/anordal/shellharden/releases/tag/v4.3.1 > \[!WARNING] > Please rename the package `crates.io/shellharden` to `anordal/shellharden` > > ```yaml > packages: > - name: anordal/[email protected] > ``` > > Note that Renovate will update crates.io/shellharden to crates.io/[email protected], but it wouldn't work. > You have to change the version to `v4.3.1`. ### [`v4.155.0`](https://github.com/aquaproj/aqua-registry/releases/tag/v4.155.0) [Compare Source](https://github.com/aquaproj/aqua-registry/compare/v4.154.0...v4.155.0) [Issues](https://github.com/aquaproj/aqua-registry/issues?q=is%3Aissue+milestone%3Av4.154.0) | [Pull Requests](https://github.com/aquaproj/aqua-registry/pulls?q=is%3Apr+milestone%3Av4.154.0) | https://github.com/aquaproj/aqua-registry/compare/v4.154.0...v4.155.0 #### 🎉 New Packages [#​21127](https://github.com/aquaproj/aqua-registry/issues/21127) [ynqa/jnv](https://github.com/ynqa/jnv): interactive JSON filter using jq [@​ponkio-o](https://github.com/ponkio-o) [#​21079](https://github.com/aquaproj/aqua-registry/issues/21079) [zaghaghi/openapi-tui](https://github.com/zaghaghi/openapi-tui): Terminal UI to list, browse and run APIs defined with openapi spec [@​wancup](https://github.com/wancup) #### Fixes [#​21122](https://github.com/aquaproj/aqua-registry/issues/21122) Update some packages to support Cosign v2 ⚠️ To install the following packages, aqua v2.25.1 or later is required. - aquaproj/aqua-registry-updater - aquaproj/registry-tool - argoproj/argo-workflows - chainguard-dev/apko - chainguard-dev/melange - charmbracelet/gum - goreleaser/nfpm - kubernetes-sigs/zeitgeist - lintnet/lintnet - suzuki-shunsuke/ci-info - suzuki-shunsuke/circleci-config-merge - suzuki-shunsuke/cmdx - suzuki-shunsuke/ghalint - suzuki-shunsuke/ghcp - suzuki-shunsuke/github-comment - suzuki-shunsuke/mkghtag - suzuki-shunsuke/nllint - suzuki-shunsuke/pinact - suzuki-shunsuke/renovate-issue-action - suzuki-shunsuke/tfcmt - suzuki-shunsuke/tfprovidercheck - terraform-linters/tflint - tfmigrator/cli - updatecli/updatecli - yuyaban/gitlab-comment [#​21062](https://github.com/aquaproj/aqua-registry/issues/21062) [#​21063](https://github.com/aquaproj/aqua-registry/issues/21063) [#​21064](https://github.com/aquaproj/aqua-registry/issues/21064) [#​21065](https://github.com/aquaproj/aqua-registry/issues/21065) [#​21066](https://github.com/aquaproj/aqua-registry/issues/21066) Transfer [k0kubun/xremap/\*](https://github.com/k0kubun/xremap) to [xremap/xremap/\*](https://github.com/xremap/xremap) The GitHub Repository of the package "k0kubun/xremap/hypr" was transferred from [k0kubun/xremap](https://github.com/k0kubun/xremap) to [xremap/xremap](https://github.com/xremap/xremap) </details> <details> <summary>cli/cli (cli/cli)</summary> ### [`v2.46.0`](https://github.com/cli/cli/releases/tag/v2.46.0): GitHub CLI 2.46.0 [Compare Source](https://github.com/cli/cli/compare/v2.45.0...v2.46.0) #### What's Changed - Draft issue IDs are included in `project item-list` output by [@​yasunori0418](https://github.com/yasunori0418) in [https://github.com/cli/cli/pull/8754](https://github.com/cli/cli/pull/8754) - New `--dry-run` option for `pr create` by [@​v1v](https://github.com/v1v) in [https://github.com/cli/cli/pull/8376](https://github.com/cli/cli/pull/8376) - Bump go-keyring to fix race condition by [@​williammartin](https://github.com/williammartin) in [https://github.com/cli/cli/pull/8833](https://github.com/cli/cli/pull/8833) - PR numbers are prefixed with owner/repo for context by [@​nobe4](https://github.com/nobe4) in [https://github.com/cli/cli/pull/8778](https://github.com/cli/cli/pull/8778) - Extra word removed in `codespaces` code comments by [@​cuinix](https://github.com/cuinix) in [https://github.com/cli/cli/pull/8795](https://github.com/cli/cli/pull/8795) - Clarified description of the `-u`, `--user` option for `gh auth token` by [@​gregsmi](https://github.com/gregsmi) in [https://github.com/cli/cli/pull/8797](https://github.com/cli/cli/pull/8797) - Fixed formatting for the description of `release upload` by [@​malor](https://github.com/malor) in [https://github.com/cli/cli/pull/8834](https://github.com/cli/cli/pull/8834) - Clarified the usage of `auth status` to list all authenticated accounts by [@​jsoref](https://github.com/jsoref) in [https://github.com/cli/cli/pull/8838](https://github.com/cli/cli/pull/8838) - Document auth switch behavior for two or more accounts by [@​williammartin](https://github.com/williammartin) in [https://github.com/cli/cli/pull/8839](https://github.com/cli/cli/pull/8839) - Document run watch and view not supporting fine grained PATs by [@​williammartin](https://github.com/williammartin) in [https://github.com/cli/cli/pull/8843](https://github.com/cli/cli/pull/8843) - build(deps): bump google.golang.org/protobuf from 1.30.0 to 1.33.0 by [@​dependabot](https://github.com/dependabot) in [https://github.com/cli/cli/pull/8811](https://github.com/cli/cli/pull/8811) - build(deps): bump github.com/cpuguy83/go-md2man/v2 from 2.0.3 to 2.0.4 by [@​dependabot](https://github.com/dependabot) in [https://github.com/cli/cli/pull/8844](https://github.com/cli/cli/pull/8844) #### New Contributors - [@​cuinix](https://github.com/cuinix) made their first contribution in [https://github.com/cli/cli/pull/8795](https://github.com/cli/cli/pull/8795) - [@​gregsmi](https://github.com/gregsmi) made their first contribution in [https://github.com/cli/cli/pull/8797](https://github.com/cli/cli/pull/8797) - [@​nobe4](https://github.com/nobe4) made their first contribution in [https://github.com/cli/cli/pull/8778](https://github.com/cli/cli/pull/8778) - [@​malor](https://github.com/malor) made their first contribution in [https://github.com/cli/cli/pull/8834](https://github.com/cli/cli/pull/8834) - [@​yasunori0418](https://github.com/yasunori0418) made their first contribution in [https://github.com/cli/cli/pull/8754](https://github.com/cli/cli/pull/8754) **Full Changelog**: https://github.com/cli/cli/compare/v2.45.0...v2.46.0 </details> <details> <summary>derailed/k9s (derailed/k9s)</summary> ### [`v0.32.4`](https://github.com/derailed/k9s/releases/tag/v0.32.4) [Compare Source](https://github.com/derailed/k9s/compare/v0.32.3...v0.32.4) <img src="https://raw.githubusercontent.com/derailed/k9s/master/assets/k9s.png" align="center" width="800" height="auto"/> ### Release v0.32.4 #### Notes Thank you to all that contributed with flushing out issues and enhancements for K9s! I'll try to mark some of these issues as fixed. But if you don't mind grab the latest rev and see if we're happier with some of the fixes! If you've filed an issue please help me verify and close. Your support, kindness and awesome suggestions to make K9s better are, as ever, very much noted and appreciated! Also big thanks to all that have allocated their own time to help others on both slack and on this repo!! As you may know, K9s is not pimped out by corps with deep pockets, thus if you feel K9s is helping your Kubernetes journey, please consider joining our [sponsorship program](https://github.com/sponsors/derailed) and/or make some noise on social! [@​kitesurfer](https://twitter.com/kitesurfer) On Slack? Please join us [K9slackers](https://join.slack.com/t/k9sers/shared_invite/enQtOTA5MDEyNzI5MTU0LWQ1ZGI3MzliYzZhZWEyNzYxYzA3NjE0YTk1YmFmNzViZjIyNzhkZGI0MmJjYzhlNjdlMGJhYzE2ZGU1NjkyNTM) #### Maintenance Release! *** #### ♫ Sounds Behind The Release ♭ Thinking of all you at KubeCon Paris!! May I suggest a nice glass of `cold Merlote` or other fine grape juices from my country? - [Le Gorille - George Brassens](https://www.youtube.com/watch?v=KVfwvk_yVyA) - [Les Funerailles D'antan (Love this guy!) - George Brassens](https://www.youtube.com/watch?v=bwb5k4k2EMc) - [Poinconneur Des Lilas - Serge Gainsbourg](https://www.youtube.com/watch?v=eWkWCFzkOvU) - [Mon Legionaire (Yup! same guy??) - Serge Gainsbourg](https://www.youtube.com/watch?v=gl8gopryqWI) - [Les Cornichons - Nino Ferrer](https://www.youtube.com/watch?v=N7JSW4NhM8I) - [Paris s'eveille - Jacques Dutronc](https://www.youtube.com/watch?v=3WcCg6rm3uM) *** #### Videos Are In The Can! Please dial [K9s Channel](https://www.youtube.com/channel/UC897uwPygni4QIjkPCpgjmw) for up coming content... - [K9s v0.31.0 Configs+Sneak peek](https://youtu.be/X3444KfjguE) - [K9s v0.30.0 Sneak peek](https://youtu.be/mVBc1XneRJ4) - [Vulnerability Scans](https://youtu.be/ULkl0MsaidU) *** #### Resolved Issues - [#​2608](https://github.com/derailed/k9s/issues/2608) Make the sanitize feature easier to use - [#​2605](https://github.com/derailed/k9s/issues/2605) Built-in shortcuts being overridden by plugins result in excessive logging - [#​2604](https://github.com/derailed/k9s/issues/2604) Ability to mark a plugin as Dangerous/destructive - [#​2592](https://github.com/derailed/k9s/issues/2592) "list access denied" when switching contexts within k9s since 0.32.0 *** #### Contributed PRs Please be sure to give `Big Thanks!` and `ATTA Girls/Boys!` to all the fine contributors for making K9s better for all of us!! - [#​2621](https://github.com/derailed/k9s/pull/2621) Fix snap build *** <img src="https://raw.githubusercontent.com/derailed/k9s/master/assets/imhotep_logo.png" width="32" height="auto"/> © 2024 Imhotep Software LLC. All materials licensed under [Apache v2.0](http://www.apache.org/licenses/LICENSE-2.0) </details> <details> <summary>eza-community/eza (eza-community/eza)</summary> ### [`v0.18.8`](https://github.com/eza-community/eza/releases/tag/v0.18.8): eza v0.18.8 [Compare Source](https://github.com/eza-community/eza/compare/v0.18.7...v0.18.8) ### Changelog #### \[0.18.8] - 2024-03-21 ##### Bug Fixes - Avoid deprecation warnings - Rustfmt issues ##### Features - Add fennel lang icon and associations ##### Miscellaneous Tasks - Release eza v0.18.8 ### Checksums #### sha256sum 80565916de55b23c3cabb363ba1cb7f323f99b158e75b6c029a64108de7bdad9 ./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.tar.gz d3532278f5eae1c1dd57bcc9373f05b49f40ffac880d5c4efb67ac5d93cdf0ea ./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.zip 2c1722afbb0f90e40047cfffa93f04fb9b89633402236fb75119c9105265271f ./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.tar.gz a832c4694228780f43f467e2f0536bd4a8969a455edbb872eb8b4614ebd157e0 ./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.zip 39cc743e9293a5e269b2b2baf167f4f868f682143dc8b1f87efd64848bb3bca4 ./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.tar.gz 9b331b2eee259a9afbffd39e5018735651f8053c5429714cdc46a02f571463e7 ./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.zip 2e12d0b714aa011d23abb72459a2478eb9e369ac564a9a7e39ba6ec7ef775ad4 ./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.tar.gz e3c9c3535732cecad5eb9d786e1f7a7c66aa28d42a3516046e5b1cf7f3799920 ./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.zip 2fc6c3ead5c8bc596643597737ba596aee2f61772792927e4e9e602525a6ae81 ./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.tar.gz 543f69f52165f654c5ab869319663d7f4ebdc95b7fc9c23be003ca551aec5dc3 ./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.zip #### md5sum f3dece765bb95c732bce9406c1eb825a ./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.tar.gz b655997af2b0df307abd3a126e48fc3d ./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.zip 9cd1ae35fd90e4341cf8ed1b4a3d6cd9 ./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.tar.gz e9cd1a917b39827fc159c100faaf28b9 ./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.zip 9f02446483003c219eecc1dc15273956 ./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.tar.gz db239fa66fde9800770384831e3a86fa ./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.zip 5722d3f4e4f2848d770713341c7c4bfd ./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.tar.gz c9f5ece20dc527fd4ecf4f77bbf70b56 ./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.zip 0826369c7f0ab3b17c4275f98ff1ab70 ./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.tar.gz 3c3633a6c54d32ee9f04277f4b103edc ./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.zip #### blake3sum 0c7fc89dd1cf514e62e644e8ff8dab8759d6bd42f364f2768c41df92ec9e9dfc ./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.tar.gz 540def87f4f455fcd6067648f05498db775c6c03f291088d03f1dc4cc8cf68e7 ./target/bin-0.18.8/eza_aarch64-unknown-linux-gnu.zip 1980d8004ad1f9b0291381c4d57db64fc8ebcf1c0961a8ac3c05c3697d7dfaf3 ./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.tar.gz 9a80d9f0cfc83521d119778b52b55dce4b33f28b02624297c712efd3ade53f19 ./target/bin-0.18.8/eza_arm-unknown-linux-gnueabihf.zip 5d97ba1a2eaccc814aec982922f89ee218521b343b5f3ad6900596ad9574bfa3 ./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.tar.gz 2d274f097297ff222dc7756903dfb73fdc744051c75b815d2eea2e08ee0f4418 ./target/bin-0.18.8/eza.exe_x86_64-pc-windows-gnu.zip 04ca09128611f9719ac0a7c387282049489243bbe74be8de797d845ec380b9ee ./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.tar.gz 3e58bf50b39c1b20801f5282b612103b07b12089d2a24f3dcec9882ac8482c8c ./target/bin-0.18.8/eza_x86_64-unknown-linux-gnu.zip 1df711c44e08cc08fc26753f5c50f9de244fdbd7e2f8cc3961d82f101d775154 ./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.tar.gz 9d71a5afbc797ca63eecf254fc4971c2a1dd188ce28c8cb4a10cf1a273d747d5 ./target/bin-0.18.8/eza_x86_64-unknown-linux-musl.zip </details> <details> <summary>golangci/golangci-lint (golangci/golangci-lint)</summary> ### [`v1.57.1`](https://github.com/golangci/golangci-lint/releases/tag/v1.57.1) [Compare Source](https://github.com/golangci/golangci-lint/compare/v1.57.0...v1.57.1) #### Changelog - [`87b6bf1`](https://github.com/golangci/golangci-lint/commit/87b6bf17) build(deps): bump github.com/golangci/plugin-module-register from 0.1.0 to 0.1.1 ([#​4549](https://github.com/golangci/golangci-lint/issues/4549)) - [`921d535`](https://github.com/golangci/golangci-lint/commit/921d5357) build(deps): bump github.com/pelletier/go-toml/v2 from 2.1.1 to 2.2.0 ([#​4548](https://github.com/golangci/golangci-lint/issues/4548)) - [`cd890db`](https://github.com/golangci/golangci-lint/commit/cd890db2) fix: filter invalid issues before other processors ([#​4552](https://github.com/golangci/golangci-lint/issues/4552)) ### [`v1.57.0`](https://github.com/golangci/golangci-lint/compare/v1.56.2...v1.57.0) [Compare Source](https://github.com/golangci/golangci-lint/compare/v1.56.2...v1.57.0) </details> <details> <summary>gruntwork-io/terragrunt (gruntwork-io/terragrunt)</summary> ### [`v0.55.20`](https://github.com/gruntwork-io/terragrunt/compare/v0.55.19...v0.55.20) [Compare Source](https://github.com/gruntwork-io/terragrunt/compare/v0.55.19...v0.55.20) ### [`v0.55.19`](https://github.com/gruntwork-io/terragrunt/releases/tag/v0.55.19) [Compare Source](https://github.com/gruntwork-io/terragrunt/compare/v0.55.18...v0.55.19) #### Updated CLI args, config attributes and blocks - `scaffold` #### Description - Fix grammar in feature text - Fix URL handling in the `scaffold` command - Updated gon version to 0.2.5 #### Related links - [https://github.com/gruntwork-io/terragrunt/pull/3010](https://github.com/gruntwork-io/terragrunt/pull/3010) - [https://github.com/gruntwork-io/terragrunt/pull/3005](https://github.com/gruntwork-io/terragrunt/pull/3005) **Full Changelog**: https://github.com/gruntwork-io/terragrunt/compare/v0.55.18...v0.55.19 ### [`v0.55.18`](https://github.com/gruntwork-io/terragrunt/releases/tag/v0.55.18) [Compare Source](https://github.com/gruntwork-io/terragrunt/compare/v0.55.17...v0.55.18) #### Description - Updated github.com/cloudflare/circl from 1.3.3 to 1.3.7 - Updated github.com/go-jose/go-jose/v3 from 3.0.0 to 3.0.3 - Updated google.golang.org/protobuf from 1.32.0 to 1.33.0 - Updated nokogiri to 1.16.3 - Updates mini_portile2 from 2.4.0 to 2.8.5 #### Related links - [https://github.com/gruntwork-io/terragrunt/pull/2995](https://github.com/gruntwork-io/terragrunt/pull/2995) - [https://github.com/gruntwork-io/terragrunt/pull/2996](https://github.com/gruntwork-io/terragrunt/pull/2996) - [https://github.com/gruntwork-io/terragrunt/pull/2929](https://github.com/gruntwork-io/terragrunt/pull/2929) - [https://github.com/gruntwork-io/terragrunt/pull/3000](https://github.com/gruntwork-io/terragrunt/pull/3000) - [https://github.com/gruntwork-io/terragrunt/pull/3009](https://github.com/gruntwork-io/terragrunt/pull/3009) ### [`v0.55.17`](https://github.com/gruntwork-io/terragrunt/releases/tag/v0.55.17) [Compare Source](https://github.com/gruntwork-io/terragrunt/compare/v0.55.16...v0.55.17) #### Updated CLI args, config attributes and blocks - `terraform` #### Description - Added support for OpenTofu registry for shorthand TFR modules. #### Related links - [https://github.com/gruntwork-io/terragrunt/pull/2961](https://github.com/gruntwork-io/terragrunt/pull/2961) </details> <details> <summary>jesseduffield/lazygit (jesseduffield/lazygit)</summary> ### [`v0.41.0`](https://github.com/jesseduffield/lazygit/releases/tag/v0.41.0) [Compare Source](https://github.com/jesseduffield/lazygit/compare/v0.40.2...pre-0.41) Hold on tight because this is a HUGE release! This release includes a whopping 595 commits from a period of over 7 months, from 40 different contributors. Thanks to everybody who made this possible, and apologies for taking so long to actually release it: we'll be more frequent in future! Special thanks to Stefan Haller who is behind many of this release's changes and who has been critical in getting this release across the line. I've made a video running through the big changes here: [<img src="https://github.com/jesseduffield/lazygit/assets/8456633/f9b47c5e-f8b2-4b41-8f51-bf06b01046e2">](https://youtu.be/\_REmkoIyPW0) #### What's Changed Here's some highlighted features: ##### Range select ![range-select](https://github.com/jesseduffield/lazygit/blob/assets/demo/interactive_rebase-compressed.gif?raw=true) You can now press 'v' to toggle range select in any list view, just like you already could in the staging view. You can also press shift+up/down to select a range. You can use range select to: - stage/discard a range of files - select multiple commits to fixup/squash/move outside an interactive rebase - select multiple commits to mark as fixup/squash/etc within an interactive rebase - select multiple commit files to discard or add to a custom patch (courtesy of [@​afhoffman](https://github.com/afhoffman)) - select multiple commits to cherry-pick I have been waiting for this feature for a very long time and it's already made me way more productive. If I need to squash a range of commits I can now easily do it directly rather than needing to squash them one-by-one, or needing to manually start an interactive rebase first. Likewise, it's much easier to select a range of files and stage them than stage them one-by-one. This is a **Breaking change**: Unfortunately, the 'v' key clashes with the existing key for pasting commits (cherry-pick), so we've replaced that with shift+V and changed the commit copy key to shift+C. If you want the old keybindings back, you can do that like so: ```yml keybinding: universal: toggleRangeSelect: <something other than v> commits: cherryPickCopy: 'c' pasteCommits: 'v' ``` ##### Auto-wrap in commit editor The commit editor now automatically hard-wraps your content by default, so you no longer need to hit the enter key yourself when you approach the margin. You can disable/configure this in your config: ```yml git: commit: autoWrapCommitMessage: true autoWrapWidth: 72 ``` Thanks to [@​stefanhaller](https://github.com/stefanhaller) for this feature. ##### Easier remote branch checkout Now when you go to checkout a remote branch, either via the `c` keybinding in the branches view or by pressing `space` on a remote branch, you'll be given the choice to checkout as a local branch or as a detached head (previously it would just check it out as a detached head which typically isn't what you want). This is a **Breaking change** in terms of muscle memory. Thanks to [@​stefanhaller](https://github.com/stefanhaller) for this feature. ##### Easier start interactive rebase Previously, to start an interactive rebase, you would need to navigate to a base commit and press `e` on it. Now you can simply press `i` and regardless of which commit is selected, an interactive rebase will begin that includes all the commits on your branch (or if there are merge commits: all the commits up to first merge commit). The above demo for range select showcases this. ##### Easier squashing of `fixup!` commits In a similar vein to the above section, now when you press `shift+S`, you're given the choice of squashing all commits above the selected commit and squashing all commits on the branch, which is what you typically want. This is a **Breaking change** in terms of muscle memory. Thanks to [@​stefanhaller](https://github.com/stefanhaller) for this feature. ##### View divergence from upstream branch If you press `u` on a local branch a menu appears which shows options relating to the branch's upstream. Now, the first option in that menu allows you to view the divergence from the upstream which shows commits to pull and commits to push Thanks to [@​stefanhaller](https://github.com/stefanhaller) for this feature. ##### Find appropriate commit for fixup/amend This one is some serious voodoo: if somebody suggests changes in a PR review, you'll often apply the changes, then go hunting for the appropriate commit to fixup/amend. Now, from the files view you can press `ctrl+f` and if Lazygit can identify an appropriate commit with certainty, it will select that commit for you. Pretty cool! We've made the algorithm very strict so that you can always trust the result, but this means in circumstances where we can't know for sure which commit is appropriate (such as when your changes only include added lines), it's left to you to manually find the commit. We're keen to get lots of feedback on this feature to see where the sweet spot is. For more info see [the docs](https://github.com/jesseduffield/lazygit/blob/master/docs/Fixup_Commits.md#finding-the-commit-to-create-a-fixup-for) Thanks to [@​stefanhaller](https://github.com/stefanhaller) for this feature. ##### Delete remote branches/tags Now when you press `d` on a local branch, remote branch, or tag, you're given the option to delete that branch/tag in the remote. Thanks to [@​AzraelSec](https://github.com/AzraelSec) for this feature. ##### Add co-author to commit When you press `a` on a commit an option now appears to add a co-author (something GitHub can read). Thanks to [@​omaussa](https://github.com/omaussa) for this feature. ##### Filter commits by author You can now filter commits by author via pressing `ctrl+s` in the commits view and selecting the option to filter by author. Thanks to [@​Part22](https://github.com/Part22) for this feature. ##### Change branch sort order You can now change branch sort order by pressing `s` in the branches view (and remote branches view). By default local branches are sorted by 'recency' meaning how recently they were checked out, but you can now sort by head commit date and alphabetically. Thanks to [@​hosaka](https://github.com/hosaka) for this feature. ##### Better bare repo support We have fixed a bunch of bugs relating to bare repos so if you had issues with them in the past it should work fine now. Thanks to [@​jwhitley](https://github.com/jwhitley) for this feature. ##### Miscelleneous UI changes - Unstaged files are now shown in white, not red, which is easier on the eyes - Scrollbars are thinner (and, thus, cooler) - Keybindings menu now has section headers ([@​stefanhaller](https://github.com/stefanhaller)) - Error toasts now appear for some errors (less intrusive than popups) ([@​stefanhaller](https://github.com/stefanhaller)) - Search history is now retained ([@​karimkhaleel](https://github.com/karimkhaleel)) - Git log is shown by default ([@​stefanhaller](https://github.com/stefanhaller)) ##### More Breaking Changes 💥 - When you press 'g' to bring up the git reset menu, the 'mixed' option is now the first and default, rather than 'soft'. This is because 'mixed' is the most commonly used option. - Push/pull/fetch loading statuses are now shown against the branch rather than in a popup. This allows you to e.g. fetch multiple branches in parallel and see the status for each branch. - The git log graph in the commits view is now always shown by default (previously it was only shown when the view was maximised). If you find this too noisy, you can change it back via `ctrl+L` -> 'Show git graph' -> 'when maximised' - Filtering (e.g. when pressing '/') is less fuzzy by default; it only matches substrings now. Multiple substrings can be matched by separating them with spaces. If you want to revert to the old behavior, set the following in your config: ```yml gui: filterMode: 'fuzzy' ``` #### What's Changed ##### All Enhancements 🔥 - Add range selection ability on list contexts by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3207](https://github.com/jesseduffield/lazygit/pull/3207) - Allow deleting remote tags/branches from local tag/branch views by [@​AzraelSec](https://github.com/AzraelSec) in [https://github.com/jesseduffield/lazygit/pull/2738](https://github.com/jesseduffield/lazygit/pull/2738) - Add command to show divergence from upstream by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2871](https://github.com/jesseduffield/lazygit/pull/2871) - Add 'Quick start interactive rebase' action by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3213](https://github.com/jesseduffield/lazygit/pull/3213) - Add command to open git difftool by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3156](https://github.com/jesseduffield/lazygit/pull/3156) - Support editing files in existing neovim instance by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/2916](https://github.com/jesseduffield/lazygit/pull/2916) - Show commit mark before showing extra info by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/2928](https://github.com/jesseduffield/lazygit/pull/2928) - Jump to middle of the view when selection leaves the visible area by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2915](https://github.com/jesseduffield/lazygit/pull/2915) - Add emacs-keybinds for word navigation by [@​horriblename](https://github.com/horriblename) in [https://github.com/jesseduffield/lazygit/pull/2935](https://github.com/jesseduffield/lazygit/pull/2935) - Add `gui.scrollOffBehavior` config for scrolling list views by half-pages by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2939](https://github.com/jesseduffield/lazygit/pull/2939) - Switch to editor from commit message panel by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2881](https://github.com/jesseduffield/lazygit/pull/2881) - Select same commit again after pressing "e" to edit a commit by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2954](https://github.com/jesseduffield/lazygit/pull/2954) - Support custom keybindings for confirm discard by [@​mskelton](https://github.com/mskelton) in [https://github.com/jesseduffield/lazygit/pull/2960](https://github.com/jesseduffield/lazygit/pull/2960) - Allow adding a port to webDomain part of services config by [@​raidora](https://github.com/raidora) in [https://github.com/jesseduffield/lazygit/pull/2908](https://github.com/jesseduffield/lazygit/pull/2908) - Add icons for files with .mdx and .svelte file extensions by [@​hrstmr](https://github.com/hrstmr) in [https://github.com/jesseduffield/lazygit/pull/2889](https://github.com/jesseduffield/lazygit/pull/2889) - Section headers in keybindings menu by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2911](https://github.com/jesseduffield/lazygit/pull/2911) - Check for staged files for "Amend commit" and "Create fixup commit" by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2970](https://github.com/jesseduffield/lazygit/pull/2970) - Add support for external diff commands (e.g. difftastic) by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2868](https://github.com/jesseduffield/lazygit/pull/2868) - Save diff context size in state.yml instead of config.yml by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2969](https://github.com/jesseduffield/lazygit/pull/2969) - Support to reset the current branch to a selected branch upstream by [@​AzraelSec](https://github.com/AzraelSec) in [https://github.com/jesseduffield/lazygit/pull/2940](https://github.com/jesseduffield/lazygit/pull/2940) - Replace whitespace with '-' when renaming a branch by [@​calthejuggler](https://github.com/calthejuggler) in [https://github.com/jesseduffield/lazygit/pull/2990](https://github.com/jesseduffield/lazygit/pull/2990) - Add jump-to-panel label config setting by [@​MariaSolOs](https://github.com/MariaSolOs) in [https://github.com/jesseduffield/lazygit/pull/2993](https://github.com/jesseduffield/lazygit/pull/2993) - Add co-author to commits by [@​omaussa](https://github.com/omaussa) in [https://github.com/jesseduffield/lazygit/pull/2912](https://github.com/jesseduffield/lazygit/pull/2912) - Change the default of the "gui.borders" config to "rounded" by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2998](https://github.com/jesseduffield/lazygit/pull/2998) - Add a DisabledReason mechanism for menu items and keybindings by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2992](https://github.com/jesseduffield/lazygit/pull/2992) - Allow cherry-picking commits during a rebase by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3013](https://github.com/jesseduffield/lazygit/pull/3013) - Add history for search view by [@​karimkhaleel](https://github.com/karimkhaleel) in [https://github.com/jesseduffield/lazygit/pull/2877](https://github.com/jesseduffield/lazygit/pull/2877) - Replace loader panels with waiting status (pull/push/fetch) by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2973](https://github.com/jesseduffield/lazygit/pull/2973) - Add menu to rebase onto selected branch remote upstream by [@​AzraelSec](https://github.com/AzraelSec) in [https://github.com/jesseduffield/lazygit/pull/3020](https://github.com/jesseduffield/lazygit/pull/3020) - Add ability to force portrait mode by [@​ldelossa](https://github.com/ldelossa) in [https://github.com/jesseduffield/lazygit/pull/3037](https://github.com/jesseduffield/lazygit/pull/3037) - Add Micro editor preset by [@​kytta](https://github.com/kytta) in [https://github.com/jesseduffield/lazygit/pull/3049](https://github.com/jesseduffield/lazygit/pull/3049) - Show sync status in branches list by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3021](https://github.com/jesseduffield/lazygit/pull/3021) - Add 'lvim' editor preset for lunarvim by [@​zottelsheep](https://github.com/zottelsheep) in [https://github.com/jesseduffield/lazygit/pull/3074](https://github.com/jesseduffield/lazygit/pull/3074) - Truncate branch names to make branch status always visible by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3075](https://github.com/jesseduffield/lazygit/pull/3075) - Color file icons by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3080](https://github.com/jesseduffield/lazygit/pull/3080) - Add UserConfig jsonschema generation script by [@​karimkhaleel](https://github.com/karimkhaleel) in [https://github.com/jesseduffield/lazygit/pull/3039](https://github.com/jesseduffield/lazygit/pull/3039) - Add a copy-to-clipboard menu to the file view (with `diff` copy options) by [@​AzraelSec](https://github.com/AzraelSec) in [https://github.com/jesseduffield/lazygit/pull/3104](https://github.com/jesseduffield/lazygit/pull/3104) - Fix bottom line alignment by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3076](https://github.com/jesseduffield/lazygit/pull/3076) - Make move up/down blocking by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2966](https://github.com/jesseduffield/lazygit/pull/2966) - Add remote branch sorting menu by [@​hosaka](https://github.com/hosaka) in [https://github.com/jesseduffield/lazygit/pull/3171](https://github.com/jesseduffield/lazygit/pull/3171) - Add age to stash entries by [@​AzraelSec](https://github.com/AzraelSec) in [https://github.com/jesseduffield/lazygit/pull/3174](https://github.com/jesseduffield/lazygit/pull/3174) - Add local branch sorting menu by [@​hosaka](https://github.com/hosaka) in [https://github.com/jesseduffield/lazygit/pull/3182](https://github.com/jesseduffield/lazygit/pull/3182) - Show a friendly error message when starting lazygit from a non-existent cwd by [@​simonwhitaker](https://github.com/simonwhitaker) in [https://github.com/jesseduffield/lazygit/pull/3192](https://github.com/jesseduffield/lazygit/pull/3192) - Replace copy commit SHA with copy commit subject on the y s keybind in the commits view by [@​karimkhaleel](https://github.com/karimkhaleel) in [https://github.com/jesseduffield/lazygit/pull/3188](https://github.com/jesseduffield/lazygit/pull/3188) - Add config setting for splitting window vertically in half screen mode by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3133](https://github.com/jesseduffield/lazygit/pull/3133) - Add command to find base commit for creating a fixup by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3105](https://github.com/jesseduffield/lazygit/pull/3105) - Show Toast instead of error panel when invoking a disabled command by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3180](https://github.com/jesseduffield/lazygit/pull/3180) - Show file names in default colour by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3081](https://github.com/jesseduffield/lazygit/pull/3081) - Add config setting to suppress showing file icons by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3216](https://github.com/jesseduffield/lazygit/pull/3216) - Support range select for rebase actions by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3232](https://github.com/jesseduffield/lazygit/pull/3232) - Make range selections created with the mouse non-sticky by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3234](https://github.com/jesseduffield/lazygit/pull/3234) - Support range select for staging/discarding files by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3248](https://github.com/jesseduffield/lazygit/pull/3248) - Inline status for fetching remotes by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3238](https://github.com/jesseduffield/lazygit/pull/3238) - Add shortcuts for filtering files by status by [@​mark2185](https://github.com/mark2185) in [https://github.com/jesseduffield/lazygit/pull/3137](https://github.com/jesseduffield/lazygit/pull/3137) - Keep same selection range when quick-starting an interactive rebase by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3247](https://github.com/jesseduffield/lazygit/pull/3247) - Add loads of tooltips by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3269](https://github.com/jesseduffield/lazygit/pull/3269) - Show better keybinding suggestions by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3203](https://github.com/jesseduffield/lazygit/pull/3203) - Support selecting file range in patch builder by [@​afhoffman](https://github.com/afhoffman) in [https://github.com/jesseduffield/lazygit/pull/3259](https://github.com/jesseduffield/lazygit/pull/3259) - Add command to squash all fixups in the current branch by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3274](https://github.com/jesseduffield/lazygit/pull/3274) - Use slimmer scrollbars by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3283](https://github.com/jesseduffield/lazygit/pull/3283) - Clear cherry-picked commits after pasting by [@​molejnik88](https://github.com/molejnik88) in [https://github.com/jesseduffield/lazygit/pull/3240](https://github.com/jesseduffield/lazygit/pull/3240) - Change default of git.log.showGraph to 'always' by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3314](https://github.com/jesseduffield/lazygit/pull/3314) - Support range select removing files from a commit by [@​afhoffman](https://github.com/afhoffman) in [https://github.com/jesseduffield/lazygit/pull/3276](https://github.com/jesseduffield/lazygit/pull/3276) - Migrate git.log.showGraph and git.log.order to app state by [@​hosaka](https://github.com/hosaka) in [https://github.com/jesseduffield/lazygit/pull/3197](https://github.com/jesseduffield/lazygit/pull/3197) - Change "git reset" default to --mixed by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3264](https://github.com/jesseduffield/lazygit/pull/3264) - Add author filtering to commit view by [@​part22](https://github.com/part22) in [https://github.com/jesseduffield/lazygit/pull/3302](https://github.com/jesseduffield/lazygit/pull/3302) - Provide two helix presets, one for "helix" and one for "hx" by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3346](https://github.com/jesseduffield/lazygit/pull/3346) - Don't show branch head on rebase todos if the rebase.updateRefs config is on by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3340](https://github.com/jesseduffield/lazygit/pull/3340) - Show all submodules recursively by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3341](https://github.com/jesseduffield/lazygit/pull/3341) - Support setting a range of commits to "edit" outside of a rebase by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3370](https://github.com/jesseduffield/lazygit/pull/3370) - Adjust selection after squashing fixups by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3338](https://github.com/jesseduffield/lazygit/pull/3338) - Auto-wrap commit message while typing by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3173](https://github.com/jesseduffield/lazygit/pull/3173) - Add Co-Author support to new commits by [@​2KAbhishek](https://github.com/2KAbhishek) in [https://github.com/jesseduffield/lazygit/pull/3097](https://github.com/jesseduffield/lazygit/pull/3097) - Show "breaking changes" message at startup by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3377](https://github.com/jesseduffield/lazygit/pull/3377) - Allow moving and deleting update-ref todos by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3391](https://github.com/jesseduffield/lazygit/pull/3391) - When checking out a remote branch by name, ask the user how by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3388](https://github.com/jesseduffield/lazygit/pull/3388) - Use substring filtering instead of fuzzy filtering by default by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3376](https://github.com/jesseduffield/lazygit/pull/3376) - Always prompt to return from subprocess if there was an error by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3410](https://github.com/jesseduffield/lazygit/pull/3410) - When adding a new remote, select it and fetch it by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3401](https://github.com/jesseduffield/lazygit/pull/3401) - Support editing multiple files at once using range selection by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3407](https://github.com/jesseduffield/lazygit/pull/3407) - Make it easy to create "amend!" commits by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3409](https://github.com/jesseduffield/lazygit/pull/3409) - Add config to truncate commit hashes when copying them to the clipboard by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3402](https://github.com/jesseduffield/lazygit/pull/3402) ##### Fixes 🔧 - Fix issue where explosion effect was out-of-view by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/2909](https://github.com/jesseduffield/lazygit/pull/2909) - Show dialogue when attempting to open info link fails by [@​simonwhitaker](https://github.com/simonwhitaker) in [https://github.com/jesseduffield/lazygit/pull/2899](https://github.com/jesseduffield/lazygit/pull/2899) - Fix jumping to the correct line from the staging view by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2919](https://github.com/jesseduffield/lazygit/pull/2919) - Fix sha colors when rebasing by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2946](https://github.com/jesseduffield/lazygit/pull/2946) - Fix the commit graph display after selection jumps in commits view by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2943](https://github.com/jesseduffield/lazygit/pull/2943) - Handle trailing slash in worktree path by [@​Krismix1](https://github.com/Krismix1) in [https://github.com/jesseduffield/lazygit/pull/2947](https://github.com/jesseduffield/lazygit/pull/2947) - Fix escape not cancelling filter mode, but closing the menu instead by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2977](https://github.com/jesseduffield/lazygit/pull/2977) - Use `Error` method to handle commits url copy from unknown service by [@​AzraelSec](https://github.com/AzraelSec) in [https://github.com/jesseduffield/lazygit/pull/3007](https://github.com/jesseduffield/lazygit/pull/3007) - Hide waiting status during credentials prompt by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3016](https://github.com/jesseduffield/lazygit/pull/3016) - Use upstream branch when opening pull requests by [@​mark2185](https://github.com/mark2185) in [https://github.com/jesseduffield/lazygit/pull/2693](https://github.com/jesseduffield/lazygit/pull/2693) - Fix issue where active search inappropriately changed selected line by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3022](https://github.com/jesseduffield/lazygit/pull/3022) - Respect $GIT_WORK_TREE and $GIT_DIR env vars (fix [#​3010](https://github.com/jesseduffield/lazygit/issues/3010)). by [@​intrntbrn](https://github.com/intrntbrn) in [https://github.com/jesseduffield/lazygit/pull/3024](https://github.com/jesseduffield/lazygit/pull/3024) - Fix crash when trying to filter the list of remotes by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3059](https://github.com/jesseduffield/lazygit/pull/3059) - Re-apply filter when model changes by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3058](https://github.com/jesseduffield/lazygit/pull/3058) - Use a PTY when calling external diff command by [@​AFutureD](https://github.com/AFutureD) in [https://github.com/jesseduffield/lazygit/pull/3120](https://github.com/jesseduffield/lazygit/pull/3120) - Re-enable 'Unset upstream' option when upstream branch is missing by [@​mark2185](https://github.com/mark2185) in [https://github.com/jesseduffield/lazygit/pull/3086](https://github.com/jesseduffield/lazygit/pull/3086) - Fall back to WithWaitingStatus if item is not visible by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3083](https://github.com/jesseduffield/lazygit/pull/3083) - Fix checking out a tag when there is a branch with the same name by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3179](https://github.com/jesseduffield/lazygit/pull/3179) - Fix preserving the commit message when description contains blank lines by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3170](https://github.com/jesseduffield/lazygit/pull/3170) - Allow multiple fetch commands (or fetch and pull) to run concurrently by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3202](https://github.com/jesseduffield/lazygit/pull/3202) - Support insteadOf URL rewriting when opening URLs in browser by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3177](https://github.com/jesseduffield/lazygit/pull/3177) - Fix keybindings for characters involving AltGr on Windows by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3194](https://github.com/jesseduffield/lazygit/pull/3194) - Do not include keybindings from another view in keybindings menu by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3220](https://github.com/jesseduffield/lazygit/pull/3220) - Fix crash with short branch names by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3219](https://github.com/jesseduffield/lazygit/pull/3219) - Keep same branch selected when fetching a branch while sorted by date by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3186](https://github.com/jesseduffield/lazygit/pull/3186) - Use git rev-parse to obtain repository and worktree paths by [@​jwhitley](https://github.com/jwhitley) in [https://github.com/jesseduffield/lazygit/pull/3183](https://github.com/jesseduffield/lazygit/pull/3183) - Pass absolute file paths to all editor commands by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3255](https://github.com/jesseduffield/lazygit/pull/3255) - Disallow cherry-picking merge commits by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3316](https://github.com/jesseduffield/lazygit/pull/3316) - Fix two problems related to update-ref rebase todo items by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3290](https://github.com/jesseduffield/lazygit/pull/3290) - Fix order of custom commands history by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3286](https://github.com/jesseduffield/lazygit/pull/3286) - Fix some problems with patches if `git diff` was customized with config (e.g. `external` or `noprefix`). by [@​mricherzhagen](https://github.com/mricherzhagen) in [https://github.com/jesseduffield/lazygit/pull/3222](https://github.com/jesseduffield/lazygit/pull/3222) - Use $XDG_STATE_HOME for state.yml by [@​horriblename](https://github.com/horriblename) in [https://github.com/jesseduffield/lazygit/pull/2936](https://github.com/jesseduffield/lazygit/pull/2936) - Fix display of Chinese characters on Windows by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3352](https://github.com/jesseduffield/lazygit/pull/3352) - Allow more than one argument in git.merging.args config by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3336](https://github.com/jesseduffield/lazygit/pull/3336) - Don't strike out reserved keys in menus by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3365](https://github.com/jesseduffield/lazygit/pull/3365) - Don't ask to force-push if the remote rejected updates by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3387](https://github.com/jesseduffield/lazygit/pull/3387) - Fix container detection by [@​aritmos](https://github.com/aritmos) in [https://github.com/jesseduffield/lazygit/pull/3412](https://github.com/jesseduffield/lazygit/pull/3412) ##### Maintenance ⚙️ - Add Click() to GuiDriver by [@​simonwhitaker](https://github.com/simonwhitaker) in [https://github.com/jesseduffield/lazygit/pull/2898](https://github.com/jesseduffield/lazygit/pull/2898) - Add Makefile by [@​kyu08](https://github.com/kyu08) in [https://github.com/jesseduffield/lazygit/pull/2937](https://github.com/jesseduffield/lazygit/pull/2937) - fix GitHub Actions warnings by [@​kyu08](https://github.com/kyu08) in [https://github.com/jesseduffield/lazygit/pull/2950](https://github.com/jesseduffield/lazygit/pull/2950) - Add instruction in PR template to start PRs with an imperative by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/2967](https://github.com/jesseduffield/lazygit/pull/2967) - Don't show toasts when running integration tests by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/2975](https://github.com/jesseduffield/lazygit/pull/2975) - Various debugging improvements by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3000](https://github.com/jesseduffield/lazygit/pull/3000) - Rename `test/results` to `test/_results` by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3012](https://github.com/jesseduffield/lazygit/pull/3012) - Support passing -race flag to integration tests by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3019](https://github.com/jesseduffield/lazygit/pull/3019) - Improve debugging of integration tests by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3029](https://github.com/jesseduffield/lazygit/pull/3029) - Use go:generate for cheatsheet by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3035](https://github.com/jesseduffield/lazygit/pull/3035) - Change Makefile to build non-optimized by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3028](https://github.com/jesseduffield/lazygit/pull/3028) - Update PR template to use go generate command by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3041](https://github.com/jesseduffield/lazygit/pull/3041) - Band-aid fix for submodule/reset.go test failure by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3047](https://github.com/jesseduffield/lazygit/pull/3047) - Remove redundant `len` check by [@​Juneezee](https://github.com/Juneezee) in [https://github.com/jesseduffield/lazygit/pull/3051](https://github.com/jesseduffield/lazygit/pull/3051) - Add disabled compat for user config ([#​2833](https://github.com/jesseduffield/lazygit/issues/2833)) by [@​karimkhaleel](https://github.com/karimkhaleel) in [https://github.com/jesseduffield/lazygit/pull/3060](https://github.com/jesseduffield/lazygit/pull/3060) - Fix go.mod file by [@​stefanhaller](https://github.com/stefanhaller) in [https://github.com/jesseduffield/lazygit/pull/3118](https://github.com/jesseduffield/lazygit/pull/3118) - Capture test code coverage stats by [@​jesseduffield](https://github.com/jesseduffield) in [https://github.com/jesseduffield/lazygit/pull/3135](https://github.com/jesseduffield/lazygit/pull/3135) - fixed typo in test description by [@​schuebel](https://github.com/schuebel) in [https://github.com/jesseduffield/lazygit/pull/3101](https://github.com/jesseduffield/lazygit/pull/3101) - Update cheatsheets by [@​stefanhaller](https: </details> --- ### Configuration 📅 **Schedule**: Branch creation - "after 4pm on thursday" in timezone America/Los_Angeles, Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/scottames/dots). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjEuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9--> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: scottames-github-bot[bot] <162828115+scottames-github-bot[bot]@users.noreply.github.com>
A common issue I have is that I want to move a commit from the top of my branch all the way down to the first commit on the branch. To do that, I need to navigate down to the first commit on my branch, press 'e' to start an interactive rebase, then navigate back up to the top of the branch, then move my commit back down to the base. This is annoying.
Similarly annoying is moving the commit one-by-one without explicitly starting an interactive rebase, because then each individual step is its own rebase which takes a while in aggregate.
This PR allows you to press 'i' from the commits view to start an interactive rebase from an 'appropriate' base. By appropriate, we mean that we want to start from the HEAD and stop when we reach the first merge commit or commit on the main branch. This may end up including more commits than you need, but it doesn't make a difference.
go generate ./...
)docs/Config.md
) have been updated if necessary