git commit --fixup and git rebase -i --autosquash
It’s not unusual that I need to fix previous commits up when working on a branch or in the review phase. Until now I used a regular commit with some special marker to remember which commit to squash it with and then git rebase -i to reorder the patches and squash the fixup commits with their corresponding “parent” commits.
Turns out, git can handle quite a few of those manual manipulations for you. git commit –fixup <commit>
allows you to commit work, marking it as a fixup of a previous commit. git rebase -i –autosquash
will then present the usual git rebase -i
screen but with the fixup commits moved just after their parents and ready to be squashed without any extra manipulation.
For instance, I had a couple of changes to a commit buried 100 patches away from HEAD
(yes, a big topic branch!):
$ git diffAnd I wanted to squash those changes with commit
diff –git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 29f3813..08ea851 100644
— a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2695,6 +2695,11 @@ static void skylake_update_primary_plane(struct drm_crtc crtc,
intel_fb = to_intel_framebuffer(fb);
obj = intel_fb->obj;
+
+ /
+ * The stride is expressed either as a multiple of 64 bytes chunks for
+ * linear buffers or in number of tiles for tiled buffers.
+ */
switch (obj->tiling_mode) {
case I915_TILING_NONE:
stride = fb->pitches[0] >> 6;
@@ -2707,7 +2712,6 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc,
BUG();
}
- plane_ctl &= ~PLANE_CTL_TRICKLE_FEED_DISABLE;
plane_ctl |= PLANE_CTL_PLANE_GAMMA_DISABLE;
I915_WRITE(PLANE_CTL(pipe, 0), plane_ctl);
2021785
$ git commit -a –fixup 2021785git will then go ahead and create a new commit with the subject taken from the referenced commit and prefixed with
fixup!
commit d2d278ffbe87d232369b028d0c9ee9e6ecd0ba20Then when using the interactive rebase with autosquash:
Author: Damien Lespiau <damien.lespiau@intel.com>
Date: Sat Sep 20 11:09:15 2014 +0100
fixup! drm/i915/skl: Implement thew new update_plane() for primary planes
$ git rebase -i –autosquash drm-intel/drm-intel-nightlyThe fixup will be next after the reference commit
pick 2021785 drm/i915/skl: Implement thew new update_plane() for primary planesvalidating the proposed change (by in my case leaving vim) will squash the fixup commits. Definitely what I’ll be using from now on!
fixup d2d278ff fixup! drm/i915/skl: Implement thew new update_plane() for primary planes
Oh, and there’s a config option to have git rebase automatically autosquash if there are some fixup commits:
$ git config –global rebase.autosquash true