本文最后更新于4 天前,其中的信息可能已经过时,如有错误请发送邮件到528407262@qq.com
本文档记录了将本地 Apollo_PnC 工程推送到 GitHub 仓库,并通过
.gitignore实现文件过滤的完整流程。
📋 目录
1. 项目背景与目标
1.1 场景描述
- 本地工程: Apollo_PnC(位于 WSL 环境)
- 目标仓库: https://github.com/mo-fishkiller/APOLLO_EDU_WORKSPACE
- 核心需求: 只上传特定文件(配置文件、文档),过滤掉构建产物、IDE配置、临时文件等
1.2 最终成果
GitHub 仓库只包含:
📁 APOLLO_EDU_WORKSPACE/
├── .gitignore
├── README.md
├── README_cn.md
└── profiles/sample/modules/... (配置文件)
2. 环境准备
2.1 检查环境
# 确认 Git 已安装
git --version
# 确认当前目录
pwd
# 查看本地文件结构
ls -la
2.2 创建 GitHub 仓库
- 访问 GitHub: https://github.com
- 点击右上角 “+” → “New repository”
- 填写仓库名:
APOLLO_EDU_WORKSPACE - 选择 Public 或 Private
- ⚠️ 不要勾选 “Initialize this repository with a README”(保持空白)
- 点击 “Create repository”
3. 配置 .gitignore
3.1 编写 .gitignore 规则
创建或编辑 .gitignore 文件:
# 使用编辑器打开
nano .gitignore
# 或
vim .gitignore
写入以下内容:
# ========== 忽略所有内容 ==========
# 忽略根目录下所有文件和文件夹
/*
/.*
# ========== 白名单:保留根目录特定文件 ==========
!.gitignore
!README.md
!README_cn.md
# ========== 白名单:保留特定目录及其全部内容 ==========
# 先保留目录本身(否则无法进入目录)
!/modules/
!/profiles/
# 再保留目录内的所有文件和子目录
!/modules/**
!/profiles/**
# ========== 额外忽略(可选) ==========
# 忽略所有 .vscode 目录
**/.vscode/
3.2 规则说明
| 规则 | 作用 |
|---|---|
/* | 忽略根目录下所有文件(非递归) |
/.* | 忽略根目录下所有隐藏文件 |
!.gitignore | 例外:保留 .gitignore 文件 |
!/modules/ | 例外:保留 modules 目录本身 |
!/modules/** | 例外:保留 modules 目录下所有内容 |
**/.vscode/ | 忽略所有层级的 .vscode 目录 |
💡 重要:
!开头的规则必须写在忽略规则之后,Git 按顺序处理规则。
4. 初始化与配置仓库
4.1 初始化 Git 仓库
# 进入工程目录
cd /home/morobot/application-pnc
# 初始化 Git(如果尚未初始化)
git init
# 查看当前状态
git status
4.2 配置远程仓库
# 查看现有远程配置
git remote -v
# 如果 origin 不存在,添加远程仓库
git remote add origin https://github.com/mo-fishkiller/APOLLO_EDU_WORKSPACE.git
# 如果 origin 已存在,修改 URL
git remote set-url origin https://github.com/mo-fishkiller/APOLLO_EDU_WORKSPACE.git
# 验证配置
git remote -v
预期输出:
origin https://github.com/mo-fishkiller/APOLLO_EDU_WORKSPACE.git (fetch)
origin https://github.com/mo-fishkiller/APOLLO_EDU_WORKSPACE.git (push)
4.3 首次提交 .gitignore
# 添加 .gitignore 到暂存区
git add .gitignore
# 提交
git commit -m "chore: add .gitignore with whitelist rules"
5. 清理已追踪文件
5.1 问题诊断
关键问题: .gitignore 只对未追踪的文件生效。如果文件之前已被 git add,修改 .gitignore 不会自动移除它们。
# 查看 Git 当前追踪的所有文件
git ls-files
# 查看最近提交涉及的文件
git diff-tree --no-commit-id --name-only -r HEAD~3..HEAD | sort | uniq
典型输出(包含不需要的文件):
.buildtool.conf.aarch64
.buildtool.conf.x86_64
.clang-format
.editorconfig
.env.aarch64
.env.x86_64
.vscode/c_cpp_properties.json
.vscode/settings.json
.workspace.json.aarch64
.workspace.json.x86_64
WORKSPACE
core/BUILD
core/cyberfile.xml
kill_all.sh
setup.sh
...
5.2 清除 Git 缓存(核心步骤)
# ⚠️ 关键命令:从 Git 索引移除所有文件(不删除本地文件!)
git rm -r --cached .
参数说明:
rm: 从仓库移除文件-r: 递归处理目录--cached: 只从 Git 索引移除,保留本地磁盘文件(安全!).: 当前目录下的所有文件
5.3 重新添加文件
# 重新添加文件(此时 .gitignore 规则生效)
git add .
# 查看暂存区状态
git status
预期输出:
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: .buildtool.conf.aarch64
deleted: .clang-format
deleted: WORKSPACE
deleted: core/BUILD
...
modified: .gitignore
new file: profiles/sample/modules/...
5.4 验证过滤结果
# 查看当前暂存区的文件
git diff --cached --name-only
# 或查看 Git 追踪的文件
git ls-files
预期结果(只保留白名单文件):
.gitignore
README.md
README_cn.md
profiles/sample/modules/canbus/conf/canbus.conf
profiles/sample/modules/canbus/conf/canbus_conf.pb.txt
profiles/sample/modules/common/data/vehicle_param.pb.txt
...
5.5 提交清理结果
# 提交过滤后的文件结构
git commit -m "chore: apply .gitignore filter, untrack build/IDE/config files"
6. 推送至远程仓库
6.1 设置主分支
# 确保分支名为 main(GitHub 默认)
git branch -M main
6.2 推送到 GitHub
# 首次推送并设置上游分支
git push -u origin main
参数说明:
-u: 设置 upstream(上游分支),后续可直接使用git push
6.3 认证方式
方式 A: HTTPS + Token(推荐临时使用)
# 推送时会提示:
Username for 'https://github.com': mo-fishkiller
Password for 'https://mo-fishkiller@github.com':
# ⚠️ 密码处输入 GitHub Personal Access Token(不是登录密码!)
# 生成 Token: https://github.com/settings/tokens
方式 B: SSH(推荐长期使用)
# 1. 修改远程 URL 为 SSH
git remote set-url origin git@github.com:mo-fishkiller/APOLLO_EDU_WORKSPACE.git
# 2. 生成 SSH 密钥(如果尚未生成)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 3. 查看公钥
cat ~/.ssh/id_ed25519.pub
# 4. 将公钥添加到 GitHub
# 👉 https://github.com/settings/keys
# 5. 测试连接
ssh -T git@github.com
# 6. 再次推送
git push -u origin main
6.4 后续推送
# 设置上游分支后,后续只需:
git add .
git commit -m "feat: add new feature"
git push
7. 验证结果
7.1 命令行验证
# 查看远程仓库的文件树
git ls-tree -r --name-only origin/main
# 查看远程分支信息
git branch -r
# 查看远程仓库 URL
git remote -v
7.2 GitHub 网页验证
访问仓库页面:
👉 https://github.com/mo-fishkiller/APOLLO_EDU_WORKSPACE
检查项:
- ✅ 只包含
.gitignore,README*.md,profiles/等白名单文件 - ✅ 没有
.vscode/,build/,WORKSPACE,.env.*等文件 - ✅ 提交历史显示最新的过滤提交
7.3 本地状态检查
# 确认工作区干净
git status
# 预期输出:
# On branch main
# Your branch is up to date with 'origin/main'.
# nothing to commit, working tree clean
8. Git 常用指令大全
8.1 仓库初始化与配置
# 初始化新仓库
git init
# 克隆远程仓库
git clone <url>
git clone <url> <directory-name>
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin <url>
# 修改远程仓库 URL
git remote set-url origin <new-url>
# 删除远程仓库
git remote remove origin
# 查看远程仓库详细信息
git remote show origin
8.2 文件状态与查看
# 查看仓库状态
git status
git status -s # 简洁格式
# 查看当前分支
git branch
git branch -a # 查看所有分支(包括远程)
git branch -r # 只看远程分支
# 查看提交历史
git log
git log --oneline # 简洁格式
git log --oneline -10 # 最近10条
git log --graph # 图形化显示
# 查看 Git 追踪的文件
git ls-files
git ls-files -s # 显示详细信息
# 查看被忽略的文件
git ls-files -o --ignored --exclude-standard
# 查看文件差异
git diff # 工作区 vs 暂存区
git diff --cached # 暂存区 vs HEAD
git diff HEAD~1 # 当前 vs 上一次提交
# 查看某次提交的文件
git show --stat <commit-hash>
git diff-tree --no-commit-id --name-only -r <commit-hash>
8.3 暂存与提交
# 添加文件到暂存区
git add <file>
git add . # 添加所有文件
git add -A # 添加所有变更(包括删除)
git add -u # 只添加已追踪的文件
# 预览 add 效果
git add --dry-run .
# 从暂存区移除
git restore --staged <file>
git reset HEAD <file> # 旧版本语法
# 提交
git commit -m "提交信息"
git commit -am "信息" # 添加并提交已追踪的文件
# 修改上一次提交
git commit --amend -m "新的提交信息"
git commit --amend --no-edit # 不修改信息,只添加文件
# 撤销提交(保留修改)
git reset HEAD~1
git reset --soft HEAD~1
# 彻底撤销提交(删除修改)
git reset --hard HEAD~1
8.4 .gitignore 相关
# 清除 Git 缓存(从索引移除,保留本地文件)
git rm -r --cached .
git rm --cached <file>
# 重新应用 .gitignore 规则
git rm -r --cached . && git add .
# 检查文件为何被忽略
git check-ignore -v <file>
git check-ignore -v *.log
# 查看 .gitignore 规则匹配
git check-ignore -v -n <file>
# 强制添加被忽略的文件
git add -f <file>
8.5 分支管理
# 创建分支
git branch <branch-name>
# 切换分支
git checkout <branch-name>
git switch <branch-name> # Git 2.23+
# 创建并切换分支
git checkout -b <branch-name>
git switch -c <branch-name>
# 重命名分支
git branch -m <new-name>
# 删除分支
git branch -d <branch-name> # 安全删除
git branch -D <branch-name> # 强制删除
# 合并分支
git merge <branch-name>
# 查看分支合并情况
git branch --merged
git branch --no-merged
8.6 远程操作
# 推送
git push origin <branch>
git push -u origin main # 首次推送并设置上游
git push --all origin # 推送所有分支
git push --tags # 推送标签
# 强制推送(⚠️ 谨慎使用)
git push -f origin main
git push --force-with-lease origin main # 更安全的强制推送
# 拉取
git pull origin main
git pull --rebase origin main # 变方式拉取
# 获取远程更新(不合并)
git fetch origin
git fetch --all
# 查看远程分支
git branch -r
git branch -a
# 追踪远程分支
git checkout -b <local-branch> origin/<remote-branch>
git branch --set-upstream-to=origin/<branch> <branch>
8.7 标签管理
# 查看标签
git tag
git tag -l "v1.*"
# 创建标签
git tag v1.0.0
git tag -a v1.0.0 -m "版本 1.0.0" # 附注标签
# 推送标签
git push origin v1.0.0
git push origin --tags
# 删除标签
git tag -d v1.0.0
git push origin --delete v1.0.0
8.8 撤销与恢复
# 丢弃工作区修改
git restore <file>
git restore . # 丢弃所有修改
git checkout -- <file> # 旧版本语法
# 撤销暂存
git restore --staged <file>
git reset HEAD <file>
# 撤销提交
git reset HEAD~1 # 保留修改
git reset --hard HEAD~1 # 删除修改
# 恢复删除的文件
git checkout <commit-hash> -- <file>
# 查看操作历史
git reflog
8.9 清理与维护
# 清理未追踪的文件
git clean -n # 预览
git clean -f # 执行
git clean -fd # 包括目录
git clean -fdx # 包括忽略的文件
# 垃圾回收
git gc
git gc --prune=now
# 查看仓库大小
git count-objects -vH
# 修剪远程分支
git fetch --prune
git remote prune origin
8.10 高级操作
# 变基
git rebase <branch>
git rebase -i HEAD~3 # 交互式变基
# 暂存更改
git stash
git stash list
git stash pop
git stash apply
git stash drop
# 拣选提交
git cherry-pick <commit-hash>
# 二分查找 bug
git bisect start
git bisect bad
git bisect good <commit-hash>
git bisect reset
# 查看谁修改了代码
git blame <file>
git log -p <file>
8.11 配置与别名
# 查看配置
git config --list
git config --global --list
# 设置配置
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
git config --global core.editor "vim"
git config --global init.defaultBranch main
# 创建别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage "reset HEAD --"
git config --global alias.last "log -1 HEAD"
# 使用别名
git st # 等同于 git status
git co -b feature # 等同于 git checkout -b feature
9. Linux 常用指令
9.1 文件与目录操作
# 查看当前目录
pwd
# 列出文件
ls
ls -l # 详细信息
ls -a # 显示隐藏文件
ls -la # 组合
ls -lh # 人类可读大小
ls -t # 按时间排序
ls -S # 按大小排序
# 切换目录
cd /path/to/dir
cd .. # 返回上级
cd ~ # 返回家目录
cd - # 返回上一个目录
cd $OLDPWD # 同上
# 创建目录
mkdir dirname
mkdir -p a/b/c # 递归创建
mkdir dir1 dir2 # 创建多个
# 创建文件
touch filename
echo "content" > filename
echo "line1" >> filename # 追加
# 复制
cp file1 file2
cp -r dir1 dir2 # 递归复制目录
cp -i file1 file2 # 覆盖前提示
cp -u file1 file2 # 只复制更新的
# 移动/重命名
mv oldname newname
mv file /path/to/dir
mv -i file1 file2 # 覆盖前提示
# 删除
rm file
rm -r dirname # 递归删除目录
rm -f file # 强制删除
rm -rf dirname # ⚠️ 强制递归删除(危险!)
rm -i file # 删除前提示
9.2 文件查看与编辑
# 查看文件内容
cat filename
less filename # 分页查看(按 q 退出)
more filename # 分页查看
head filename
head -n 20 filename # 前20行
tail filename
tail -f logfile # 实时查看(Ctrl+C 退出)
tail -n 50 logfile # 后50行
# 文本编辑器
nano filename # 简单编辑器
vim filename # 高级编辑器
vi filename # vi 编辑器
code filename # VS Code
# Vim 基础命令
# i - 进入插入模式
# Esc - 退出插入模式
# :w - 保存
# :q - 退出
# :wq - 保存并退出
# :q! - 强制退出不保存
# /keyword - 搜索
# n - 下一个匹配
# dd - 删除一行
# yy - 复制一行
# p - 粘贴
9.3 文件搜索
# 查找文件
find /path -name "filename"
find . -name "*.py" # 查找 Python 文件
find . -type f -name "*.txt" # 只查找文件
find . -type d -name "build" # 只查找目录
find . -size +100M # 大于 100M
find . -mtime -7 # 7天内修改过
# 查找内容
grep "keyword" filename
grep -r "keyword" . # 递归搜索
grep -i "keyword" file # 忽略大小写
grep -l "keyword" . # 只显示文件名
grep -n "keyword" file # 显示行号
grep -v "keyword" file # 反向匹配
grep -E "pattern" file # 扩展正则
# 组合使用
find . -name "*.py" | xargs grep "def main"
grep -r "TODO" --include="*.py" .
9.4 权限与所有权
# 查看权限
ls -l
# 权限说明
# -rwxr-xr-x
# 文件类型(rwx)用户(rwx)组(rwx)其他
# r=4, w=2, x=1
# 修改权限
chmod +x script.sh # 添加执行权限
chmod -x script.sh # 移除执行权限
chmod 755 file # rwxr-xr-x
chmod 644 file # rw-r--r--
chmod 600 file # rw-------
chmod -R 755 dir/ # 递归修改
# 修改所有者
chown user:group file
chown -R user:group dir/ # 递归修改
sudo chown root:root file # 需要 sudo
9.5 压缩与解压
# tar
tar -czvf archive.tar.gz dir/ # 压缩为 .tar.gz
tar -xzvf archive.tar.gz # 解压 .tar.gz
tar -cjvf archive.tar.bz2 dir/ # 压缩为 .tar.bz2
tar -xjvf archive.tar.bz2 # 解压 .tar.bz2
tar -tf archive.tar.gz # 查看内容
# zip
zip -r archive.zip dir/ # 压缩
unzip archive.zip # 解压
unzip -l archive.zip # 查看内容
zip -d archive.zip file # 删除文件
# gzip
gzip file # 压缩为 .gz
gunzip file.gz # 解压
gzip -d file.gz # 同上
9.6 系统信息
# 系统信息
uname -a # 所有信息
uname -r # 内核版本
cat /etc/os-release # 系统版本
hostname # 主机名
# 磁盘空间
df -h # 文件系统使用
df -i # inode 使用
du -sh dirname # 目录大小
du -h --max-depth=1 # 一级子目录大小
du -ah | sort -hr | head -10 # Top 10 大文件
# 内存
free -h # 内存使用
free -m # 以 MB 显示
# CPU
lscpu # CPU 信息
nproc # CPU 核心数
top # 实时进程监控
htop # 增强版 top
# 网络
ip addr # IP 地址
ifconfig # 旧版命令
ping google.com # 测试连通性
curl ifconfig.me # 查看公网 IP
9.7 进程管理
# 查看进程
ps aux # 所有进程
ps aux | grep python # 搜索进程
top # 实时监控
htop # 增强版
# 查看端口
netstat -tuln # 监听端口
ss -tuln # 新版命令
lsof -i :8080 # 查看端口占用
# 进程控制
kill PID # 终止进程
kill -9 PID # 强制终止
kill -15 PID # 优雅终止
pkill processname # 按名称终止
killall processname # 同上
# 后台运行
command & # 后台运行
jobs # 查看作业
fg %1 # 带到前台
bg %1 # 后台继续
nohup command & # 退出终端后继续运行
9.8 网络相关
# 下载文件
wget url
wget -O filename url # 指定文件名
wget -c url # 断点续传
curl -O url # 下载
curl -o filename url # 指定文件名
# 网络测试
ping host # 测试连通性
traceroute host # 路由追踪
mtr host # 结合 ping 和 traceroute
# 端口扫描
n localhost # 扫描本地端口
n -p 80,443 host # 扫描指定端口
# SSH
ssh user@host # 远程连接
ssh -p 2222 user@host # 指定端口
scp file user@host:/path # 复制文件
scp user@host:/path/file . # 下载文件
9.9 管道与重定向
# 重定向
command > file # 覆盖输出
command >> file # 追加输出
command 2> error.log # 重定向错误
command > file 2>&1 # 重定向所有输出
command &> file # 同上(bash)
# 管道
ls -la | grep ".git"
cat file | wc -l # 统计行数
ps aux | grep python | wc -l # 统计进程数
# xargs
find . -name "*.txt" | xargs rm
find . -name "*.jpg" | xargs -I {} mv {} backup/
cat files.txt | xargs -n 1 # 每次处理1个
# tee(同时输出到屏幕和文件)
command | tee output.log
command | tee -a output.log # 追加
9.10 WSL 特有指令
# 访问 Windows 文件
cd /mnt/c/Users/username
cd /mnt/d/Projects
# 在 Windows 中打开
explorer.exe . # 打开当前目录
code . # VS Code 打开
notepad.exe file.txt # 记事本打开
# Windows 命令
/mnt/c/Windows/System32/cmd.exe /c dir
powershell.exe -Command "Get-Process"
# 网络
# WSL2 中 localhost 可能不互通,使用 Windows IP
cat /etc/resolv.conf # 查看 nameserver
10. 常见问题与解决方案
10.1 .gitignore 不生效
问题: 修改了 .gitignore,但文件仍然被追踪。
原因: .gitignore 只对未追踪的文件生效。
解决方案:
# 清除缓存并重新添加
git rm -r --cached .
git add .
git commit -m "apply gitignore"
10.2 误提交了敏感文件
问题: 不小心提交了密码、密钥等敏感文件。
解决方案:
# 1. 从最近一次提交移除
git reset HEAD~1
# 编辑 .gitignore 添加敏感文件
git add .
git commit -m "..."
# 2. 如果已推送,从历史中彻底删除
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch path/to/secret" \
--prune-empty --tag-name-filter cat -- --all
# 强制推送
git push origin --force --all
10.3 推送被拒绝
问题: git push 提示 “rejected”。
原因: 远程仓库有本地没有的提交。
解决方案:
# 方案1: 先拉取再推送
git pull origin main
git push origin main
# 方案2: 变基后推送
git pull --rebase origin main
git push origin main
# 方案3: 强制推送(⚠️ 会覆盖远程)
git push -f origin main
10.4 忘记添加文件
问题: 提交后发现漏了文件。
解决方案:
# 添加遗漏的文件
git add forgotten_file.txt
# 修改上一次提交
git commit --amend --no-edit
# 推送(需要强制)
git push -f origin main
10.5 分支名称不一致
问题: 本地是 master,远程是 main。
解决方案:
# 重命名本地分支
git branch -m master main
# 设置上游分支
git push -u origin main
10.6 大文件误提交
问题: 提交了大文件导致仓库体积过大。
解决方案:
# 使用 Git LFS(Large File Storage)
git lfs install
git lfs track "*.psd"
git lfs track "*.zip"
# 或者从历史中移除
git filter-branch --tree-filter 'rm -f largefile.zip' HEAD
git push -f origin main
10.7 认证失败
问题: HTTPS 推送时认证失败。
解决方案:
# 方案1: 使用 Personal Access Token
# 生成 Token: https://github.com/settings/tokens
# 使用 Token 代替密码
# 方案2: 切换到 SSH
git remote set-url origin git@github.com:user/repo.git
# 方案3: 保存凭证
git config --global credential.helper cache
# 或永久保存
git config --global credential.helper store
10.8 冲突解决
问题: 合并或拉取时出现冲突。
解决方案:
# 1. 查看冲突文件
git status
# 2. 编辑冲突文件(解决 <<<<<<< 和 >>>>>>> 标记)
# 3. 标记为解决
git add resolved_file.txt
# 4. 完成合并
git commit
# 或取消合并
git merge --abort
10.9 恢复删除的文件
问题: 误删了重要文件。
解决方案:
# 从最近一次提交恢复
git checkout HEAD -- filename
# 从指定提交恢复
git checkout <commit-hash> -- filename
# 查看文件历史
git log -- filename
git reflog
10.10 查看谁修改了代码
问题: 想知道某行代码是谁、何时修改的。
解决方案:
# 查看文件每一行的作者
git blame filename
# 查看具体提交
git show <commit-hash>
# 查看文件修改历史
git log -p filename
git log --stat filename
📌 快速参考卡片
Git 核心流程
# 日常开发
git pull origin main
git checkout -b feature/new-feature
# ... 编写代码 ...
git add .
git commit -m "feat: add new feature"
git push -u origin feature/new-feature
# 创建 Pull Request
# 应用 .gitignore
git rm -r --cached .
git add .
git commit -m "chore: apply gitignore"
git push
常用组合
# 查看状态并清理
git status && git clean -fdn
# 查看大文件
find . -type f -size +100M -exec ls -lh {} \;
# 统计代码行数
find . -name "*.py" -o -name "*.cpp" | xargs wc -l
# Git 忽略并提交
git rm -r --cached . && git add . && git commit -m "apply gitignore"
# 查看磁盘使用 Top 10
du -h --max-depth=1 | sort -hr | head -10
快捷别名(添加到 ~/.gitconfig)
[alias]
st = status
co = checkout
br = branch
ci = commit
last = log -1 HEAD
unstage = reset HEAD --
visual = !gitk
📚 学习资源
- 官方文档: https://git-scm.com/doc
- Pro Git 书籍: https://git-scm.com/book/zh/v2
- GitHub 指南: https://docs.github.com/zh/get-started
- Git 可视化学习: https://learngitbranching.js.org/
- Linux 命令手册: https://man7.org/linux/man-pages/
文档版本: v1.0
最后更新: 2026-04-12
作者: mo-fishkiller
如有问题或建议,欢迎在 GitHub 提交 Issue!