Git提交失败主因是身份未配置、钩子拦截、不在仓库目录或远程推送问题;需依次检查user.name/email、pre-commit脚本、.git目录存在性及SSH/Token认证。

Git提交失败,八成不是Git坏了,而是你漏掉了某个关键环节——身份没配、钩子卡住、目录不对,或者根本没进对仓库。
git commit 报 “Please tell me who you are” 或 “empty ident name”
这是最典型的首次提交失败现象,错误信息里常带 fatal: empty ident name 或直接提示“请告诉我你是谁”。本质是 Git 根本不知道该把这次提交记在谁名下。
- Git 必须有
user.name和user.email才能生成合法提交对象,缺一不可 - 它按顺序查:当前仓库的
.git/config→ 全局~/.gitconfig→ 环境变量(如GIT_AUTHOR_NAME),全空就报错 - 常见于新装系统、Docker 容器、CI 脚本、VS Code 终端未加载 shell 配置等场景
- 别用
git config --local user.name试完就跑——本地配置只对当前仓库生效,换个项目还得重配;建议优先跑:git config --global user.name "Your Name"git config --global user.email "you@example.com"
pre-commit 钩子执行失败(比如 Husky + ESLint)
你敲了 git commit -m "fix",终端突然刷出一堆红色报错,最后停在 husky - pre-commit script failed。这不是 Git 拒绝你,是项目自己设的门禁被触发了。
- 典型表现:报
eslint --fix [FAILED]、lint-staged not found、Cannot find module 'xxx' - 原因可能是:Node 版本不一致导致脚本解析失败、
node_modules没装全、Windows 下路径分隔符写死为/、或.husky/pre-commit脚本里用了未声明的命令 - 临时绕过方法(仅限调试):
git commit --no-verify -m "temp",但别推到主分支 - 根治办法:进
.husky/pre-commit,确认第一行是#!/usr/bin/env sh(别写成#!/bin/bash),再检查里面调用的命令是否在$PATH中可执行
执行 git commit 时提示 “not a git repository”
连提交入口都找不到,说明你压根不在 Git 仓库里,或者 Git 根本没初始化。
- 先运行
git status,如果报错fatal: not a git repository,立刻执行pwd看当前路径,再ls -a | grep .git确认有没有.git目录 - 如果是全新项目,必须先
git init;如果是克隆的项目,大概率是你 cd 错了目录(比如在父文件夹里直接敲命令) - 还有一种隐蔽情况:你在 WSL 或 Docker 里挂载了 Windows 路径,Git 可能因所有权问题拒绝操作,此时要加安全目录:
git config --global --add safe.directory /path/to/your/repo
git push 失败但 commit 成功了
这其实已经脱离“提交失败”范畴,但新手常混淆。commit 是本地操作,push 是网络操作,两者失败原因完全不同。
- 如果 push 报
Permission denied (publickey),说明 SSH 密钥没配好或没加到 GitCode/GitHub;报Authentication failed则大概率是用了密码——现在主流平台(包括 GitCode)已停用密码认证,必须用 Personal Access Token 替代 - 如果报
Updates were rejected because the remote contains work that you do not have locally,说明远程有你没拉的新提交,得先git pull origin main合并或git pull --rebase origin main变基,再 push - 注意:不要用
git push --force硬顶,尤其在共享分支上,会丢同事的提交
真正容易被忽略的是:很多失败不是单一原因,而是组合拳——比如你刚在新机器上装完 Git,既没配 user.name,又忘了 git init,还误以为 VS Code 的提交按钮会自动帮你搞定一切。实际开发中,先 git status、再 git config --global --list、最后看报错里最关键的那行英文,比瞎搜“Git 提交不了”快得多。


















