Git 入门到推送 GitHub 完整教程
基于
D:\desktop\double_car\项目的实战记录 远程仓库:git@github.com:forest-wang-sunshine/double_car.git整理时间:2026-05-04
📑 目录
阶段 0:前置检查
在开始之前,确认下面 3 件事:
git --version # 1. Git 是否安装git config --global user.name # 2. 全局用户名git config --global user.email # 3. 全局邮箱ls -la ~/.ssh/ # 4. SSH 密钥是否存在(id_rsa / id_rsa.pub)ssh -T git@github.com # 5. 测试 SSH 连接 GitHub测试 SSH 成功的标志:返回类似 Hi <你的GitHub用户名>! You've successfully authenticated...(虽然 exit code 是 1,但消息是成功的)。
如果还没有 Git 用户配置,初次配置:
git config --global user.name "你的名字"git config --global user.email "你的邮箱"阶段 1:理解 Git 的核心概念
在敲任何指令之前,必须先建立这张图的概念,否则后面会迷路:
┌─────────────────┐ git add ┌─────────────────┐ │ 工作区 │ ────────────► │ 暂存区 │ │ (Working Dir) │ │ (Staging Area) │ │ │ │ │ │ 你看到的文件夹 │ │ 准备打包的快照 │ └─────────────────┘ └─────────────────┘ │ │ git commit ▼ ┌─────────────────┐ git push ┌─────────────────┐ │ 远程仓库 │ ◄──────────── │ 本地仓库 │ │ (GitHub) │ │ (.git 文件夹) │ │ │ git pull │ │ │ 别人能访问到的 │ ────────────► │ 完整的版本历史 │ └─────────────────┘ └─────────────────┘4 个区的角色
- 工作区:就是你看到的项目文件夹本身,写代码、改代码都在这里。
- 暂存区:临时托盘。修改了 100 个文件,但只想把其中 5 个打包成一次提交,就用
git add把这 5 个挑到暂存区。 - 本地仓库:藏在项目根目录的
.git/文件夹里。git commit会把暂存区的快照永久存进去,每次提交都有一个唯一 ID(哈希值)。 - 远程仓库:GitHub 上的那份。和本地仓库结构几乎一样,靠
git push上传、git pull下载。
3 个核心动作 = 3 个箭头
| 命令 | 作用 |
|---|---|
git add 文件名 | 工作区 → 暂存区 |
git commit -m "说明" | 暂存区 → 本地仓库 |
git push | 本地仓库 → GitHub |
文件的 4 种状态
git add 它们后 Untracked ──────────────────► Staged(已暂存) (未追踪) ↑ │ git commit │ ▼ Modified ◄────── 改文件 ────── Committed(已提交) (已修改) (已提交,干净状态)阶段 2:本地仓库操作
第 1 步:初始化 Git 仓库
git init作用:
- 在当前目录创建一个隐藏的
.git/文件夹(就是”本地仓库”) - 只需要做一次,以后这个项目永远是 Git 仓库
- 删除
.git/= 抹掉所有 Git 历史,但代码本身还在
第 2 步:写 .gitignore(极其重要!)
.gitignore 是一个告诉 Git “请假装看不见这些文件” 的清单。
为什么这一步比 git init 还重要?
如果跳过这步直接 git add .,会有 4 个灾难:
- 大压缩包进仓库 → 仓库爆肥
Debug/、.elf、.hex、.map进仓库 → 每次编译都产生几十 MB 改动.settings/、.cproject进仓库 → 别人 clone 后 IDE 会冲突- Windows 的
Thumbs.db、*.bak进仓库 → 又脏又没用
本项目的 .gitignore 模板(AURIX + Eclipse + Windows)
# ===== 编译产物(TASKING / GCC)=====*.o*.d*.elf*.hex*.bin*.map*.lst*.src*.a*.lib
# ===== 构建输出目录 =====Debug/Release/External GCC - Debug/build/
# ===== Eclipse / AURIX Studio IDE 文件 =====.settings/.metadata/.recommenders/*.launch
# 注意:.cproject / .project 是 Eclipse 项目描述文件# 团队协作时通常需要保留,这里先保留# .cproject# .project
# ===== VSCode / Cursor / Kiro 编辑器配置 =====.vscode/.cursor/.kiro/
# ===== 临时文件 =====*.tmp*.temp*.log*.bak*~
# ===== 系统垃圾文件 =====.DS_StoreThumbs.dbdesktop.ini
# ===== 项目自带脚本(不需要进版本控制)=====删除临时文件.bat
# ===== 大文件 / 备份压缩包 =====*.zip*.7z*.rar
# ===== 运行时输出 =====outputs/runtime/
# ===== Claude Code 本地配置 =====.claude/settings.local.json⚠️ 顺序铁律:.gitignore 必须先于 git add 写好。如果已经 add 进去了再写 .gitignore,那个文件不会被忽略,需要 git rm --cached 文件名 才能撤销。
第 3 步:查看状态
git status输出关键字解读:
On branch master ← 当前分支名No commits yet ← 还没有任何提交Untracked files: ← "未追踪文件" = Git 还不管这些文件 .gitignore CLAUDE.md ...第 4 步:把分支名 master 改成 main
git branch -M main为什么改?
- 老版本 Git 默认分支叫
master,新版本(GitHub 也一样)默认叫main - 如果本地是
master但 GitHub 上是main,推送时会一团糟 - 统一改成
main是现在的标准
-M = “rename + force”(重命名 + 强制覆盖)。
让以后新建的仓库默认就用 main:
git config --global init.defaultBranch main第 5 步:把文件加到暂存区(git add)
| 命令 | 作用 | 何时用 |
|---|---|---|
git add 文件名 | 加单个文件 | 只想提交某个具体文件 |
git add 文件夹/ | 加整个文件夹(递归) | 加某个模块所有改动 |
git add . | 加当前目录及子目录所有改动 | 最常用 |
git add -A | 加整个仓库所有改动(包括删除) | 和 . 几乎一样,更彻底 |
关于 LF will be replaced by CRLF 警告
Windows 用 CRLF (\r\n),Linux/Mac 用 LF (\n)。Git 默认会自动转换换行符,这只是警告,不是错误。
让 Git 不再刷一堆警告:
git config --global core.autocrlf true # Windows 推荐让 Git 正确显示中文文件名
git config --global core.quotepath false否则中文文件名会显示成 \345\217\202\346... 八进制乱码。
第 6 步:提交到本地仓库(git commit)
git commit -m "提交说明"| 部分 | 含义 |
|---|---|
git commit | 把暂存区的内容打包成一个永久快照存进 .git/ |
-m | message 的缩写,后面跟提交说明 |
"..." | 提交说明(必填,越清晰越好) |
每次 commit 后会发生:
- 生成一个唯一的 40 位哈希 ID(如
a3f5b8...),作为这次提交的指纹 - 记录:谁提交的、什么时候、改了什么
- 以后能用
git log查、git checkout回到任意一次提交
Conventional Commits 提交信息规范
格式:<类型>(<范围>): <简述>
| 类型 | 含义 | 例子 |
|---|---|---|
feat | 新功能 | feat(front): 添加斑马线识别 |
fix | 修 bug | fix(back): 修正卡尔曼滤波收敛问题 |
refactor | 重构(不改功能) | refactor(common): 提取 PID 通用接口 |
chore | 杂项(构建、依赖、初始化等) | chore: 初始化仓库 |
docs | 文档 | docs: 更新 README |
style | 格式调整(空格、缩进) | style: 格式化代码 |
test | 测试相关 | test: 添加单元测试 |
perf | 性能优化 | perf(back): 加速图像处理 |
第 7 步:查看历史
git log # 完整版(信息很多,按 q 退出)git log --oneline # 简洁版(一行一条)git log --oneline -5 # 只看最近 5 条git log --graph # 带分支图阶段 3:推送到 GitHub
第 1 步:在 GitHub 网页创建空仓库
-
Repository name 填仓库名(如
double_car) -
Public(公开)/ Private(私有)二选一
-
⚠️ 下面 3 个勾全部不要勾!
- ❌ 不要勾
Add a README file - ❌ 不要勾
Add .gitignore - ❌ 不要勾
Choose a license
原因: 本地仓库已经有这些文件。如果 GitHub 也创建,第一次 push 会报”两边历史不一致”的冲突,处理起来很烦。先建一个完全空的仓库最干净。
- ❌ 不要勾
-
点 Create repository
-
复制提示页里的 SSH 地址:
git@github.com:用户名/仓库名.git(注意是以git@开头,不是https://)
第 2 步:关联远程仓库(git remote add)
git remote add origin git@github.com:用户名/仓库名.git| 部分 | 含义 |
|---|---|
git remote add | 添加一个远程仓库的引用 |
origin | 远程仓库的别名,习惯叫 origin。可以叫别的,但 99% 的人都叫 origin |
git@github.com:... | SSH 地址 |
这条命令做了什么?
- 不下载任何东西、不上传任何东西
- 只在
.git/config文件里记一笔:“以后说 origin 就指这个 GitHub 地址” - 之后
git push origin main就等价于git push git@github.com:用户名/仓库名.git main
查看已配置的远程仓库:
git remote -v输出会显示两行 (fetch) 和 (push),正常的:
(fetch)= 拉取代码时用这个地址(push)= 推送代码时用这个地址
改 / 删 / 加远程:
git remote remove origin # 删除git remote set-url origin <新地址> # 改地址git remote add backup git@github.com:... # 加第二个远程第 3 步:首次推送(git push -u)
git push -u origin main| 部分 | 含义 |
|---|---|
git push | 推送本地提交到远程仓库 |
-u | --set-upstream 缩写。只在第一次需要,建立”本地 main ↔ origin/main”的追踪关系 |
origin | 远程仓库别名 |
main | 推送哪个分支 |
-u 的重要性:
- 没加:以后每次都要写完整
git push origin main - 加了:以后只要敲
git push就够了,Git 知道你要推 main → origin/main
所以首次推送一定要加 -u。
推送成功的标志:
branch 'main' set up to track 'origin/main'.To github.com:用户名/仓库名.git * [new branch] main -> main阶段 4:日常工作流
4 步循环
1. 改代码 / 写新文件 ↓ 2. git add . (把改动加到暂存区) ↓ 3. git commit -m "..." (提交到本地仓库) ↓ 4. git push (推送到 GitHub,注意:首次之后不需要 -u)完整示例
# 你刚改完了 PID.c,想提交git status # 看看改了什么# 输出: modified: Front_Car-main/code/PID.c
git diff # 看具体改了哪几行
git add Front_Car-main/code/PID.c # 加到暂存区(也可以 git add .)
git status # 再看一眼,确认是 "Changes to be committed"
git commit -m "fix(front): 修正PID积分饱和"
git push # 推到 GitHub日常命令速查表
必备命令(90% 时间在用这 4 个)
git status # 看现在改了什么、有没有未提交的东西git add . # 把所有改动加到暂存区git commit -m "..." # 提交git push # 推到 GitHub常用查看命令
git log --oneline # 简洁版提交历史git log --oneline -5 # 只看最近 5 条git log --graph # 带分支图的历史git diff # 看工作区改了什么(还没 add 的)git diff --staged # 看暂存区改了什么(已 add 待 commit 的)git diff HEAD # 看从最后一次 commit 至今的全部改动git remote -v # 看远程仓库配置git branch # 看本地所有分支git branch -a # 看本地+远程所有分支git show <提交哈希> # 看某次提交的详细改动撤销 / 后悔药
git restore 文件名 # 撤销工作区的修改(恢复到上次提交的样子)git restore --staged 文件名 # 把已 add 的文件从暂存区拿出来git commit --amend -m "新说明" # 改最后一次 commit 的说明(仅在 push 之前用!)git reset HEAD~1 # 撤销最后一次 commit,但保留改动到工作区git reset --hard HEAD~1 # 撤销最后一次 commit,且丢弃所有改动(危险!)git rm --cached 文件名 # 把误 add 的文件从暂存区移除(保留本地文件)⚠️ 铁律:已经 push 到 GitHub 的提交,不要轻易 reset 或 --amend,会让别人很麻烦。
多人协作(以后用)
git pull # 从 GitHub 拉最新代码到本地git pull --rebase # 拉取并把你的本地提交"垒"到最新代码上面(更干净)git fetch # 只下载,不合并(先看再决定)配置类(一次性)
git config --global user.name "你的名字"git config --global user.email "你的邮箱"git config --global init.defaultBranch main # 默认分支用 maingit config --global core.autocrlf true # Windows 自动换行符转换git config --global core.quotepath false # 中文文件名正常显示git config --list # 查看所有配置新手常见坑
坑 1:忘了 add 直接 commit
git commit -m "..." # 报错: nothing to commit原因:没有 git add 过的改动不会被 commit。
解药:先 git add . 再 commit。或者用 git commit -am "..."(-a 会自动 add 已追踪文件,但不会加新文件)。
坑 2:commit 信息写错了
git commit -m "fxi typo" # 拼错了"fix"解药(push 前):
git commit --amend -m "fix typo"解药(push 后):算了,下次注意。强行改会让别人 pull 时混乱。
坑 3:git status 看到一堆”幽灵文件”
改了某文件后 git status 一直显示有改动,但你没改。
原因:换行符问题(CRLF/LF)。 解药:
git config --global core.autocrlf true坑 4:误把大文件 / 编译产物 commit 了
最坏情况是已经 push 到 GitHub 了,仓库变得很大。
解药(仅本地):
# 把误加的文件从暂存区/历史里清除,但保留本地文件git rm --cached 大文件名echo "大文件名" >> .gitignoregit add .gitignoregit commit -m "chore: 排除大文件"已 push 到 GitHub 的彻底清除:用 git filter-repo 或 BFG Repo-Cleaner(进阶话题)。
坑 5:第一次 push 报错 rejected
! [rejected] main -> main (fetch first)原因:GitHub 仓库里有内容(比如创建仓库时勾了 README),跟本地不一致。
解药:
git pull origin main --allow-unrelated-histories # 强行合并两边历史# 解决冲突(如果有),然后git push -u origin main根治:创建 GitHub 仓库时别勾任何 README/.gitignore/license。
坑 6:git push 卡住不动
可能是首次 push 的大量数据正在传输(项目大时正常)。
- 如果几分钟还没动静,按
Ctrl+C终止,检查网络 - SSH 推送在国内可能慢,可以考虑临时换 HTTPS 推送
本项目实际操作记录
下面是 D:\desktop\double_car\ 项目从零推送到 GitHub 的完整命令序列(按时间顺序):
# ===== 阶段 0:检查 =====git --version # git version 2.42.0.windows.1git config --global user.name # forestgit config --global user.email # 2551021093@qq.comssh -T git@github.com # Hi forest-wang-sunshine!
# ===== 阶段 2:本地仓库 =====cd D:\desktop\double_car# 写 .gitignore(见上面模板)git init # Initialized empty Git repository in D:/desktop/double_car/.git/git config --global core.quotepath false # 中文文件名正常显示git config --global init.defaultBranch main # 默认分支用 maingit branch -M main # 把当前分支重命名为 maingit config --global core.autocrlf true # Windows 换行符自动转换git status # 确认 .gitignore 生效(看不到 zip / Debug 等)git add . # 加 1365 个文件git commit -m "chore: initial commit - 双车协作 AURIX 项目首次提交
包含两个独立的 TC264D 固件项目:- Front_Car-main: 前车(车道跟随、环岛/十字/斑马线状态机)- back_car-main: 后车(双目标连通域追踪、姿态+速度耦合)以及项目级文档与设计推导笔记。"# [main (root-commit) 95ac857]# 1365 files changed, 892321 insertions(+)
git log --oneline # 95ac857 chore: initial commit ...
# ===== 阶段 3:推送到 GitHub =====# (先在 https://github.com/new 创建空仓库 double_car,不勾任何选项)
git remote add origin git@github.com:forest-wang-sunshine/double_car.gitgit remote -v # 确认 fetch / push 地址git push -u origin main# branch 'main' set up to track 'origin/main'.# To github.com:forest-wang-sunshine/double_car.git# * [new branch] main -> main进阶学习路径
按优先级,下面这些是接下来该学的:
-
分支(branch)和合并(merge) —— 同时开发新功能不影响主线
git branch feature/xxx创建分支git checkout feature/xxx或git switch feature/xxx切换分支git merge feature/xxx合并分支回 maingit branch -d feature/xxx删除已合并分支
-
Pull Request 工作流 —— 团队协作的核心
- 在分支上开发 → push 分支 → 在 GitHub 网页发 PR → 别人 review → merge
-
.gitkeep—— 让 Git 追踪空文件夹的小技巧- Git 不追踪空文件夹,在里面放一个
.gitkeep空文件即可
- Git 不追踪空文件夹,在里面放一个
-
git stash—— 临时存放未提交的改动git stash暂存当前改动并清空工作区git stash pop恢复刚暂存的改动- 适合:要紧急切分支修 bug 但当前改动还没改完
-
git rebase—— 整理提交历史(进阶但很有用)git rebase -i HEAD~3交互式合并/修改最近 3 次提交- 让历史看起来更线性、清晰
-
.gitattributes—— 比 .gitignore 更细致的属性控制 -
GitHub 工作流进阶:
- Issues 和 Projects 管理任务
- GitHub Actions 自动化 CI/CD
- Releases 发布版本
一页纸总结(贴墙上)
┌──────────────────────────────────────────────────────────────┐│ Git 日常工作流 │├──────────────────────────────────────────────────────────────┤│ ││ 改代码 → git add . → git commit -m "..." → git push ││ │├──────────────────────────────────────────────────────────────┤│ 查看: git status / git log --oneline / git diff ││ 撤销: git restore <文件> / git restore --staged <文件> ││ 拉取: git pull │└──────────────────────────────────────────────────────────────┘
提交说明格式:<类型>(<范围>): <简述> feat 新功能 refactor 重构 fix 修 bug chore 杂项 docs 文档 perf 性能优化 style 格式 test 测试本教程基于 2026-05-04 推送 double_car 项目到 GitHub 的真实记录整理。
部分信息可能已经过时














