我对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 Windows,gitk或Visual Studio Tools for Git)轻易地让您能够签出特定提交;例如,通过右键单击提交列表来说。
答案 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
,但它变得非常混乱。)