Search code examples
gitgithubgit-stash

How can I remove selective stashes in git?


I have the list of stashes and want to drop some of them selectively.

For my example, I want to remove stash@{1}, stash@{3}, stash@{4}, stash@6}

$git stash list

stash@{1}: Tests On branch1-om: Test for #8
stash@{2}: WIP On branch1-om: WIP for #12
stash@{3}: Temp on branch1-om: 0a447303 Add Unit Tests for the HttpClient
stash@{4}: To delete stash: 233abc813c fix
stash@{5}: WIP on branchn-test-om: 4a42e4 WIP: Commit
stash@{6}: On branch-test-om: projects deleted/modified when rebuilt
stash@{7}: My configurations: Apply my local dev configurations

My Current step is very repetitive:

$git stash drop stash@{1}

$git stash list

stash@{1}: WIP On branch1-om: WIP for #12
stash@{2}: Temp on branch1-om: 0a447303 Add Unit Tests for the HttpClient
stash@{3}: To delete stash: 233abc813c fix
stash@{4}: WIP on branchn-test-om: 4a42e4 WIP: Commit
stash@{5}: On branch-test-om: projects deleted/modified when rebuilt
stash@{6}: My configurations: Apply my local dev configurations

$git stash drop stash@{2}

$git stash list

stash@{1}: WIP On branch1-om: WIP for #12
stash@{2}: To delete stash: 233abc813c fix
stash@{3}: WIP on branchn-test-om: 4a42e4 WIP: Commit
stash@{4}: On branch-test-om: projects deleted/modified when rebuilt
stash@{5}: My configurations: Apply my local dev configurations

$git stash drop stash@{2}

$git stash list

stash@{1}: WIP On branch1-om: WIP for #12
stash@{2}: WIP on branchn-test-om: 4a42e4 WIP: Commit
stash@{3}: On branch-test-om: projects deleted/modified when rebuilt
stash@{4}: My configurations: Apply my local dev configurations

$git stash drop stash@{3}

$git stash list

stash@{1}: WIP On branch1-om: WIP for #12
stash@{2}: WIP on branchn-test-om: 4a42e4 WIP: Commit
stash@{4}: My configurations: Apply my local dev configurations

Solution

  • The problem is that removing stashes from the top renumbers them. But since you can remove them at any position, you don't need to act as if stashes have only stack-like access.

    Drop them from the furthest, to keep the numbers intact:

    for N in 6 4 3 1; do git stash drop stash@\{$N}; done