Skip to content
  • Duy Nguyen's avatar
    unpack-trees: fix oneway_merge accidentally carry over stage index · ab5af825
    Duy Nguyen authored and Junio C Hamano's avatar Junio C Hamano committed
    Phillip found out that 'git checkout -f <branch>' does not restore
    conflict/unmerged files correctly. All tracked files should be taken
    from <branch> and all non-zero stages removed. Most of this is true,
    except that the final file could be in stage one instead of zero.
    
    "checkout -f" (among other commands) does this with one-way merge, which
    is supposed to take stat info from the index and everything else from
    the given tree. The add_entry(.., old, ...) call in oneway_merge()
    though will keep stage index from the index.
    
    This is normally not a problem if the entry from the index is
    normal (stage #0). But if there is a conflict, stage #0 does not exist
    and we'll get stage #1 entry as "old" variable, which gets recorded in
    the final index. Fix it by clearing stage mask.
    
    This bug probably comes from b5b42507
    
     (git-read-tree: make one-way
    merge also honor the "update" flag, 2005-06-07). Before this commit, we
    may create the final ("dst") index entry from the one in index, but we
    do clear CE_STAGEMASK.
    
    I briefly checked two- and three-way merge functions. I think we don't
    have the same problem in those.
    
    Reported-by: default avatarPhillip Wood <phillip.wood@dunelm.org.uk>
    Signed-off-by: default avatarNguyễn Thái Ngọc Duy <pclouds@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    ab5af825