GIT: I want to unstage all files matching a certain pattern

强颜欢笑 提交于 2019-12-30 06:06:50

问题


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!


回答1:


for i in `git status --porcelain | grep '^D.*\.foo$' | sed 's/^D \+//'`; do
    git reset HEAD "$i"
    git checkout "$i"
done



回答2:


If you are using Powershell the following will work.

gci -re -in *foo | %{ git reset $_ } 



回答3:


This should work in cygwin and unix env

git reset $(git diff --name-only --cached | grep *.foo)



回答4:


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.




回答5:


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

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




回答6:


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.




回答7:


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.




回答8:


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.



来源:https://stackoverflow.com/questions/4228100/git-i-want-to-unstage-all-files-matching-a-certain-pattern

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!