Keep the last conflict file selected after resolution

When there is a single conflicting file left to be resolved, lazygit
dismisses the conflicted-files-only filter when the file no longer has
conflict markers. However, the selection moved to the top, which is
annoying because very often it is useful to look at that file's
resulting diff once more to confirm that conflicts were resolved
correctly, and finding it again can be cumbersome when there are many
changed files. So keep it selected.

Of course, this only helps for the last (or only) conflicted files; when
there are multiple, a resolved file disappears from the panel until all
are resolved, which makes it hard to double-check the resulting diffs.
Doing it afterwards is not easy because you'd have to remember which
files were conflicting. This needs a different solution, but for the
special case of only a single conflicting file this is already a big
improvement.
This commit is contained in:
Stefan Haller 2026-08-14 18:43:41 +02:00
parent 4e2a1cd5b0
commit 39513d244d
5 changed files with 16 additions and 13 deletions

View file

@ -1413,7 +1413,7 @@ func (self *RefreshHelper) refreshStateFiles(captured capturedFilesState, env re
self.c.Contexts().Files.GetView().Subtitle = self.c.Tr.FilterLabelConflictingFiles self.c.Contexts().Files.GetView().Subtitle = self.c.Tr.FilterLabelConflictingFiles
} }
} else if conflictFileCount == 0 && fileTreeViewModel.GetStatusFilter() == filetree.DisplayConflicted { } else if conflictFileCount == 0 && fileTreeViewModel.GetStatusFilter() == filetree.DisplayConflicted {
fileTreeViewModel.SetStatusFilter(filetree.DisplayAll) fileTreeViewModel.SetStatusFilterPreservingSelection(filetree.DisplayAll)
self.c.Contexts().Files.GetView().Subtitle = "" self.c.Contexts().Files.GetView().Subtitle = ""
} }

View file

@ -75,8 +75,8 @@ var RebaseConflictsFixBuildErrorsWithOutOfDateSubmodule = NewIntegrationTest(New
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals("▼ /").IsSelected(), Equals("▼ /"),
Equals(" MM file"), Equals(" MM file").IsSelected(),
Equals(" M submodule (submodule)"), Equals(" M submodule (submodule)"),
Equals(" ?? untracked-file"), Equals(" ?? untracked-file"),
) )
@ -90,8 +90,8 @@ var RebaseConflictsFixBuildErrorsWithOutOfDateSubmodule = NewIntegrationTest(New
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals("▼ /").IsSelected(), Equals("▼ /"),
Equals(" M submodule (submodule)"), Equals(" M submodule (submodule)").IsSelected(),
Equals(" ?? untracked-file"), Equals(" ?? untracked-file"),
) )

View file

@ -34,6 +34,7 @@ var ResolveMultipleFiles = NewIntegrationTest(NewIntegrationTestArgs{
Contains("First Change"), Contains("First Change"),
Contains("======="), Contains("======="),
). ).
SelectNextItem().
PressPrimaryAction() PressPrimaryAction()
t.Views().Files(). t.Views().Files().
@ -47,12 +48,14 @@ var ResolveMultipleFiles = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().MergeConflicts(). t.Views().MergeConflicts().
IsFocused(). IsFocused().
SelectedLines( SelectedLines(
Contains("<<<<<<< HEAD"),
Contains("First Change"),
Contains("======="), Contains("======="),
Contains("Second Change"),
Contains(">>>>>>>"),
). ).
PressPrimaryAction() PressPrimaryAction()
t.Views().Files().SelectedLines(Contains("file2"))
t.Common().ContinueOnConflictsResolved("merge") t.Common().ContinueOnConflictsResolved("merge")
}, },
}) })

View file

@ -46,12 +46,12 @@ var DiscardVariousChangesRangeSelect = NewIntegrationTest(NewIntegrationTestArgs
Cancel() Cancel()
}). }).
Lines( Lines(
Equals("▼ /").IsSelected(), Equals("▼ /"),
Equals(" AM added-changed.txt"), Equals(" AM added-changed.txt"),
Equals(" MD change-delete.txt"), Equals(" MD change-delete.txt"),
Equals(" D delete-change.txt"), Equals(" D delete-change.txt"),
Equals(" D deleted-staged.txt"), Equals(" D deleted-staged.txt"),
Equals(" D deleted.txt"), Equals(" D deleted.txt").IsSelected(),
Equals(" MM double-modded.txt"), Equals(" MM double-modded.txt"),
Equals(" M modded-staged.txt"), Equals(" M modded-staged.txt"),
Equals(" M modded.txt"), Equals(" M modded.txt"),
@ -59,6 +59,7 @@ var DiscardVariousChangesRangeSelect = NewIntegrationTest(NewIntegrationTestArgs
Equals(" ?? new.txt"), Equals(" ?? new.txt"),
Equals(" R renamed.txt → renamed2.txt"), Equals(" R renamed.txt → renamed2.txt"),
). ).
NavigateToLine(Equals("▼ /")).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("renamed.txt")). NavigateToLine(Contains("renamed.txt")).
Press(keys.Universal.Remove). Press(keys.Universal.Remove).

View file

@ -83,11 +83,10 @@ var ApplyInReverseWithConflict = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Focus(). Focus().
Lines( Lines(
Equals("▼ /").IsSelected(), Equals("▼ /"),
Equals(" M file1"), Equals(" M file1").IsSelected(),
Equals(" M file2"), Equals(" M file2"),
). )
SelectNextItem()
t.Views().Main(). t.Views().Main().
ContainsLines( ContainsLines(