From e40ca4bbe014c0d06fbc5bcd1d3aecc356189be3 Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 30 May 2025 09:43:45 +0800 Subject: [PATCH] refactor: use `git restore` instead of `git reset` to unstage local changes (#1373) Signed-off-by: leo --- src/Commands/Discard.cs | 2 +- src/Commands/Restore.cs | 8 ++++++-- src/ViewModels/WorkingCopy.cs | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Commands/Discard.cs b/src/Commands/Discard.cs index e61fe1e6..f245799c 100644 --- a/src/Commands/Discard.cs +++ b/src/Commands/Discard.cs @@ -36,7 +36,7 @@ namespace SourceGit.Commands }); } - new Restore(repo) { Log = log }.Exec(); + new Restore(repo, false) { Log = log }.Exec(); if (includeIgnored) new Clean(repo) { Log = log }.Exec(); } diff --git a/src/Commands/Restore.cs b/src/Commands/Restore.cs index 7a363543..7f42ab91 100644 --- a/src/Commands/Restore.cs +++ b/src/Commands/Restore.cs @@ -5,11 +5,15 @@ namespace SourceGit.Commands { public class Restore : Command { - public Restore(string repo) + public Restore(string repo, bool onlyStaged) { WorkingDirectory = repo; Context = repo; - Args = "restore . --source=HEAD --staged --worktree --recurse-submodules"; + + if (onlyStaged) + Args = "restore --source=HEAD --staged ."; + else + Args = "restore --source=HEAD --staged --worktree --recurse-submodules ."; } public Restore(string repo, List files, string extra) diff --git a/src/ViewModels/WorkingCopy.cs b/src/ViewModels/WorkingCopy.cs index c60016cd..eb0e1e51 100644 --- a/src/ViewModels/WorkingCopy.cs +++ b/src/ViewModels/WorkingCopy.cs @@ -1664,14 +1664,18 @@ namespace SourceGit.ViewModels } else if (count == _staged.Count) { - await Task.Run(() => new Commands.Reset(_repo.FullPath).Use(log).Exec()); + await Task.Run(() => new Commands.Restore(_repo.FullPath, true).Use(log).Exec()); } else { for (int i = 0; i < count; i += 10) { var step = changes.GetRange(i, Math.Min(10, count - i)); - await Task.Run(() => new Commands.Reset(_repo.FullPath, step).Use(log).Exec()); + var files = new List(); + foreach (var c in step) + files.Add(c.Path); + + await Task.Run(() => new Commands.Restore(_repo.FullPath, files, "--staged").Use(log).Exec()); } } log.Complete();