13

I would like to run

git reset *.foo

but this errors out.

I think I need to use a pipe, but I'm not sure how to do this.

Thanks!

SQB
  • 3,926
  • 2
  • 28
  • 49
Jacko
  • 12,665
  • 18
  • 75
  • 126
  • Note: these files have been staged as deleted. i.e. the files are no longer in my working directory. So I guess I need something like git checkout *.foo – Jacko Nov 19 '10 at 18:26

10 Answers10

9
for i in `git status --porcelain | grep '^D.*\.foo$' | sed 's/^D \+//'`; do
    git reset HEAD "$i"
    git checkout "$i"
done
cdhowie
  • 158,093
  • 24
  • 286
  • 300
7

If you are using Powershell the following will work.

gci -re -in *foo | %{ git reset $_ } 
JaredPar
  • 733,204
  • 149
  • 1,241
  • 1,454
6

This should work in cygwin and unix env

git reset $(git diff --name-only --cached | grep *.foo)
User123456
  • 671
  • 2
  • 9
  • 19
  • Strangely with the asterisk this unstaged all files for me. Without the asterisk it complains about relative paths. This worked, `git reset -- $(git diff --name-only --cached | grep .foo)` – Annan Yearian Dec 14 '22 at 13:28
6

Now git restore is perfectly working, thus for me the easiest has been:

git restore '*.foo'

like in @César Noreña answer.

However, another pretty easy and very flexible way would be:

git diff --name-only --relative | grep '.foo' | xargs git restore

and it is flexible because you can use all grep options, or even replace grep with something else.

Annibale
  • 241
  • 3
  • 6
2

In a Git GUI application like SmartGit I would filter the displayed files by the pattern *.foo, press Ctrl+A to select all the filtered files and invoke the Unstage command.

Mot
  • 28,248
  • 23
  • 84
  • 121
2

Simply use git reset *mypattern*

EDIT: Also try git restore, but be VERY careful as it seems to be bugged at the time of writing.

Sina Madani
  • 1,246
  • 3
  • 15
  • 27
2

You can try restore the files with git restore '*.foo'

César N.
  • 449
  • 4
  • 7
1

E.g. I want to match all "migrations" in path.

git diff --name-only | grep migrations | xargs git checkout

kevins
  • 472
  • 6
  • 17
1

White space in filename was causing problems using the git diff approaches but the following worked:

find ./ -name "*.foo" -exec git reset {} \;

Execution is verbose if there are many files to be unstaged.

Daniel Sokolowski
  • 11,982
  • 4
  • 69
  • 55
0

If you want to checkout (undo changes) of unstaged modified files matching a given pattern, this works:

macOS:

git checkout $(git st -s | sed -E 's/^.{2}//' | grep '\.foo$')

Unix:

git checkout $(git st -s | sed -r 's/^.{2}//' | grep '\.foo$')

I've only tested this with M modified files. YMMV if you have renamed/deleted/conflicted files as well.

Johannes Fahrenkrug
  • 42,912
  • 19
  • 126
  • 165