Git commit --amend别名导致rebase

时间:2018-03-20 13:54:36

标签: git git-alias

我想知道为什么我的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编辑器,两者都有相同的结果。

2 个答案:

答案 0 :(得分:3)

问题在于git am already is a command

通常在处理git别名时,请注意。

  • 当您尝试覆盖已存在的时,Git不会发出警告 关键词。

  • Git仍然将别名保存在配置文件中。

在编写新的git别名时,请记住测试您打算使用的别名是否已存在,并希望将来不会将其添加为关键字。

答案 1 :(得分:1)

根据git-configalias.*上的文件,

  

为避免混淆和使用脚本的麻烦,隐藏的别名   现有的Git命令被忽略。

am是现有的Git命令,因此忽略alias.amgit am正在等待一些输入但是没有收到任何内容,无论是stdin还是补丁文件。所以它看起来很困难。

当您按 Ctrl + C 退出时,git am的进程会中断,就好像遇到冲突一样。在rebase-apply下创建临时文件夹.git。有了这个文件夹,Git知道它处于状态(master|AM/REBASE)。您可以删除.git/rebase-apply或运行git am --abort以删除它。