1

我想知道为什么我的 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 无济于事,所以它似乎不是编辑器错误..

这个问题导致我不小心做了 agit rebase --abort并丢失了一些本地非分阶段的更改。

系统

我在使用 Git Bash 的 Windows 10 上。

我已经使用 emacs 和 notepad 作为我的默认 git 编辑器进行了测试,两者的结果相同。

4

2 回答 2

3

问题是git am 已经是一个命令

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

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

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

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

于 2018-03-20T13:54:35.803 回答
1

根据alias.* in的文档git-config

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

am是现有的 Git 命令,因此alias.am被忽略。git am正在等待一些输入,但没有收到来自标准输入或补丁文件的任何内容。所以它看起来卡住了。

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

于 2018-03-20T14:14:48.773 回答