有时一个git仓库中会有一个或多个子模块,在某些情况下,子模块可能与检出状态不同步,因为子模块中的一些文件可能会意外更改。如何将子模块重置为与原始检出状态相同?
让我们举个例子,我们有一个git仓库A,其中有一个名为ruby-gems的子模块。假设远程origin上的子模块提交为a。
在我们的本地环境中,仓库A有子模块的最新提交,这导致了一些差异。
$ git diff
diff --git a/web-api/ruby-gems b/web-api/ruby-gems
index 0359dc84d..8a711275a 160000
--- a/web-api/ruby-gems
+++ b/web-api/ruby-gems
@@ -1 +1 @@
-Subproject commit 0359dc84d22adf0e131165b72b3209318605dfe3
+Subproject commit 8a711275a4c34bd8cc22b07894931fa1743c5707
现在我们想将仓库A的子模块提交重置回 0359dc84d22adf0e131165b72b3209318605dfe3
,以便本地和远程仓库之间没有差异。
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: web-api/ruby-gems (new commits)
no changes added to commit (use "git add" and/or "git commit -a")
如果我们只运行git reset --hard
可能不起作用,在这种情况下,我们可以运行git submodule
命令将子模块重置到其检出状态。
$ git submodule update --init
Submodule path 'web-api/ruby-gems': checked out '0359dc84d22adf0e131165b72b3209318605dfe3'
从上面的输出中,子模块状态被恢复到其检出状态。可以在上面之后使用以下命令进行验证。
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
如果有多个子模块并且想要将所有子模块状态重置为检出状态,可以运行以下命令。
git submodule foreach --recursive git submodule update --init
编码愉快。