Notes

git 问题记录

文件名大小写修改不生效

场景:在 macOS / Windows 上把 demo.js 重命名为 Demo.jsgit status 却没有变化;或跨平台协作时,远程仓库里同时存在仅大小写不同的两个文件。

Git 在 macOS / Windows 上默认对文件名大小写不敏感,直接改文件名往往不会被识别为变更。

开启大小写敏感(建议只在当前仓库设置,避免影响其他项目)

$ git config --local core.ignorecase false

# 查看当前配置(false 表示敏感)
$ git config --get core.ignorecase

git mv 两步重命名(以 demoDemo 为例)

$ git mv demo demo.tmp   # 先改为临时名
$ git mv demo.tmp Demo   # 再改为目标名

若目标大小写版本已经存在于远程(历史遗留),需先清除旧索引再提交

$ git rm --cached demo   # 移除旧名称的缓存记录
$ git add Demo
$ git commit -m "fix: rename demo to Demo"

强制与远程仓库保持一致

场景:本地历史与远程分叉(误操作 resetrebase 失败、或本地有大量不需要的提交),git pull 持续冲突,需要完全丢弃本地改动,以远程 main 为准。
$ git fetch --all
$ git reset --hard origin/main   # 将本地 main 重置为远程最新状态

重新关联本地项目到远程仓库

场景:误删了项目目录下的 .git 文件夹,工作区代码还在,但仓库失去了 Git 历史与远程关联。

在现有代码目录重新初始化,并关联远程地址

$ git init
$ git remote add origin <origin-url>
$ git fetch

以远程 main 为准建立本地分支(会覆盖本地与远程不一致的内容)

$ git checkout -B main origin/main
# 等价写法:
# git reset --hard origin/main
# git branch --set-upstream-to=origin/main main

关闭 Git SSL 证书验证

场景:通过 HTTPS 访问自建 Git 服务器时,出现 OpenSSL SSL_read: Connection was reset 或证书不受信任等错误。常见原因是服务器使用了自签名证书,未被系统或 Git 信任。
关闭证书验证会降低传输安全性,仅建议在受信任的内网环境临时使用。生产环境应正确配置证书,而非关闭验证。
$ git config --global http.sslVerify false

误操作回滚后如何恢复

场景:执行了 git reset --hard 或其他回退操作,发现删错了提交,需要找回之前的代码。

情况一:改动已经 commit 过

# 查看所有 HEAD 变动记录(含已被 reset 的提交)
$ git reflog

# 恢复到目标 commit(将 <commit> 替换为 reflog 中的 hash)
$ git reset --hard <commit>

情况二:改动尚未 commit

本地工作区文件被覆盖或未保存时,可借助编辑器的历史记录功能恢复,例如 VS Code 的 Timeline 面板查看文件本地历史版本。

pull / push 冲突

场景:本地有提交、远程也有新提交,直接 git push 被拒绝;或 git pull 产生多余 merge commit,希望保持提交历史线性。
# 先拉取远程变更,并将本地提交变基到远程之上
$ git pull --rebase

# 若有冲突:手动解决后
$ git add .
$ git rebase --continue

# 若要放弃本次 rebase,回到操作前状态
$ git rebase --abort

git merge 时避免产生合并节点

场景:featuretest 两条并行分支,需要将 feature 的改动合入 test,且保持历史为一条直线(不产生 merge commit)。

切换到 feature 分支,将其变基到 test 之上

$ git checkout feature
$ git rebase test
  • 若出现冲突:解决冲突后执行 git rebase --continue
  • 若要放弃变基:执行 git rebase --abort

切回 test 分支,快进合并 feature

$ git checkout test
$ git merge feature

此时 feature 已在 test 之上,merge 为快进(fast-forward),不会生成合并节点。

Copyright © 2026