我想知道为什么我的git别名被卡住以及它是如何导致变种的。
重现的步骤:
git config --global alias.am "commit --amend"
我可以看到别名添加了:
git config --global -e
[alias]
am = commit --amend --no-edit
创建新的测试回购:
> git init
> git am
Ctrl + c , Ctrl + c
没有任何事情发生,所以我必须手动关闭它。由于没有提交,因此在这种情况下预期结果为fatal: You have nothing to amend.
。但是,git现在处于rebase模式:(master|AM/REBASE)
当使用提交在repo中运行时,预期的结果是打开我的默认git编辑器,这样我就可以编辑提交消息,但会发生上述相同的意外行为。
问题
为什么我的git am别名会被卡住呢?它是如何让我陷入困境的?
我尝试了什么
我猜我的git别名在某种程度上是错误的,并且它导致它启动git commit --amend
,但在某种程度上它无法启动编辑器。并且因为git commit --amend可能在后台做了一个rebase来做它的事情,当我强制它中止时它会留在那个状态吗?
但是,我试图添加--no-edit无效,所以似乎不是编辑器错误..
此问题导致我意外地执行git rebase --abort
并丢失了一些本地非分阶段更改。
系统
我在Windows 10上使用Git Bash。
我已经测试过使用emacs和notepad作为我的默认git编辑器,两者都有相同的结果。
答案 0 :(得分:3)
问题在于git am
already is a command。
通常在处理git别名时,请注意。
当您尝试覆盖已存在的时,Git不会发出警告 关键词。
Git仍然将别名保存在配置文件中。
在编写新的git别名时,请记住测试您打算使用的别名是否已存在,并希望将来不会将其添加为关键字。
答案 1 :(得分:1)
根据git-config
中alias.*上的文件,
为避免混淆和使用脚本的麻烦,隐藏的别名 现有的Git命令被忽略。
am
是现有的Git命令,因此忽略alias.am
。 git am
正在等待一些输入但是没有收到任何内容,无论是stdin还是补丁文件。所以它看起来很困难。
当您按 Ctrl + C 退出时,git am
的进程会中断,就好像遇到冲突一样。在rebase-apply
下创建临时文件夹.git
。有了这个文件夹,Git知道它处于状态(master|AM/REBASE)
。您可以删除.git/rebase-apply
或运行git am --abort
以删除它。