Git 撤消别名无法正常工作

Git undo alias not working properly

需要一些帮助来使这个别名正常工作:

[alias]
    undo = "!f() { git reset --hard HEAD@{-1}; }; f"

目标是能够执行:

git undo 没有参数并让它恢复到先前的操作 (HEAD@{1})

git undo 2 将回滚到第二个先前的操作

当我执行它时,我没有看到预期的行为:

git 撤销

fatal: ambiguous argument 'HEAD@{-1}': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git [...] -- [...]'

git 撤消 2

warning: Log for 'HEAD' only goes back to Fri, 18 Mar 2016 12:00:10 -0700. warning: Log for 'HEAD' only goes back to Fri, 18 Mar 2016 12:00:10 -0700. HEAD is now at 66b5b26 Initial commit

调用 git undo 2 后,最新的 reflog 条目显示:

66b5b26 HEAD@{0}: reset: moving to HEAD@{2-1}

如何正确设置此别名?

如果我理解你的话,你希望它表现得像这样:

git undo                  # HEAD@{1}
git undo 1                # HEAD@{1}
git undo 5                # HEAD@{5}

然后我相信这应该有效,假设 shell 像 bash 或 zsh:

undo = "!f() { git reset --hard HEAD@{${1-1}}; }; f"

如果你想看看它不做任何事情会做什么,只需将 echo 放在别名的 git reset 前面,它会告诉你它会做什么 运行.

正如在 中提到的,这里也值得一提,这将在工作目录中悄悄删除本地更改,因此请谨慎使用。

目前还不完全清楚您到底在追求什么。我假设您正在寻找这些扩展:

git undo    ==>  git reset --hard HEAD@{0}
git undo 1  ==>  git reset --hard HEAD@{0}
git undo 2  ==>  git reset --hard HEAD@{1}
git undo 3  ==>  git reset --hard HEAD@{2}

如果这正是您要找的,您可以使用

undo = "!f() { git reset --hard HEAD@{$((${1:-1} - 1))}; }; f"

请注意,此别名相当危险。它会默默地删除您工作目录中的所有本地更改。