在工作树中检出已移动的多个文件

12

我将文件从Project移动到Project/src。Git认为我已经从Project中删除了这些文件并在Project/src中创建了新的文件。

此外,我的工作树中有多个其他更改,我希望将其提交。我的git status如下:


 $ git  status
# On branch feature/cmake
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#   new file:   .gitignore
#   new file:   CMakeLists.txt
#   deleted:    Wasa.xcodeproj/project.pbxproj
#   deleted:    Wasa/Wasa.1
#   renamed:    Wasa/main.cpp -> main.cpp
#   new file:   src/CMakeLists.txt  
#  Lots of new files listed here
#
# Changes not staged for commit:
#   (use "git add/rm ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#   modified:   CMakeLists.txt
#   deleted:    IODevice.h
#  Lots of deleted files listed here.
我想取消暂存源文件 - *.{cpp,h}。我知道如何取消暂存(例如,这里的链接)很有帮助。我想要避免的是输入大量的git checkout <filename>
我不想检出HEAD,因为我想保留工作树中的某些更改。我尝试过执行git checkout *.{cpp,h},但会得到以下结果:

$ git checkout *.{cpp,h}
zsh: no matches found: *.cpp

由于这些文件当前在工作树中不存在,我无法将它们检出,因为*.{cpp,h}无法匹配任何文件。

这些文件都在Project/src中;可能有一个正则表达式或其他方法可以将ls src的输出传递给git checkout命令,但我想知道是否可以让git自己来处理。在Git中有什么方法可以做到这一点吗?

2个回答

28

转义 * 符号:

$ git checkout \*.{cpp,h}

如果目录中存在文件,git(或者也许是shell,我不确定哪个)会接受 *.{cpp,h} 并将其扩展为所有匹配的文件。我的问题是我没有匹配的文件;它们已经移动到了 src/*.{cpp,h},我正在尝试找到一种懒惰的方法来检出这些文件,而不必键入 git checkout <filename1>git checkout <filename2> 等等。 - simont
如果你在星号前加上转义字符,它就不会在 shell 中匹配。试试看吧 :-) - Irfy
呵呵,我的错;我完全读错了你写的内容。那个可以 - 非常感谢你。 - simont
抱歉我是个新手,能提供完整的命令吗?谢谢。 - pal4life
2
$ git checkout \*.{cpp,h} 将检出与 shell glob 模式 *.{cpp,h} 匹配的任何文件 在代码库中。如果没有反斜杠,它将匹配(并展开为)当前目录中的文件。 - Irfy

2

检出多个文件。我刚刚实现了通配符,并且这对我很有效。对于特定的文件,我们可能需要不同的技巧。

我使用了:

git checkout -- *.*

在我的Git Bash中,并且我的工作区中所有修改过的文件都被替换为仓库中的文件。

希望有所帮助,谢谢。


问题在于接受的答案中指出了一个问题,即 * 由 shell (bash、zsh等) 扩展为所有匹配的文件,如果您已将它们移动/删除,则可能没有匹配的文件。而在此上下文中的 \*git 扩展为被 git 跟踪的文件,即已应用 git add 到它们上面。即使移动/删除了文件,git checkout \* 也将扩展到这些文件名,直到您提交移动/删除它们。实际上,要提交对 file.end 的删除,您必须执行 git commit file.end,尽管该文件不存在(但对于 git 来说存在)。 - Jonatan Öström
非常正确。 谢谢Jonatan。对于我的新手问题感到抱歉。 - Divesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接