GitHub 笔记:本地仓库同步 + 换行符(LF/CRLF)处理
适用环境:Windows Git Bash(MINGW64)+ WSL2 双环境管理仓库(如 Obsidian 库)
更新日期:2026-10-21
Part 1|本地仓库同步到 GitHub
1.1 What:同步的本质
Git 是分布式版本控制。仓库有三层状态:
工作区(你改的文件)→ 暂存区(git add 后的快照)→ 本地仓库(git commit 提交)→ 远程仓库(GitHub,git push 推送)
「同步到 GitHub」= 把本地已提交的 commit 推送(push) 到远程仓库。本地没 commit 的东西,永远推不上去。
1.2 How:核心操作(日常更新三步曲)
# 1. 查看当前改动状态(养成习惯,先看再动)
git status
# 2. 把改动加入暂存区
git add . # 添加全部改动
# 或 git add 具体文件:git add host_monitor.sh
# 3. 提交到本地仓库(写清 commit message,别写 "update")
git commit -m "feat: 新增磁盘巡检脚本,阈值超过80%输出告警"
# 4. 推送到 GitHub
git push
核心口诀:add → commit → push,三步缺一不可。
1.3 When:三种场景
场景 A:本地已有项目,首次推送到 GitHub(新建空仓库)
cd 你的项目目录
# 1. 关联远程仓库(https 或 ssh 方式,二选一)
git remote add origin https://github.com/10code2/ops-host-monitor.git
# 或 SSH:git remote add origin git@github.com:10code2/ops-host-monitor.git
# 2. 首次推送,-u 记住关联关系,以后直接 git push 即可
git push -u origin main
非 git 仓库先初始化:
git init
git add .
git commit -m "init: 项目初始化"
场景 B:日常更新 → 就是上面的三步曲。
场景 C:本地和远程都有更新(如网页端改过 README)
# 推荐 rebase 方式,历史更干净
git pull --rebase origin main
# 冲突解决后:
git add .
git rebase --continue
# 最后推送
git push
1.4 Why:原理(理解原理才能应对报错)
- 为什么 push 前要先 commit? 远程只接收「已提交的快照」,工作区的修改不算数,commit 是推送的最小单位。
- 为什么会被 rejected? 远程仓库有你本地没有的提交,Git 拒绝覆盖历史,必须先合并(pull --rebase)。
- 为什么 2021 年后密码登录 GitHub 失效? GitHub 已禁用账号密码推送,必须用 Personal Access Token(PAT) 或 SSH key。
1.5 常见报错对照表
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
! [rejected] ... (fetch first) |
远程有本地没有的提交 | git pull --rebase origin main 后重新 push |
Authentication failed / 提示输入密码失败 |
用了账号密码,GitHub 已禁用 | 生成 PAT(Settings→Developer settings→Personal access tokens),作为密码输入 |
Permission denied (publickey) |
SSH key 没配好 | ssh-keygen -t ed25519 生成,把公钥加到 GitHub→Settings→SSH keys |
remote origin already exists |
已关联过远程 | git remote -v 查看,改错用 git remote set-url origin 新地址 |
error: RPC failed; HTTP 413 / 文件过大 |
单文件超过 100MB 限制 | 用 git lfs,或把大文件加入 .gitignore |
fatal: not a git repository |
没在仓库目录内执行 | cd 到仓库目录,或先 git init |
1.6 个人最佳实践
# 首次配置身份
git config --global user.name "10code2"
git config --global user.email "你的邮箱"
# WSL2/Linux 侧换行符策略(与 Windows 侧配合)
git config --global core.autocrlf input
.gitignore必配:*.pro.user、*.db、.env、report/等不该入库- commit message 规范:
feat:/fix:/docs:/chore:开头
Part 2|换行符(LF / CRLF)处理 ★新增
2.1 警告解读:这是什么
warning: in the working copy of 'xxx.md', LF will be replaced by CRLF the next time Git touches it
翻译:工作区文件当前是 LF 结尾(\n,Linux 风格)。Git 检查到 core.autocrlf 配置,会在下一次 checkout 时把文件里的 LF 全部替换成 CRLF(\r\n,Windows 风格)。
这只是预告,不是错误。git add 照常成功,不影响操作。
2.2 原理剖析:三种换行符 + autocrlf
| 类型 | 符号 | 使用方 |
|---|---|---|
| LF | \n |
Linux / macOS / Git 仓库内部标准 |
| CRLF | \r\n |
Windows 记事本、旧版工具 |
| CR | \r |
上古 Mac,基本绝迹 |
core.autocrlf 三值对比:
| 值 | commit 进仓库时 | checkout 到工作区时 | 典型场景 |
|---|---|---|---|
true |
CRLF → LF | LF → CRLF | Windows 默认,仓库 LF、本地 CRLF |
input |
CRLF → LF | 不转换 | Linux / macOS 默认 |
false |
不转换 | 不转换 | 跨平台混乱,不推荐 |
警告出现的原因:Windows 下 autocrlf 大概率是 true,而 .md 文件是 LF 结尾(在 WSL2/Linux 编辑过,或工具生成时保持 LF),Git 预告下次 checkout 会转成 CRLF。
2.3 When:什么时候必须处理
| 情况 | 处理 |
|---|---|
| 只有自己用,且只在 Windows 编辑 | 可忽略,警告无害 |
| 仓库同时被 Windows + WSL2 使用(常见) | 必须统一,否则两边来回改会产生大量假 diff |
仓库里有 .sh 脚本,将来拷到 Linux 服务器跑 |
必须统一为 LF,CRLF 会让脚本报 \r: command not found |
| 团队协作、跨平台多人开发 | 必须用 .gitattributes,这是唯一正确姿势 |
⚠️ 运维真实事故:Windows 写的脚本传到 Linux 一跑就报
\r: command not found,根因就是 CRLF。运维岗高频考点。
2.4 How:解决方案(三档)
方案 B(推荐,生产环境最佳实践):仓库级统一 —— .gitattributes
在仓库根目录创建 .gitattributes:
# 所有文本文件按内容自动判断
* text=auto
# Markdown 和 shell 脚本强制 LF(避免脚本在 Linux 上报错)
*.md text eol=lf
*.sh text eol=lf
*.py text eol=lf
执行一次让仓库按新规则规范化:
git add --renormalize .
git commit -m "chore: 统一仓库换行符为 LF"
为什么是最佳实践:
.gitattributes是写进仓库的声明,跟着仓库走,任何人在任何平台 clone 都生效;core.autocrlf是每台机器各自的本机配置,换机器就失效。团队/跨平台场景必须用前者。
方案 C(个人快速处理):只改本机配置
# 仓库内统一为 LF(commit 时转 LF,checkout 不转回 CRLF)
git config core.autocrlf input
仅对本仓库生效,不跟随仓库走。
方案 A(不推荐长期用):直接忽略警告,仅限自己用、只在 Windows 编辑的场景。
2.5 双环境(Windows Obsidian + WSL2)实操建议
- 在
D:/Obsidian/Linux仓库根目录创建.gitattributes(用 2.4 方案 B 模板); - 执行
git add --renormalize .再 commit 一次,警告消失; - WSL2 侧
git config core.autocrlf input,两边策略对齐; - 以后写
.sh脚本,在 WSL2 里写完直接提交,永远保持 LF,避免部署到服务器踩\r的坑。
面试考点速记
- Git 推送流程:add → commit → push(远程只接收已提交快照)
- GitHub 已禁用密码登录,必须 PAT 或 SSH key
- 换行符:Git 仓库内部标准是 LF;Windows 工作区常见 CRLF
.gitattributes是仓库级换行符声明的唯一正确方式(跨平台团队协作)- CRLF 会让 Linux 上的
.sh脚本报\r: command not found(运维高频事故)
评论