diff --git a/autoload/fugitive.vim b/autoload/fugitive.vim index 53761dd..187baab 100644 --- a/autoload/fugitive.vim +++ b/autoload/fugitive.vim @@ -1407,6 +1407,7 @@ function! fugitive#BufReadStatus() abort let branch = head endif + let b:fugitive_status = {'Staged': {}, 'Unstaged': {}} let [staged, unstaged] = [[], []] let i = 0 while i < len(output) @@ -1422,13 +1423,22 @@ function! fugitive#BufReadStatus() abort let i += 1 endif if line[0] !~# '[ ?!#]' - call add(staged, {'type': 'File', 'status': line[0], 'filename': (line[0] =~# '[RC]' ? files : file)}) + call add(staged, {'type': 'File', 'status': line[0], 'filename': files}) + let b:fugitive_status['Staged'][files] = line[0] endif if line[1] !~# '[ !#]' - call add(unstaged, {'type': 'File', 'status': line[1], 'filename': (line[1] =~# '[RC]' ? files : file)}) + call add(unstaged, {'type': 'File', 'status': line[1], 'filename': files}) + let b:fugitive_status['Unstaged'][files] = line[1] endif endwhile + for dict in staged + let b:fugitive_status['Staged'][dict.filename] = dict.status + endfor + for dict in unstaged + let b:fugitive_status['Unstaged'][dict.filename] = dict.status + endfor + let config = fugitive#Config() let pull_type = 'Pull' @@ -2434,6 +2444,13 @@ function! s:StageDelete(lnum, count) abort catch /^fugitive:/ return 'echoerr v:errmsg' endtry + elseif a:count == 2 + call s:TreeChomp('checkout', '--ours', '--', info.paths[0]) + elseif a:count == 3 + call s:TreeChomp('checkout', '--theirs', '--', info.paths[0]) + elseif info.status =~# '[ADU]' && + \ get(b:fugitive_status[info.section ==# 'Staged' ? 'Unstaged' : 'Staged'], info.filename, '') =~# '[AU]' + call s:TreeChomp('checkout', info.section ==# 'Staged' ? '--ours' : '--theirs', '--', info.paths[0]) elseif info.status ==# 'U' call s:TreeChomp('rm', '--', info.paths[0]) elseif info.status ==# 'A' diff --git a/doc/fugitive.txt b/doc/fugitive.txt index 6417c59..7cbb088 100644 --- a/doc/fugitive.txt +++ b/doc/fugitive.txt @@ -259,7 +259,10 @@ u Unstage (reset) the file or hunk under the cursor. X Discard the change under the cursor. This uses `checkout` or `clean` under the hood. A command is echoed that shows how to undo the change. Consult - `:messages` to see it again. + `:messages` to see it again. You can use this during + a merge conflict do discard "our" changes (--theirs) + in the "Unstaged" section or discard "their" changes + (--ours) in the "Staged" section. *fugitive_=* = Toggle an inline diff of the file under the cursor.