所以,假设我搞砸了并运行了git commit -a
,不小心提交了我不想要的子模块更改(可能是因为我运行了git pull
并且之后忘记运行git submodule update
)。我想摆脱这种变化。我可以使用单行代码来执行此操作吗?
我今天这样做的方式是:
- 我跑
git show
弄清楚旧的哈希是什么 - 我
cd
子模块,然后运行git reset --hard OLD_HASH
- 返回父目录并
git commit --amend -a
这是太多的步骤。真的没有比这更短的了吗?
注意:这个问题不同于如何将更改还原到 git 子模块? 用户意外地对子模块中的文件进行了实际更改。在这种情况下,没有在子模块中编辑任何文件;我只是在错误的方向上更新了提交指针。
您可以通过编写脚本来编写单行代码。 脚本本身不可避免地会不止一行。 如果你愿意,它可以是这三条线,也可以是其他三条左右的线(例如,git rev-parse
,一个精心构造的git update-index
,和git commit --amend
)。 您可以将该脚本创建为 Git 命令(通过将其命名为git-foo
并将其放在您的路径中,之后git foo
将运行您的git-foo
脚本),或者使用git config
和[alias]
部分将其制作为 Git 别名。
您可能希望设置设置,以便将来不太可能发生,例如使用submodule.recurse
来true
。 (请注意,这会影响git push
除非您还设置了push.recurseSubmodules
;仔细阅读git config
文档中的所有子模块设置以获取更多信息)。