Git一线式恢复不需要的子模块更改

时间:2019-05-07 21:34:11

标签: git

因此,假设我搞砸了并运行git commit -a,意外地提交了一个我不想要的子模块更改(可能是因为我运行了git pull而后来却忘记了运行git submodule update) 。我想摆脱这种变化。我可以使用单线吗?

我今天这样做的方式是:

  1. 我运行git show来找出旧哈希是什么
  2. cd进入子模块,然后运行git reset --hard OLD_HASH
  3. 返回上级目录和git commit --amend -a

这是太多步骤。真的没有更短的东西了吗?

NB:此问题与How do I revert my changes to a git submodule?不同,在{{3}}中,用户意外地对子模块中的文件进行了实际更改。在这种情况下,子模块中没有文件被编辑;我只是在错误的方向上更新了提交指针。

1 个答案:

答案 0 :(得分:1)

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

您可能希望进行设置,以免将来发生这种情况,例如使用submodule.recursetrue。 (请注意,这会影响git push,除非您还设置了push.recurseSubmodules;请仔细阅读the git config documentation中的所有子模块设置。)