@@ -8,7 +8,7 @@ use git2::build::CheckoutBuilder;
88use gitbutler_branch_actions:: internal:: list_virtual_branches;
99use gitbutler_branch_actions:: { update_workspace_commit, RemoteBranchFile } ;
1010use gitbutler_cherry_pick:: { ConflictedTreeKey , RepositoryExt as _} ;
11- use gitbutler_command_context:: CommandContext ;
11+ use gitbutler_command_context:: { gix_repository_for_merging , CommandContext } ;
1212use gitbutler_commit:: {
1313 commit_ext:: CommitExt ,
1414 commit_headers:: { CommitHeadersV2 , HasCommitHeaders } ,
@@ -18,6 +18,7 @@ use gitbutler_operating_modes::{
1818 operating_mode, read_edit_mode_metadata, write_edit_mode_metadata, EditModeMetadata ,
1919 OperatingMode , EDIT_BRANCH_REF , WORKSPACE_BRANCH_REF ,
2020} ;
21+ use gitbutler_oxidize:: { git2_to_gix_object_id, gix_to_git2_index, GixRepositoryExt } ;
2122use gitbutler_project:: access:: { WorktreeReadPermission , WorktreeWritePermission } ;
2223use gitbutler_reference:: { ReferenceName , Refname } ;
2324use gitbutler_repo:: { rebase:: cherry_rebase, RepositoryExt } ;
@@ -53,17 +54,27 @@ fn get_commit_index(repository: &git2::Repository, commit: &git2::Commit) -> Res
5354 . find_tree ( theirs. id ( ) )
5455 . context ( "Failed to find base tree" ) ?;
5556
56- let index = repository
57- . merge_trees ( & base, & ours, & theirs, None )
58- . context ( "Failed to merge trees" ) ?;
59-
60- Ok ( index)
57+ let gix_repo = gix_repository_for_merging ( repository. path ( ) ) ?;
58+ // Merge without favoring a side this time to get a tree containing the actual conflicts.
59+ let mut merge_result = gix_repo. merge_trees (
60+ git2_to_gix_object_id ( base. id ( ) ) ,
61+ git2_to_gix_object_id ( ours. id ( ) ) ,
62+ git2_to_gix_object_id ( theirs. id ( ) ) ,
63+ gix_repo. default_merge_labels ( ) ,
64+ gix_repo. tree_merge_options ( ) ?,
65+ ) ?;
66+ let merged_tree_id = merge_result. tree . write ( ) ?;
67+ let mut index = gix_repo. index_from_tree ( & merged_tree_id) ?;
68+ if !merge_result. index_changed_after_applying_conflicts (
69+ & mut index,
70+ gix:: merge:: tree:: TreatAsUnresolved :: git ( ) ,
71+ ) {
72+ tracing:: warn!( "There must be an issue with conflict-commit creation as re-merging the conflicting trees didn't yield a conflicting index." ) ;
73+ }
74+ gix_to_git2_index ( & index)
6175 } else {
6276 let mut index = git2:: Index :: new ( ) ?;
63- index
64- . read_tree ( & commit_tree)
65- . context ( "Failed to set index tree" ) ?;
66-
77+ index. read_tree ( & commit_tree) ?;
6778 Ok ( index)
6879 }
6980}
0 commit comments