首页 > 解决方案 > Git one-liner 恢复不需要的子模块更改

问题描述

所以,假设我搞砸了并且跑了git commit -a,不小心提交了一个我不想要的子模块更改(可能是因为我跑了之后git pull忘记了运行git submodule update)。我想摆脱这种变化。有没有我可以使用的单线器来做到这一点?

我今天这样做的方式是:

  1. 我跑去git show弄清楚旧的哈希是什么
  2. cd进入子模块,然后运行git reset --hard OLD_HASH
  3. 返回父目录并git commit --amend -a

这个步骤太多了。真的没有更短的吗?

注意:这个问题与如何将更改恢复到 git 子模块不同?用户不小心对子模块中的文件进行了实际更改。在这种情况下,子模块中没有文件被编辑;我刚刚以错误的方向更新了提交指针。

标签: git

解决方案


您可以通过编写脚本来编写单行代码。脚本本身不可避免地会超过一行。如果您愿意,它可以是那三行,也可以是其他三行左右的集合(例如,git rev-parse精心构造git update-index的 和git commit --amend)。您可以将该脚本制作成一个 Git 命令(通过命名它git-foo并将其放在您的路径中,之后git foo将运行您的脚本)或使用和部分git-foo将其制作成 Git 别名。git config[alias]

您可能希望设置您的设置,以便将来不太可能发生,例如使用submodule.recurseto 。true(请注意,git push除非您还设置push.recurseSubmodules; 仔细阅读文档中git config所有子模块设置以获取更多信息,否则这会影响)。


推荐阅读