我有一个git子模块(RestKit),我已经添加到我的repo。

我不小心更改了里面的一些文件,我想回到原始版本。为了做到这一点,我试着逃跑

Mac:app-ios user$ git submodule update RestKit

但正如你在这里看到的,这并没有起作用,因为它仍然是“修改的内容”:

Mac:app-ios user$ git status
...
#   modified:   RestKit (modified content)

甚至

Mac:app-ios user$ git submodule update -f RestKit 

不恢复本地修改的文件。 如何重置该子模块的内容?


当前回答

对我来说,有

git reset --hard

只需将子模块重置到它签出时的状态,而不需要主模块的repo引用的提交/状态。我仍然会像OP说的那样有“修改的内容”。所以,为了让子模块回到正确的提交,我运行:

git submodule update --init

然后当我执行git status时,它在子模块上是干净的。

其他回答

按顺序执行4个步骤:

git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f

我重置所有子模块的方法(不分离和保留它们的主分支):

git submodule foreach 'git checkout master && git reset --hard $sha1'

对我来说,有

git reset --hard

只需将子模块重置到它签出时的状态,而不需要主模块的repo引用的提交/状态。我仍然会像OP说的那样有“修改的内容”。所以,为了让子模块回到正确的提交,我运行:

git submodule update --init

然后当我执行git status时,它在子模块上是干净的。

首先试试这个,就像其他人说的那样:

git submodule update --init

如果这不起作用,则切换到子模块目录,并使用以下命令查看子模块是否有任何更改:

git status

如果子模块有更改,请删除它们。验证当你运行“git status”时,你不会看到任何变化。

接下来,回到主存储库,再次运行“git submodule update——init”。

如果您希望为所有子模块执行此操作,而不必更改目录,则可以执行

git submodule foreach git reset --hard

你也可以使用递归标志应用到所有子模块:

git submodule foreach --recursive git reset --hard