Git undo别名无法正常工作

时间:2016-03-18 19:40:14

标签: git alias

希望有一些帮助使这个别名正常工作:

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

目标是能够执行:

没有参数的

git undo并将其恢复为先前的操作(HEAD @ {1})

git undo 2将回滚到之前的第二个动作

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

git undo

  

致命:含糊不清的论点'HEAD @ { - 1}':未知版本或路径不在   工作树。使用' - '将路径与修订分开,例如   这个:'git [...] - [...]'

git undo 2

  

警告:“HEAD”的日志只会追溯到2016年3月18日星期五12:00:10   -0700。警告:“HEAD”的日志仅返回2016年3月18日星期五12:00:10 -0700。 HEAD现在是66b5b26初始提交

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

  

66b5b26 HEAD @ {0}:重置:移至HEAD @ {2-1}

如何正确设置此别名?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

如果你想看看它会做什么而不做任何事情,只需将echo粘贴在别名的git reset前面,它就会显示它会运行的内容。

正如another answer中提到的那样,并且这里也提到了权证,这将默默地删除工作目录中的本地更改,因此请谨慎使用。

答案 1 :(得分:2)

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

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"

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