Notes
git 问题记录
文件名大小写修改不生效
场景:在 macOS / Windows 上把
demo.js 重命名为 Demo.js,git status 却没有变化;或跨平台协作时,远程仓库里同时存在仅大小写不同的两个文件。Git 在 macOS / Windows 上默认对文件名大小写不敏感,直接改文件名往往不会被识别为变更。
开启大小写敏感(建议只在当前仓库设置,避免影响其他项目)
$ git config --local core.ignorecase false
# 查看当前配置(false 表示敏感)
$ git config --get core.ignorecase
用 git mv 两步重命名(以 demo → Demo 为例)
$ 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"
强制与远程仓库保持一致
场景:本地历史与远程分叉(误操作
reset、rebase 失败、或本地有大量不需要的提交),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 时避免产生合并节点
场景:
feature 与 test 两条并行分支,需要将 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),不会生成合并节点。