summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2022-05-15 20:33:25 +1000
committerGitHub <noreply@github.com>2022-05-15 20:33:25 +1000
commitf31dcd3091b2b23562bb10afd7c27b6400e9d39a (patch)
treec6dabe2a861c9ecf79a502aedfc8c8f0eafbda23
parent8e7f6822fca0ecef541280f31b9507a2ec5e50f6 (diff)
parent241d182da7d589e4a30520ff8d9ea4143c9e658a (diff)
Merge pull request #1930 from mark2185/feature/discard-staged-only
-rw-r--r--pkg/commands/git_commands/stash.go4
-rw-r--r--pkg/gui/controllers/workspace_reset_controller.go24
-rw-r--r--pkg/i18n/english.go6
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/COMMIT_EDITMSG1
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/FETCH_HEAD0
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/HEAD1
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/ORIG_HEAD1
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/config8
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/description1
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/indexbin0 -> 262 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/info/exclude6
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/logs/HEAD5
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/logs/refs/heads/master3
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/02/f629e46dbaa03b58196cced3df07b02c0daf22bin0 -> 147 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827bin0 -> 21 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442bin0 -> 50 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/22/f24c5fcc97c1ff826ecb66b60bdc01937f60523
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535dabin0 -> 21 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07bin0 -> 81 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5e/2f5743436bdc7602aa3486d5ff294940603c3dbin0 -> 198 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa8984483
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9d/b161bba78fbd20e7e4ae004be28e40d747726a2
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/7ff93a5c67a0ef098e9e436961746f333edf982
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2cbin0 -> 101 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5bin0 -> 21 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6abin0 -> 28 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e23064946412
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/objects/e3/18207cf3da045ce47e2632a5326b61030a2c8ebin0 -> 189 bytes
-rw-r--r--test/integration/discardStagedFiles/expected/repo/.git_keep/refs/heads/master1
-rw-r--r--test/integration/discardStagedFiles/expected/repo/file01
-rw-r--r--test/integration/discardStagedFiles/expected/repo/file11
-rw-r--r--test/integration/discardStagedFiles/expected/repo/file21
-rw-r--r--test/integration/discardStagedFiles/expected/repo/file31
-rw-r--r--test/integration/discardStagedFiles/recording.json1
-rw-r--r--test/integration/discardStagedFiles/setup.sh26
-rw-r--r--test/integration/discardStagedFiles/test.json1
36 files changed, 104 insertions, 1 deletions
diff --git a/pkg/commands/git_commands/stash.go b/pkg/commands/git_commands/stash.go
index c479d8610..c0d187a13 100644
--- a/pkg/commands/git_commands/stash.go
+++ b/pkg/commands/git_commands/stash.go
@@ -25,6 +25,10 @@ func NewStashCommands(
}
}
+func (self *StashCommands) DropNewest() error {
+ return self.cmd.New("git stash drop").Run()
+}
+
func (self *StashCommands) Drop(index int) error {
return self.cmd.New(fmt.Sprintf("git stash drop stash@{%d}", index)).Run()
}
diff --git a/pkg/gui/controllers/workspace_reset_controller.go b/pkg/gui/controllers/workspace_reset_controller.go
index dc830b3ba..f34739af7 100644
--- a/pkg/gui/controllers/workspace_reset_controller.go
+++ b/pkg/gui/controllers/workspace_reset_controller.go
@@ -12,7 +12,7 @@ import (
func (self *FilesController) createResetMenu() error {
red := style.FgRed
- nukeStr := "reset --hard HEAD && git clean -fd"
+ nukeStr := "git reset --hard HEAD && git clean -fd"
if len(self.model.Submodules) > 0 {
nukeStr = fmt.Sprintf("%s (%s)", nukeStr, self.c.Tr.LcAndResetSubmodules)
}
@@ -66,6 +66,28 @@ func (self *FilesController) createResetMenu() error {
},
{
LabelColumns: []string{
+ self.c.Tr.LcDiscardStagedChanges,
+ red.Sprint("stash staged and drop stash"),
+ },
+ Tooltip: self.c.Tr.DiscardStagedChangesDescription,
+ OnPress: func() error {
+ self.c.LogAction(self.c.Tr.Actions.RemoveStagedFiles)
+ if !self.helpers.WorkingTree.IsWorkingTreeDirty() {
+ return self.c.ErrorMsg(self.c.Tr.NoTrackedStagedFilesStash)
+ }
+ if err := self.git.Stash.SaveStagedChanges("[lazygit] tmp stash"); err != nil {
+ return self.c.Error(err)
+ }
+ if err := self.git.Stash.DropNewest(); err != nil {
+ return self.c.Error(err)
+ }
+
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES}})
+ },
+ Key: 'S',
+ },
+ {
+ LabelColumns: []string{
self.c.Tr.LcSoftReset,
red.Sprint("git reset --soft HEAD"),
},
diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go
index 3dd9822e5..ee14b8193 100644
--- a/pkg/i18n/english.go
+++ b/pkg/i18n/english.go
@@ -265,6 +265,7 @@ type TranslationSet struct {
LcDiscardAllChangesToAllFiles string
LcDiscardAnyUnstagedChanges string
LcDiscardUntrackedFiles string
+ LcDiscardStagedChanges string
LcHardReset string
LcViewResetOptions string
LcCreateFixupCommit string
@@ -491,6 +492,7 @@ type TranslationSet struct {
HardResetAutostashPrompt string
UpstreamGone string
NukeDescription string
+ DiscardStagedChangesDescription string
Actions Actions
Bisect Bisect
}
@@ -594,6 +596,7 @@ type Actions struct {
NukeWorkingTree string
DiscardUnstagedFileChanges string
RemoveUntrackedFiles string
+ RemoveStagedFiles string
SoftReset string
MixedReset string
HardReset string
@@ -883,6 +886,7 @@ func EnglishTranslationSet() TranslationSet {
LcDiscardAllChangesToAllFiles: "nuke working tree",
LcDiscardAnyUnstagedChanges: "discard unstaged changes",
LcDiscardUntrackedFiles: "discard untracked files",
+ LcDiscardStagedChanges: "discard staged changes",
LcHardReset: "hard reset",
LcViewResetOptions: `view reset options`,
LcCreateFixupCommit: `create fixup commit for this commit`,
@@ -1109,6 +1113,7 @@ func EnglishTranslationSet() TranslationSet {
CheckoutPrompt: "Are you sure you want to checkout '%s'?",
UpstreamGone: "(upstream gone)",
NukeDescription: "If you want to make all the changes in the worktree go away, this is the way to do it. If there are dirty submodule changes this will stash those changes in the submodule(s).",
+ DiscardStagedChangesDescription: "This will create a new stash entry containing only staged files and then drop it, so that the working tree is left with only unstaged changes",
Actions: Actions{
// TODO: combine this with the original keybinding descriptions (those are all in lowercase atm)
CheckoutCommit: "Checkout commit",
@@ -1193,6 +1198,7 @@ func EnglishTranslationSet() TranslationSet {
NukeWorkingTree: "Nuke working tree",
DiscardUnstagedFileChanges: "Discard unstaged file changes",
RemoveUntrackedFiles: "Remove untracked files",
+ RemoveStagedFiles: "Remove staged files",
SoftReset: "Soft reset",
MixedReset: "Mixed reset",
HardReset: "Hard reset",
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration/discardStagedFiles/expected/repo/.git_keep/COMMIT_EDITMSG
new file mode 100644
index 000000000..6c493ff74
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/COMMIT_EDITMSG
@@ -0,0 +1 @@
+file2
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/FETCH_HEAD b/test/integration/discardStagedFiles/expected/repo/.git_keep/FETCH_HEAD
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/FETCH_HEAD
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/HEAD b/test/integration/discardStagedFiles/expected/repo/.git_keep/HEAD
new file mode 100644
index 000000000..cb089cd89
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/ORIG_HEAD b/test/integration/discardStagedFiles/expected/repo/.git_keep/ORIG_HEAD
new file mode 100644
index 000000000..c3e34c41d
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/ORIG_HEAD
@@ -0,0 +1 @@
+02f629e46dbaa03b58196cced3df07b02c0daf22
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/config b/test/integration/discardStagedFiles/expected/repo/.git_keep/config
new file mode 100644
index 000000000..596ebaeb3
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/config
@@ -0,0 +1,8 @@
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+[user]
+ email = CI@example.com
+ name = CI
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/description b/test/integration/discardStagedFiles/expected/repo/.git_keep/description
new file mode 100644
index 000000000..498b267a8
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/index b/test/integration/discardStagedFiles/expected/repo/.git_keep/index
new file mode 100644
index 000000000..be47b0322
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/index
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/info/exclude b/test/integration/discardStagedFiles/expected/repo/.git_keep/info/exclude
new file mode 100644
index 000000000..a5196d1be
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/info/exclude
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/HEAD b/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/HEAD
new file mode 100644
index 000000000..9afe44c14
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/HEAD
@@ -0,0 +1,5 @@
+0000000000000000000000000000000000000000 22f24c5fcc97c1ff826ecb66b60bdc01937f6052 CI <CI@example.com> 1652009263 +0200 commit (initial): file0
+22f24c5fcc97c1ff826ecb66b60bdc01937f6052 9e7ff93a5c67a0ef098e9e436961746f333edf98 CI <CI@example.com> 1652009263 +0200 commit: file1
+9e7ff93a5c67a0ef098e9e436961746f333edf98 02f629e46dbaa03b58196cced3df07b02c0daf22 CI <CI@example.com> 1652009263 +0200 commit: file2
+02f629e46dbaa03b58196cced3df07b02c0daf22 02f629e46dbaa03b58196cced3df07b02c0daf22 CI <CI@example.com> 1652009266 +0200 reset: moving to HEAD
+02f629e46dbaa03b58196cced3df07b02c0daf22 02f629e46dbaa03b58196cced3df07b02c0daf22 CI <CI@example.com> 1652009266 +0200 reset: moving to HEAD
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/refs/heads/master b/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/refs/heads/master
new file mode 100644
index 000000000..e5e4b05c6
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/logs/refs/heads/master
@@ -0,0 +1,3 @@
+0000000000000000000000000000000000000000 22f24c5fcc97c1ff826ecb66b60bdc01937f6052 CI <CI@example.com> 1652009263 +0200 commit (initial): file0
+22f24c5fcc97c1ff826ecb66b60bdc01937f6052 9e7ff93a5c67a0ef098e9e436961746f333edf98 CI <CI@example.com> 1652009263 +0200 commit: file1
+9e7ff93a5c67a0ef098e9e436961746f333edf98 02f629e46dbaa03b58196cced3df07b02c0daf22 CI <CI@example.com> 1652009263 +0200 commit: file2
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/02/f629e46dbaa03b58196cced3df07b02c0daf22 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/02/f629e46dbaa03b58196cced3df07b02c0daf22
new file mode 100644
index 000000000..5dd10885d
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/02/f629e46dbaa03b58196cced3df07b02c0daf22
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827
new file mode 100644
index 000000000..f74bf2335
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/18/0cf8328022becee9aaa2577a8f84ea2b9f3827
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442
new file mode 100644
index 000000000..79fcadf67
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/1e/3e67b999db1576ad1ee08bf4f02bdf29e49442
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/22/f24c5fcc97c1ff826ecb66b60bdc01937f6052 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/22/f24c5fcc97c1ff826ecb66b60bdc01937f6052
new file mode 100644
index 000000000..f4e1952b1
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/22/f24c5fcc97c1ff826ecb66b60bdc01937f6052
@@ -0,0 +1,3 @@
+x
+0=+.&ݦ.=3 )%o>0 ZKYK;২)q!Y1KfSv
+Qg§IByyʱ$GǬtN>i37y2+ \ No newline at end of file
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da
new file mode 100644
index 000000000..06c9cb73d
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/38/143ad4a0fe2ab6ee53c2ef89a5d9e2bd9535da
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07
new file mode 100644
index 000000000..6a6f24362
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5c/ef9afea6a37d89f925e24ebf71adecb63d1f07
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5e/2f5743436bdc7602aa3486d5ff294940603c3d b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5e/2f5743436bdc7602aa3486d5ff294940603c3d
new file mode 100644
index 000000000..7aee98aa9
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/5e/2f5743436bdc7602aa3486d5ff294940603c3d
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448
new file mode 100644
index 000000000..c84b87a17
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/66/bbc809cdafd867cf9320bfb7484bb8fa898448
@@ -0,0 +1,3 @@
+x+)JMUd040031QHI5`ֶww.hT[H
+ e"ǨS,gu"YH
+$x~5(;rբW-Ж+^ \ No newline at end of file
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9d/b161bba78fbd20e7e4ae004be28e40d747726a b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9d/b161bba78fbd20e7e4ae004be28e40d747726a
new file mode 100644
index 000000000..c5c3d1d48
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9d/b161bba78fbd20e7e4ae004be28e40d747726a
@@ -0,0 +1,2 @@
+x
+0D=+.vn<3 -5o.޽ üŵu,BNǘ}O(YF묈yg3[uZN2sqȄw};'ܧ~BٞzkB!zb#dZۤ97%uYAJ  BP \ No newline at end of file
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/7ff93a5c67a0ef098e9e436961746f333edf98 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/7ff93a5c67a0ef098e9e436961746f333edf98
new file mode 100644
index 000000000..1c2077cd7
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/7ff93a5c67a0ef098e9e436961746f333edf98
@@ -0,0 +1,2 @@
+xA
+0E] 2$"BW=F2D>K."A" p)<iTr=Pȁ3{9-bਣITH•OJєOnf{|˺z"d$o0tnty3?9 \ No newline at end of file
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c
new file mode 100644
index 000000000..0e95eb06d
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/9e/88a70dc8d82dd2afbfd50176ef78e18823bc2c
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5
new file mode 100644
index 000000000..285df3e5f
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/a5/bce3fd2565d8f458555a0c6f42d0504a848bd5
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a
new file mode 100644
index 000000000..ee4385f12
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/c7/c7da3c64e86c3270f2639a1379e67e14891b6a
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641 b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641
new file mode 100644
index 000000000..2e9066287
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/d0/76cc9cc09acaa2d36fbc7a95fd3e2306494641
@@ -0,0 +1,2 @@
+x+)JMU03c040031QHI5`ֶww.hT[H
+ yW5Ɨ(| ^-W(x9 \ No newline at end of file
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/e3/18207cf3da045ce47e2632a5326b61030a2c8e b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/e3/18207cf3da045ce47e2632a5326b61030a2c8e
new file mode 100644
index 000000000..80258c14d
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/objects/e3/18207cf3da045ce47e2632a5326b61030a2c8e
Binary files differ
diff --git a/test/integration/discardStagedFiles/expected/repo/.git_keep/refs/heads/master b/test/integration/discardStagedFiles/expected/repo/.git_keep/refs/heads/master
new file mode 100644
index 000000000..c3e34c41d
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/.git_keep/refs/heads/master
@@ -0,0 +1 @@
+02f629e46dbaa03b58196cced3df07b02c0daf22
diff --git a/test/integration/discardStagedFiles/expected/repo/file0 b/test/integration/discardStagedFiles/expected/repo/file0
new file mode 100644
index 000000000..38143ad4a
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/file0
@@ -0,0 +1 @@
+test0
diff --git a/test/integration/discardStagedFiles/expected/repo/file1 b/test/integration/discardStagedFiles/expected/repo/file1
new file mode 100644
index 000000000..a5bce3fd2
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/file1
@@ -0,0 +1 @@
+test1
diff --git a/test/integration/discardStagedFiles/expected/repo/file2 b/test/integration/discardStagedFiles/expected/repo/file2
new file mode 100644
index 000000000..c7c7da3c6
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/file2
@@ -0,0 +1 @@
+hello there
diff --git a/test/integration/discardStagedFiles/expected/repo/file3 b/test/integration/discardStagedFiles/expected/repo/file3
new file mode 100644
index 000000000..c7c7da3c6
--- /dev/null
+++ b/test/integration/discardStagedFiles/expected/repo/file3
@@ -0,0 +1 @@
+hello there
diff --git a/test/integration/discardStagedFiles/recording.json b/test/integration/discardStagedFiles/recording.json
new file mode 100644
index 000000000..5abd7e1a8
--- /dev/null
+++ b/test/integration/discardStagedFiles/recording.json
@@ -0,0 +1 @@
+{"KeyEvents":[{"Timestamp":1175,"Mod":0,"Key":256,"Ch":32},{"Timestamp":1991,"Mod":0,"Key":256,"Ch":68},{"Timestamp":2923,"Mod":0,"Key":256,"Ch":83},{"Timestamp":4453,"Mod":0,"Key":256,"Ch":113}],"ResizeEvents":[{"Timestamp":0,"Width":213,"Height":56}]} \ No newline at end of file
diff --git a/test/integration/discardStagedFiles/setup.sh b/test/integration/discardStagedFiles/setup.sh
new file mode 100644
index 000000000..caff56b7d
--- /dev/null
+++ b/test/integration/discardStagedFiles/setup.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+set -e
+
+cd $1
+
+git init
+
+git config user.email "CI@example.com"
+git config user.name "CI"
+
+echo test0 > file0
+git add .
+git commit -am file0
+
+echo test1 > file1
+git add .
+git commit -am file1
+
+echo test2 > file2
+git add .
+git commit -am file2
+
+echo "hello there" > file1
+echo "hello there" > file2
+echo "hello there" > file3
diff --git a/test/integration/discardStagedFiles/test.json b/test/integration/discardStagedFiles/test.json
new file mode 100644
index 000000000..9edc4a815
--- /dev/null
+++ b/test/integration/discardStagedFiles/test.json
@@ -0,0 +1 @@
+{ "description": "Discarding staged changes", "speed": 5 }