jesseduffield.lazygit/pkg/commands/git_commands
Stefan Haller e46dc1ead6 Use a better approach for determining pushed and merge statuses
Previously we would call git merge-base with the upstream branch to determine
where unpushed commits end and pushed commits start, and also git merge-base
with the main branch(es) to see where the merged commits start. This worked ok
in normal cases, but it had two problems:
- when filtering by path or by author, those merge-base commits would usually
not be part of the commit list, so we would miss the point where we should
switch from unpushed to pushed, or from pushed to merged. The consequence was
that in filtering mode, all commit hashes were always yellow.
- when main was merged into a feature branch, we would color all commits from
that merge on down in green, even ones that are only part of the feature branch
but not main.

To fix these problems, we switch our approach to one where we call git rev-list
with the branch in question, with negative refspecs for the upstream branch and
the main branches, respectively; this gives us the complete picture of which
commits are pushed/unpushed/merged, so it also works in the cases described
above.

And funnily, even though intuitively it feels more expensive, it actually
performs better than the merge-base calls (for normal usage scenarios at least),
so the commit-loading part of refresh is faster now in general. We are talking
about differences like 300ms before, 140ms after, in some unscientific
measurements I took (depends a lot on repo sizes, branch length, etc.). An
exception are degenerate cases like feature branches with hundreds of thousands
of commits, which are slower now; but I don't think we need to worry about those
too much.
2025-07-31 15:50:53 +02:00
..
bisect.go rename sha to hash 9, case: Sha 2024-04-12 08:33:47 +02:00
bisect_info.go rename sha to hash 2 2024-04-12 08:33:47 +02:00
blame.go Add command to find base commit for creating a fixup 2024-01-10 09:11:40 +01:00
branch.go Fix the CurrentBranchName function 2025-06-30 16:08:03 +02:00
branch_loader.go Move LocalBranchSortOrder and RemoteBranchSortOrder to user config 2025-07-09 13:15:03 +02:00
branch_loader_test.go Remove canUsePushTrack parameter of obtainBranches function 2025-04-09 10:40:52 +02:00
branch_test.go Allow deleting a range selection of branches 2024-12-01 10:59:54 +01:00
commit.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
commit_file_loader.go Rename Name to Path in File and CommitFile 2025-03-20 12:31:34 +01:00
commit_file_loader_test.go Rename Name to Path in File and CommitFile 2025-03-20 12:31:34 +01:00
commit_loader.go Use a better approach for determining pushed and merge statuses 2025-07-31 15:50:53 +02:00
commit_loader_test.go Use a better approach for determining pushed and merge statuses 2025-07-31 15:50:53 +02:00
commit_loading_shared.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
commit_test.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
common.go Remove sync mutex 2023-10-08 18:45:36 +02:00
config.go fix: Make tag operation use GPG helper to run signing in sub-process 2025-03-24 08:41:58 +01:00
custom.go Add runCommand function to Go template syntax 2025-04-09 10:44:36 +02:00
deps_test.go Enable revive linter, and fix a bunch of warnings 2025-06-30 19:13:20 +02:00
diff.go Move DiffContextSize and RenameSimilarityThreshold to user config 2025-07-09 13:15:03 +02:00
file.go Remove deprecated edit configs 2025-07-08 16:32:21 +02:00
file_loader.go Move DiffContextSize and RenameSimilarityThreshold to user config 2025-07-09 13:15:03 +02:00
file_loader_test.go Move DiffContextSize and RenameSimilarityThreshold to user config 2025-07-09 13:15:03 +02:00
file_test.go Remove deprecated edit configs 2025-07-08 16:32:21 +02:00
flow.go Remove ICmdObj interface 2025-05-01 15:21:37 +02:00
flow_test.go Remove redundant variable dedeclarations 2024-05-19 16:38:21 +10:00
git_command_builder.go Enable revive linter, and fix a bunch of warnings 2025-06-30 19:13:20 +02:00
git_command_builder_test.go Add worktree tests for removing/detaching 2023-07-30 18:35:23 +10:00
main_branches.go Cleanup: remove the ignoringWarnings hack from GetMergeBase 2025-07-31 15:21:34 +02:00
patch.go Use a better name for the auto-stash for moving a custom patch to index 2025-07-03 16:56:30 +02:00
rebase.go Remove git version specific code for versions we no longer support 2025-07-09 12:18:58 +02:00
rebase_test.go Fix --amend when the commit message is empty 2025-07-14 17:58:31 +02:00
reflog_commit_loader.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
reflog_commit_loader_test.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
remote.go Allow deleting a range selection of branches 2024-12-01 10:59:54 +01:00
remote_loader.go Move LocalBranchSortOrder and RemoteBranchSortOrder to user config 2025-07-09 13:15:03 +02:00
repo_paths.go Remove git version specific code for versions we no longer support 2025-07-09 12:18:58 +02:00
repo_paths_test.go Remove git version specific code for versions we no longer support 2025-07-09 12:18:58 +02:00
stash.go Move DiffContextSize and RenameSimilarityThreshold to user config 2025-07-09 13:15:03 +02:00
stash_loader.go Make stash filtering work when filtering on a folder 2025-07-27 12:03:06 +02:00
stash_loader_test.go Move NewDummyCommon to pkg/common 2025-05-06 09:43:26 +02:00
stash_test.go Move DiffContextSize and RenameSimilarityThreshold to user config 2025-07-09 13:15:03 +02:00
status.go Make WorkingTreeState a struct, and add cherry-picking and reverting states 2025-04-20 15:53:17 +02:00
submodule.go Enable revive linter, and fix a bunch of warnings 2025-06-30 19:13:20 +02:00
sync.go Remove git version specific code for versions we no longer support 2025-07-09 12:18:58 +02:00
sync_test.go Remove git version specific code for versions we no longer support 2025-07-09 12:18:58 +02:00
tag.go Use a different way to check if a tag is annotated 2025-07-28 10:53:51 +02:00
tag_loader.go Revert "Add IsAnnotated field to models.Tag struct" 2025-07-28 10:53:51 +02:00
tag_loader_test.go Revert "Add IsAnnotated field to models.Tag struct" 2025-07-28 10:53:51 +02:00
version.go Add a method GitVersion.IsAtLeast 2024-01-10 09:18:38 +01:00
version_test.go Add a method GitVersion.IsAtLeast 2024-01-10 09:18:38 +01:00
working_tree.go Stage only tracked files when staging all in filter-by-tracked-files view 2025-07-28 14:10:38 +02:00
working_tree_test.go Move DiffContextSize and RenameSimilarityThreshold to user config 2025-07-09 13:15:03 +02:00
worktree.go Centralise logic for obtaining repo paths 2023-07-30 18:35:24 +10:00
worktree_loader.go Remove git version specific code for versions we no longer support 2025-07-09 12:18:58 +02:00
worktree_loader_test.go Remove git version specific code for versions we no longer support 2025-07-09 12:18:58 +02:00