在git中创建别名

时间:2014-06-15 18:07:18

标签: git powershell github

我对Git很新,我试图从存储库中逐步完成提交。我没有为每次提交复制和粘贴SHA,而是使用this method to get the next commit after the HEAD

git checkout $(git rev-list HEAD..master | tail -n 1)

这很有效,但我已经使用了很多,所以我想用alias来清理语法。

第一次尝试

在一个理想的世界中,一个叫做" child-sha"将返回整个查找的内容,以便在powershell中调用它:

git checkout child-sha

如果打开/.config文件,我可以通过添加以下部分来添加命令:

[alias]
    child-sha = $(git rev-list HEAD..master | tail -n 1)

但是当我执行它时,我收到以下错误

  

扩大别名' child-sha'失败; ' $(git'不是git命令

第二次尝试

好的,所以没有使用$()。如果我按如下方式编辑配置文件:

[alias]
    child-sha = rev-list HEAD..master | tail -n 1

然后这样打电话:

git checkout $(git child-sha)

然后我收到以下错误

  

致命:含糊不清的论点' |':工作树中没有的未知修订版或路径

第三次尝试 - 工作,但草率

好的,所以没有使用Pipe(|)。如果我更新我的配置文件:

git config --local alias.child-shas "rev-list HEAD..master"

然后我这样打电话:

get checkout $(git child-shas | tail -n 1)

然后它有效,但我还没有保存那个的空间。

我不确定脚本中的每个功能是什么,因为我对Git和Powershell命令一般都不熟悉。 Google会搜索使用$|tail的文档,但不会发现任何有用的内容,因为特殊字符通常会被删除。

有没有办法缩写这个功能?


在一个单独的调查中,我真正想要做的就是逐步完成每个结账,这样我就可以在那个时间点查看整个代码库,这样我就可以为演示文稿设置一个小的演示。我似乎没有任何GUI编辑器(GitHub WindowsgitkVisual Studio Tools for Git)轻易地让您能够签出特定提交;例如,通过右键单击提交列表来说。

1 个答案:

答案 0 :(得分:2)

你错过了一个基本技巧(稍后请参阅“除非”)git别名只是直接的git-only命令,没有涉及shell而且无法运行非git命令:

[alias]
    foo = checkout

除非前面有一个shell转义!字符:

[alias]
    bar = !git checkout

(此时两个别名意味着相同的事情)。由于你希望 shell参与其中,以便运行子命令$(...)和管道... | ... - 这些都是“shell”的东西,而不是“git”的东西 - 您需要!前缀语法。然后,所有其余的实验都会好得多。


那说,解决你的基本问题:我对大多数GUI编辑器知之甚少,但是在gitk中你可以在最顶层的窗格中选择你喜欢的任何修订,点击右下方窗格中的“树”选择器,然后选择任何树中的文件(根据需要浏览目录)以查看左下方窗格中的文件。确实,这不会让你整个树,当然,一次只有一个文件。 (单击“补丁”选择器返回查看补丁。)

我在这里要做的另一件事是尽可能避免这些HEAD - 相对操作:而不是“前进一步”(这很棘手),你可以从已知的固定点开始 - 或者至少,在演示期间固定 - 例如分支名称,并使用git的修订语法(参见gitrevisions)来选择提交,但是你的意思是:

git checkout master~5
... demonstrate something ...
git checkout master~4
... demonstrate next thing ...

~n语法告诉git向 n 父项倒计时,在合并提交的情况下仅遵循第一父链接。由于4小于5,master~4必须比master更接近master~5一跳。 (如果有合并,那么合并的两个项目是相同的距离,跳跃式,从您选择的任何起始点开始,因此这个特定的方法太简单而无法捕捉真相。例如,您可以开始执行master~3^2~2 ,但它变得非常混乱。)