如何将我的更改还原为git子模块?

时间:2012-06-05 23:52:44

标签: git git-submodules

我有一个git子模块(RestKit),我已将其添加到我的仓库中。

我不小心改变了那里的一些文件,我想回到源版本。为了做到这一点,我试图运行

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 

不会还原本地修改的文件 如何重置该子模块的内容?

14 个答案:

答案 0 :(得分:247)

如果要对所有子模块执行此操作,而不必更改目录,则可以执行

git submodule foreach git reset --hard

您还可以使用递归标志应用于所有子模块:

git submodule foreach --recursive git reset --hard

答案 1 :(得分:168)

进入子模块的目录,然后执行git reset --hard将所有已修改的文件重置为上次提交的状态。请注意,这将丢弃所有未提交的更改。

答案 2 :(得分:141)

比以前所有答案都更安全的防范方法:

git submodule deinit -f .
git submodule update --init

第一个命令完全“解除绑定”所有子模块,然后第二个命令对它们进行新的检查。
它需要比其他方法更长的时间,但无论子模块的状态如何都可以。

答案 3 :(得分:52)

对我而言,

git reset --hard

只需将子模块重置为其签出的状态,而不是主要的repo引用的提交/状态所必需的。我还是会像OP说的那样“修改内容”。因此,为了使子模块返回到更正提交,我运行:

git submodule update --init

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

答案 4 :(得分:41)

按顺序执行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

答案 5 :(得分:20)

这对我有用,包括递归到子模块(也许这就是为什么你的-f没有工作,导致你改变了子模块中的子模块):

git submodule update -f --recursive

答案 6 :(得分:6)

自Git 2.14(2017年第3季度)以来,您不必进入每个子模块来执行git reset(如git submodule foreach git reset --hard

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

commit 35b96d1(2017年4月21日)和commit f2d4899commit 823bab0commit cd279e2(2017年4月18日)Stefan Beller (stefanbeller)Junio C Hamano -- gitster --于2017年5月29日commit 5f074ca合并)

  

builtin / reset:add --recurse-submodules switch

git-reset是另一个工作树操纵器,应该讲授子模块。

  

当用户使用git-reset并请求递归到子模块时,   这会将子模块重置为对象名称,如下所示   超级项目,拆除HEAD。

警告:区别:

  • git reset --hard --recurse-submodule
  • git submodule foreach git reset --hard

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

答案 7 :(得分:5)

对于git< = 2.13这两个命令合并后应该使用递归子模块重置你的回购:

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

答案 8 :(得分:3)

这适用于运行GIT v1.7.1的库,我们有一个DEV包repo和LIVE包repo。存储库本身只是用于打包项目资产的shell。所有子模块。

LIVE永远不会故意更新,但是可能会发生缓存文件或事故,使得repo变脏。添加到DEV的新子模块也必须在LIVE中初始化。

DEV中的包存储库

在这里,我们想要了解我们尚未意识到的所有上游更改,然后我们将更新我们的软件包存储库。

# Recursively reset to the last HEAD
git submodule foreach --recursive git reset --hard

# Recursively cleanup all files and directories
git submodule foreach --recursive git clean -fd

# Recursively pull the upstream master
git submodule foreach --recursive git pull origin master

# Add / Commit / Push all updates to the package repo
git add .
git commit -m "Updates submodules"
git push   

LIVE中的包存储库

这里我们想要提取已提交给DEV存储库的更改,但不是未知的上游更改。

# Pull changes
git pull

# Pull status (this is required for the submodule update to work)
git status

# Initialize / Update 
git submodule update --init --recursive

答案 9 :(得分:2)

如果要丢弃整个存储库中的所有更改以及子模块,可以使用

git restore . --recurse-submodules

这将撤消在存储库和子模块中所做的所有更改。

答案 10 :(得分:2)

如果子模块中有更改,请使用

fun getEmailAddressesInString(text: String): ArrayList<String>? {
        val emails: ArrayList<String> = ArrayList()
        val matcher =
            Pattern.compile("[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}")
                .matcher(text)
        while (matcher.find()) {
            emails.add(matcher.group())
        }
        return emails
    }

如果您的更改是远程子模块更改,请使用

git submodule foreach --recursive git reset --hard

如果已完成这些更改,请使用

git submodule update --init

答案 11 :(得分:0)

我重置所有子模块的方法(没有分离和保留他们的“主”分支):

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

答案 12 :(得分:0)

首先尝试一下,就像其他人所说的那样:

git submodule update --init

如果这不起作用,请转到子模块目录,然后使用以下命令查看子模块是否有任何更改:

git status

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

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

答案 13 :(得分:0)

很简单:

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

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