@@ -309,14 +309,15 @@ func (w *Worktree) ResetSparsely(opts *ResetOptions, dirs []string) error {
309
309
return err
310
310
}
311
311
312
+ var removedFiles []string
312
313
if opts .Mode == MixedReset || opts .Mode == MergeReset || opts .Mode == HardReset {
313
- if err : = w .resetIndex (t , dirs , opts .Files ); err != nil {
314
+ if removedFiles , err = w .resetIndex (t , dirs , opts .Files ); err != nil {
314
315
return err
315
316
}
316
317
}
317
318
318
319
if opts .Mode == MergeReset || opts .Mode == HardReset {
319
- if err := w .resetWorktree (t , opts . Files ); err != nil {
320
+ if err := w .resetWorktree (t , removedFiles ); err != nil {
320
321
return err
321
322
}
322
323
}
@@ -369,23 +370,24 @@ func (w *Worktree) Reset(opts *ResetOptions) error {
369
370
return w .ResetSparsely (opts , nil )
370
371
}
371
372
372
- func (w * Worktree ) resetIndex (t * object.Tree , dirs []string , files []string ) error {
373
+ func (w * Worktree ) resetIndex (t * object.Tree , dirs []string , files []string ) ([] string , error ) {
373
374
idx , err := w .r .Storer .Index ()
374
375
if err != nil {
375
- return err
376
+ return nil , err
376
377
}
377
378
378
379
b := newIndexBuilder (idx )
379
380
380
381
changes , err := w .diffTreeWithStaging (t , true )
381
382
if err != nil {
382
- return err
383
+ return nil , err
383
384
}
384
385
386
+ var removedFiles []string
385
387
for _ , ch := range changes {
386
388
a , err := ch .Action ()
387
389
if err != nil {
388
- return err
390
+ return nil , err
389
391
}
390
392
391
393
var name string
@@ -396,7 +398,7 @@ func (w *Worktree) resetIndex(t *object.Tree, dirs []string, files []string) err
396
398
name = ch .To .String ()
397
399
e , err = t .FindEntry (name )
398
400
if err != nil {
399
- return err
401
+ return nil , err
400
402
}
401
403
case merkletrie .Delete :
402
404
name = ch .From .String ()
@@ -410,6 +412,7 @@ func (w *Worktree) resetIndex(t *object.Tree, dirs []string, files []string) err
410
412
}
411
413
412
414
b .Remove (name )
415
+ removedFiles = append (removedFiles , name )
413
416
if e == nil {
414
417
continue
415
418
}
@@ -428,7 +431,7 @@ func (w *Worktree) resetIndex(t *object.Tree, dirs []string, files []string) err
428
431
idx .SkipUnless (dirs )
429
432
}
430
433
431
- return w .r .Storer .SetIndex (idx )
434
+ return removedFiles , w .r .Storer .SetIndex (idx )
432
435
}
433
436
434
437
func inFiles (files []string , v string ) bool {
@@ -454,6 +457,11 @@ func (w *Worktree) resetWorktree(t *object.Tree, files []string) error {
454
457
}
455
458
b := newIndexBuilder (idx )
456
459
460
+ status , err := w .Status ()
461
+ if err != nil {
462
+ return err
463
+ }
464
+
457
465
for _ , ch := range changes {
458
466
if err := w .validChange (ch ); err != nil {
459
467
return err
@@ -477,8 +485,13 @@ func (w *Worktree) resetWorktree(t *object.Tree, files []string) error {
477
485
}
478
486
}
479
487
480
- if err := w .checkoutChange (ch , t , b ); err != nil {
481
- return err
488
+ // only checkout an untracked file if it is in the list of files
489
+ // a reset should leave untracked files alone
490
+ file := nameFromAction (& ch )
491
+ if status .File (file ).Worktree != Untracked || inFiles (files , file ) {
492
+ if err := w .checkoutChange (ch , t , b ); err != nil {
493
+ return err
494
+ }
482
495
}
483
496
}
484
497
0 commit comments