我有一个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 

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


当前回答

很简单:

cd /path/to/submodule/root
git submodule update -f --init  .

大多数答案都建议重置所有的子模块,我认为这不是最好的方法,因为它们可能会有合法的变化。

其他回答

很简单:

cd /path/to/submodule/root
git submodule update -f --init  .

大多数答案都建议重置所有的子模块,我认为这不是最好的方法,因为它们可能会有合法的变化。

从Git 2.14(2017年Q3)开始,你不需要进入每个子模块来进行Git重置(就像Git子模块foreach Git重置一样——很难)

这是因为git重置本身现在知道如何递归地进入子模块。

参见Stefan Beller (stefanbeller)的commit 35b96d1(2017年4月21日),和commit f2d4899, commit 823bab0, commit cd279e2(2017年4月18日)。 (由Junio C Hamano合并- gitster -在commit 5f074ca, 2017年5月29日)

内置/重置:添加——递归子模块开关

Git-reset是另一个工作树操作器,应该教授关于子模块的知识。

当用户使用git-reset和请求递归到子模块时, 方法中记录的对象名称将重置子模块 超级工程,分离人头。

警告:区别:

Git重置-硬-递归子模块和 Git子模块foreach Git重置——很难

前者也会重置你的主父repo工作树,因为后者只会重置子模块的工作树。 所以请谨慎使用。

对于git <= 2.13,这两个命令结合起来应该用递归子模块重置你的repo:

git submodule foreach --recursive git reset --hard
git submodule update --recursive --init

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

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