GIT工具

基本使用指令

# 设置你的基本信息
git config --global user.name "yourname"
git config --global user.email "you@example.com"
# 初始化仓库
git init
# 添加文件
git add *
# 提交本地
git commit # vim同款操作
git commit -m "评论"
# 添加远程源
git remote add origin <url>
# 提交到远程,缺省则是默认使用当前本地分支名
# git push <远程主机名> <本地分支名>:<远程分支名>
git push

# 有些鉴权方式比如说GUI支持账户+密码,纯终端一般需要你手动创建auth token使用它进行仓库管理

初学者可以配合GitHub Desktop或者VSCode进行辅助使用,此外一定要合理使用.gitignore减少仓库大小

诸如gitee相比GitHub更快(在中国),使用的流程基本上都差不多。

分支管理

分支用于隔离不同功能或修复任务,避免直接在主分支上修改。

# 查看本地分支(* 表示当前所在分支)
git branch
# 查看本地+远程分支
git branch -a
# 创建新分支
git branch feature/login
# 切换分支
git switch feature/login # 老命令也可以:git checkout feature/login
# 创建并切换到新分支
git switch -c feature/login # 老命令也可以:git checkout -b feature/login
# 开发完成后切回主分支
git switch main
# 将功能分支合并到当前分支
git merge feature/login
# 删除本地分支(已经合并)
git branch -d feature/login
# 强制删除本地分支(未合并也删除,谨慎)
git branch -D feature/login

远程分支常见操作

# 首次推送分支并建立上游追踪关系(后续可直接 git push)
git push -u origin feature/login
# 拉取远程更新(抓取并合并当前分支)
git pull
# 仅抓取远程更新,不自动合并
git fetch
# 删除远程分支
git push origin --delete feature/login

典型协作流程

  1. main 拉最新代码:git switch main + git pull

  2. 创建任务分支:git switch -c feature/xxx

  3. 本地开发并多次提交:git add + git commit

  4. 推送到远程:git push -u origin feature/xxx

  5. 发起 PR/MR,评审通过后合并到 main

  6. 删除无用分支(本地和远程)

合并冲突处理

git mergegit pull 出现冲突时:

  1. 用编辑器打开冲突文件,处理 <<<<<<< ======= >>>>>>> 标记

  2. 标记为已解决:git add <冲突文件>

  3. 完成合并提交:git commit

如果你在 rebase 过程中冲突:

# 解决冲突并 add 之后继续
git rebase --continue
# 放弃本次 rebase
git rebase --abort

分支命名建议

  • feature/xxx:新功能

  • fix/xxx:问题修复

  • hotfix/xxx:紧急修复

  • docs/xxx:文档更新

保持分支短生命周期、小步提交,可以显著降低冲突概率。

使用 git-filter-repo (Python包) 清理 .git

适用场景:误提交了大文件、密钥、敏感配置,或者历史里有不需要保留的目录。

注意:git filter-repo 会重写提交历史。已经推送到远程的仓库需要强制推送,并通知所有协作者重新同步。

1. 安装工具

python -m pip install git-filter-repo
# 验证
git filter-repo --help

2. 先做备份(建议)

# 推荐做一个镜像备份仓库
git clone --mirror <repo-url> repo-backup.git

3. 常见使用

# 删除历史中的某个文件(例如密钥)
git filter-repo --path .env --invert-paths
# 删除历史中的某个目录
git filter-repo --path secrets/ --invert-paths
# 删除历史中所有 .zip 文件
git filter-repo --path-glob *.zip --invert-paths
# 删除历史记录中所有大于 10M 的文件 (其实这个比较常用?)
git filter-repo --strip-blobs-bigger-than 10M --force
# 批量替换敏感字符串(先准备 replacements.txt)
# 格式示例:
# old_token==>REDACTED_TOKEN
git filter-repo --replace-text replacements.txt

4. 清理后检查(可选)

# 查看历史是否仍有目标文件
git log --all -- .env
# 查看仓库对象体积情况
git count-objects -vH

5. 推送到远程(重写历史后)

# 注意一下清理可能会干掉远程分支,建议先查看一下当前远程分支,如果分支没有了需要重新添加远程仓库
git remote -v
# 强制推送当前分支
git push origin --force --all
# 如有标签也一起更新
git push origin --force --tags

6. 协作者需要做的事

重写历史后,协作者本地旧历史会与远程冲突。最稳妥方式是:

  1. 备份本地未提交改动

  2. 重新克隆仓库

  3. 或者删除本地分支后基于新远程分支重建