Git使用常识
第一部分:Git 常用命令(示范 + 参数解释)
以下命令覆盖日常使用,<...> 需替换为实际值。
git init:初始化仓库。git clone <repo-url> [dir]:克隆远端仓库到本地,可指定目录名。git remote add origin <repo-url>:添加远端;git remote -v查看;变更地址用git remote set-url origin <repo-url>。git status -sb:查看状态(-s简洁,-b显示分支)。git add <path>:暂存文件,-p交互式分块。git restore --staged <path>:从暂存区移除,保留工作区改动。git restore <path>(或git checkout -- <path>):丢弃工作区改动,慎用。git switch <branch>:切换分支;-c创建并切换;-C强制覆盖。git branch:列出分支;-r远端;-d/-D <branch>删除分支。git fetch [remote]:抓取更新;-p清理失效引用。git pull --rebase:拉取并变基,减少合并节点;--autostash拉取前自动暂存。git push origin <branch>:推送;-u设上游。git commit -m "<msg>":提交;-am跳过add(仅已跟踪文件)。git log --oneline --graph --decorate -n 20:最近 20 条提交,图示模式。git diff:工作区 vs 暂存区;--cached暂存区 vs HEAD;git diff <A>..<B>比较两提交。git stash push -m "note":暂存现场;list查看;pop取出删除。git tag -a v1.0.0 -m "msg":附注标签;push origin --tags推送。git revert <commit>:生成反向提交安全回滚;git reset --hard <commit>强制回滚(慎用)。git cherry-pick <commit>:挑单条提交。
Cheatlist:
1 | # 状态/差异 |
第二部分:Git 工作流
常见工作流速览
- Centralized:直接在 main 工作,简单但易冲突。
- Feature Branch(推荐):一需求一分支,完毕合并主干,便于审查和回滚。
- Gitflow:
develop/release/hotfix多分支,适合节奏固定的大项目。 - Trunk-Based:主干 + 短分支 + 频繁集成,需强 CI 和特性开关。
详解:Feature Branch 工作流
- 开分支:
git switch -c feature/brief-topic,小写连字符命名。 - 开发自测:按需多次提交;若是 Hexo 站点,生成前可跑
npm run clean && npm run build。 - 保持同步:开发中周期性
git fetch -p && git pull --rebase。 - 提交规范:原子提交、语义化 message;不要提交
public/等生成物。 - 推送与 PR:
git push -u origin feature/brief-topic,PR 描述改动、测试、影响面。 - 合并策略:倾向 squash/rebase 保持历史整洁;冲突先本地解决再推送。
- 收尾:合并后删除分支:
git push origin --delete feature/brief-topic与git branch -d feature/brief-topic。
典型场景速览:
- 小需求:单人一天内完成,直接 feature 分支 → 自测 → squash 合并。
- 中型需求:多人协作,分子任务分支(feature/a、feature/b),完成后先合入汇总分支再 PR,减少主干冲突。
- 热修复:从
main拉hotfix/issue-id,修完优先rebase确保最新,再合并并打 tag,随后清理分支。 - 长期特性:周期长的功能开启 feature flag,在主干小步合并,避免长期分叉;必要时周期性 rebase 降低冲突。
第三部分:Git commit message 推荐格式
格式与类型
- 使用 Conventional Commits:
<type>(<scope>): <subject>,scope可省略,subject用现在时/祈使句、不加句号。 - 常用 type:
feat(新功能)、fix(修 bug)、docs(文档)、style(格式)、refactor(重构)、test(测试)、chore(杂项)。
书写要点
- 主题行 ≤ 72 字符,写清对象+动作,避免“update/change”。
- 需要背景/测试/影响时,主题后空一行写正文;有破坏性改动用
BREAKING CHANGE:开头描述迁移。
示例 messages
feat(post): add bangumi summary blockfix(theme): correct navbar logo pathdocs: document bangumi update flowrefactor: extract hexo build helpertest: add bangumi data freshness testchore: bump hexo to 8.1.1
模板(含正文示范)
1 | fix(post): correct bangumi cover url |
解决Git合并冲突
git merge 冲突解决(current/incoming/ours/theirs)
- 准备:先
git fetch -p更新远端,必要时先git pull --rebase同步,减少无意义冲突。 - 合并命令:
git switch target && git merge source。 - 冲突出现后的完整流程:
git status查看冲突文件清单。- 打开冲突文件,找到标记:
<<<<<<<(current/ours,目标分支)=======分隔线,>>>>>>>(incoming/theirs,源分支)。 - 根据需要选择:
- 保留当前分支为主 → 选 ours/current 片段;
- 引入对方改动 → 选 theirs/incoming 片段;
- 两边都要 → 手工合并,删除标记,确保逻辑正确。
- 如需对比,用
git diff或支持的话git diff --base <file>查看共同祖先差异。 - 保存后对每个文件
git add <file>标记已解决,git status确认干净。 git commit完成合并(可在 message 中备注冲突点或解决策略)。
- 常见场景快速决策:
- 配置/文案被对方更新而本分支未改 → 选 theirs;
- 本分支大改,对方无关 → 选 ours;
- 同一函数双方都有逻辑 → 手工合并并本地跑一遍验证。
- 工具辅助:在支持的编辑器中可用“Accept Current/Incoming/Both”按钮,含义同 ours/theirs/both。
- 典型场景示例:
- 场景 A(多人改同文件不同段):优先用工具对比,分段保留两侧有效逻辑,再跑测试。
- 场景 B(配置或文档被上游更新):当前分支未改同处,直接选 theirs/incoming;若本地有调优则手工合并。
- 场景 C(功能大改 vs 小修):以大改分支为主(ours),手动引入小修里必要的逻辑和校验,再测试。
- 场景 D(仅格式冲突):可选一侧并统一跑格式化,避免重复的格式提交。
merge 与 rebase 的选择
- merge:保留分支合并节点,历史完整可追溯,适合多人并行、需要看到合流时间点;冲突只处理一次(合并时)。
- rebase:把你的提交重放到目标分支顶端,历史线性,便于 bisect 和阅读;但每个提交重放时都可能遇到冲突,需逐次解决。公共分支慎用 rebase(避免重写他人历史),本地/短期分支优先使用。
- 冲突标记的含义一致:rebase 时 current/ours 仍是当前分支正在重放的内容,incoming/theirs 是目标分支已有内容;按需选择或手工合并后
git add,继续git rebase --continue。
清理 git 历史(含重写与回滚)
场景快速决策:
- 线上回滚:公共分支用
git revert生成反向提交,保持历史,紧急时优先。 - 本地整理提交:未推送前用
git reset --soft/--mixed或git rebase -i重排、squash;推送后谨慎,需团队确认并可能强推。 - 精选引入:只要某几个提交,用
git cherry-pick;自测后再推。 - 临时切换任务:用
git stash push -m暂存工作,回到主线处理其他事,完了再stash pop/apply。 - 里程碑标记:发布或重要节点打
git tag -a,推送--tags便于回溯。 - 敏感信息/大批量历史清理:新分支用
git filter-repo演练,备份后强推,通知协作者fetch --all并按指引重置。
回滚与整理(安全到激进)
- 公共分支安全回滚:
git revert <commit>生成反向提交,保持历史可追溯。 - 本地未推送的整理:
git reset --soft <commit>(保留暂存)或--mixed(保留工作区)重排提交;--hard重写工作区+暂存,需团队确认并可能git push -f。 - 语义清理:
git rebase -i HEAD~N进行 squash/fixup/重排。rebase 冲突时:current/ours=目标分支当前内容,incoming/theirs=正在重放的补丁;修冲突后git add、git rebase --continue,跳过用--skip,放弃用--abort。
抽取与选择性合并
git cherry-pick <commit>(或区间A..B)提取少量提交,不合并整个分支;冲突处理同 rebase,完成后自测。
暂存现场与里程碑
- stash:
git stash push -m "note"临时保存未完成改动,便于先切分支/拉更新;恢复用git stash apply(保留)或pop(恢复并删除)。 - tag:
git tag -a v1.0.0 -m "release"标记里程碑,git push origin --tags推送;删除标签git tag -d v1.0.0+git push origin :refs/tags/v1.0.0。
批量重写/删敏
- 首选
git filter-repo(替代 filter-branch),示例:- 删除路径:
git filter-repo --path secrets.txt --invert-paths - 替换敏感信息:
git filter-repo --replace-text replacements.txt
- 删除路径:
- 操作流程:在新分支演练 → 备份 → 跑构建/测试 → 团队确认 → 强推 → 通知协作者
git fetch --all后按指引重置本地。
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Martian Cats!