Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4
4022 字
20 分钟
Git 使用教程:从入门到推送 GitHub

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 个区的角色#

  1. 工作区:就是你看到的项目文件夹本身,写代码、改代码都在这里。
  2. 暂存区:临时托盘。修改了 100 个文件,但只想把其中 5 个打包成一次提交,就用 git add 把这 5 个挑到暂存区。
  3. 本地仓库:藏在项目根目录的 .git/ 文件夹里。git commit 会把暂存区的快照永久存进去,每次提交都有一个唯一 ID(哈希值)。
  4. 远程仓库: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 个灾难:

  1. 大压缩包进仓库 → 仓库爆肥
  2. Debug/.elf.hex.map 进仓库 → 每次编译都产生几十 MB 改动
  3. .settings/.cproject 进仓库 → 别人 clone 后 IDE 会冲突
  4. 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_Store
Thumbs.db
desktop.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/
-mmessage 的缩写,后面跟提交说明
"..."提交说明(必填,越清晰越好)

每次 commit 后会发生:

  • 生成一个唯一的 40 位哈希 ID(如 a3f5b8...),作为这次提交的指纹
  • 记录:谁提交的、什么时候、改了什么
  • 以后能用 git log 查、git checkout 回到任意一次提交

Conventional Commits 提交信息规范#

格式:<类型>(<范围>): <简述>

类型含义例子
feat新功能feat(front): 添加斑马线识别
fix修 bugfix(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 网页创建空仓库#

  1. 打开 https://github.com/new

  2. Repository name 填仓库名(如 double_car

  3. Public(公开)/ Private(私有)二选一

  4. ⚠️ 下面 3 个勾全部不要勾!

    • ❌ 不要勾 Add a README file
    • ❌ 不要勾 Add .gitignore
    • ❌ 不要勾 Choose a license

    原因: 本地仓库已经有这些文件。如果 GitHub 也创建,第一次 push 会报”两边历史不一致”的冲突,处理起来很烦。先建一个完全空的仓库最干净。

  5. Create repository

  6. 复制提示页里的 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 # 默认分支用 main
git 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 "大文件名" >> .gitignore
git add .gitignore
git commit -m "chore: 排除大文件"

已 push 到 GitHub 的彻底清除:用 git filter-repoBFG 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.1
git config --global user.name # forest
git config --global user.email # 2551021093@qq.com
ssh -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 # 默认分支用 main
git branch -M main # 把当前分支重命名为 main
git 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.git
git 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

进阶学习路径#

按优先级,下面这些是接下来该学的:

  1. 分支(branch)和合并(merge) —— 同时开发新功能不影响主线

    • git branch feature/xxx 创建分支
    • git checkout feature/xxxgit switch feature/xxx 切换分支
    • git merge feature/xxx 合并分支回 main
    • git branch -d feature/xxx 删除已合并分支
  2. Pull Request 工作流 —— 团队协作的核心

    • 在分支上开发 → push 分支 → 在 GitHub 网页发 PR → 别人 review → merge
  3. .gitkeep —— 让 Git 追踪空文件夹的小技巧

    • Git 不追踪空文件夹,在里面放一个 .gitkeep 空文件即可
  4. git stash —— 临时存放未提交的改动

    • git stash 暂存当前改动并清空工作区
    • git stash pop 恢复刚暂存的改动
    • 适合:要紧急切分支修 bug 但当前改动还没改完
  5. git rebase —— 整理提交历史(进阶但很有用)

    • git rebase -i HEAD~3 交互式合并/修改最近 3 次提交
    • 让历史看起来更线性、清晰
  6. .gitattributes —— 比 .gitignore 更细致的属性控制

  7. 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 的真实记录整理。

Git 使用教程:从入门到推送 GitHub
https://mizuki.mysqil.com/posts/git使用/git使用教程/
作者
风过无痕
发布于
2026-05-04
许可协议
CC BY 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00