mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-25 12:24:47 +02:00
To support this, we turn the confirmation prompt of the "Create fixup commit" command into a menu; creating a fixup commit is the first entry, so that "shift-F, enter" behaves the same as before. But there are additional entries for creating "amend!" commits, either with or without file changes. These make it easy to reword commit messages of existing commits.
78 lines
4.0 KiB
Markdown
78 lines
4.0 KiB
Markdown
# Fixup Commits
|
|
|
|
## Background
|
|
|
|
There's this common scenario that you have a PR in review, the reviewer is
|
|
requesting some changes, and you make those changes and would normally simply
|
|
squash them into the original commit that they came from. If you do that,
|
|
however, there's no way for the reviewer to see what you changed. You could just
|
|
make a separate commit with those changes at the end of the branch, but this is
|
|
not ideal because it results in a git history that is not very clean.
|
|
|
|
To help with this, git has a concept of fixup commits: you do make a separate
|
|
commit, but the subject of this commit is the string "fixup! " followed by the
|
|
original commit subject. This both tells the reviewer what's going on (you are
|
|
making a change that you later will squash into the designated commit), and it
|
|
provides an easy way to actually perform this squash operation when you are
|
|
ready to do that (before merging).
|
|
|
|
## Creating fixup commits
|
|
|
|
You could of course create fixup commits manually by typing in the commit
|
|
message with the prefix yourself. But lazygit has an easier way to do that:
|
|
in the Commits view, select the commit that you want to create a fixup for, and
|
|
press shift-F (for "Create fixup commit for this commit"). This automatically
|
|
creates a commit with the appropriate subject line.
|
|
|
|
Don't confuse this with the lowercase "f" command ("Fixup commit"); that one
|
|
squashes the selected commit into its parent, this is not what we want here.
|
|
|
|
## Creating amend commits
|
|
|
|
There's a special type of fixup commit that uses "amend!" instead of "fixup!" in
|
|
the commit message subject; in addition to fixing up the original commit with
|
|
changes it allows you to also (or only) change the commit message of the
|
|
original commit. The menu that appears when pressing shift-F has options for
|
|
both of these; they bring up a commit message panel similar to when you reword a
|
|
commit, but then create the "amend!" commit containing the new message. Note
|
|
that in that panel you only type the new message as you want it to be
|
|
eventually; lazygit then takes care of formatting the "amend!" commit
|
|
appropriately for you (with the subject of your new message moving into the body
|
|
of the "amend!" commit).
|
|
|
|
## Squashing fixup commits
|
|
|
|
When you're ready to merge the branch and want to squash all these fixup commits
|
|
that you created, that's very easy to do: select the first commit of your branch
|
|
and hit shift-S (for "Squash all 'fixup!' commits above selected commit
|
|
(autosquash)"). Boom, done.
|
|
|
|
## Finding the commit to create a fixup for
|
|
|
|
When you are making changes to code that you changed earlier in a long branch,
|
|
it can be tedious to find the commit to squash it into. Lazygit has a command to
|
|
help you with this, too: in the Files view, press ctrl-f to select the right
|
|
base commit in the Commits view automatically. From there, you can either press
|
|
shift-F to create a fixup commit for it, or shift-A to amend your changes into
|
|
the commit if you haven't published your branch yet.
|
|
|
|
This command works in many cases, and when it does it almost feels like magic,
|
|
but it's important to understand its limitations because it doesn't always work.
|
|
The way it works is that it looks at the deleted lines of your current
|
|
modifications, blames them to find out which commit those lines come from, and
|
|
if they all come from the same commit, it selects it. So here are cases where it
|
|
doesn't work:
|
|
|
|
- Your current diff has only added lines, but no deleted lines. In this case
|
|
there's no way for lazygit to know which commit you want to add them to.
|
|
- The deleted lines belong to multiple different commits. In this case you can
|
|
help lazygit by staging a set of files or hunks that all belong to the same
|
|
commit; if some changes are staged, the ctrl-f command works only on those.
|
|
- The found commit is already on master; in this case, lazygit refuses to select
|
|
it, because it doesn't make sense to create fixups for it, let alone amend to
|
|
it.
|
|
|
|
To sum it up: the command works great if you are changing code again that you
|
|
changed or added earlier in the same branch. This is a common enough case to
|
|
make the command useful.
|