git

1. gitignore

.gitignore 文件用于指定哪些文件或目录在 Git 版本控制中被忽略。它可以避免将不必要的文件(如编译产物、临时文件等)提交到版本库中。

# 忽略特定文件
secret.txt
# 忽略特定目录
temp/
# 忽略特定目录下的所有文件(但保留temp目录本身)
# 如果 temp/ 目录是空的,Git 默认不会追踪空目录,通常要用 .gitkeep 之类的文件强制保留
temp/*
# 忽略特定目录下的所有 .tmp 文件
temp/*.tmp
# 忽略特定目录下的所有文件和子目录,但保留某个文件
temp/*
!temp/keep.txt
# 忽略特定目录下的所有文件和子目录,但保留某个目录
temp/*
!temp/keep/

2. 清除已跟踪的文件

不会删除 Git 提交历史中的文件,它 只删除工作区(working directory)和未跟踪的文件,不会影响 Git 版本库的提交记录:

git clean -n -d -x  # 预览即将删除的文件
git clean -f -d -x  # 确认无误后执行删除

3. 回退以前的提交

3.1 reset 硬回退

git reset --hard commit id

此时再推到远程仓库用 git push 会报错,需要用 git push -f 强推上去

3.2 revert 软回退

git revert -n commit id

此时会在当前分支上生成一个新的提交,内容是将指定的提交回退到当前分支的状态。 注意:-n 选项表示不会立即创建一个新的提交,而是将变更放入暂存区

4. 提交规范

4.1 提交信息的基本结构

一个标准的 Git 提交信息通常包括三部分:

<类型>(<范围>): <简短描述>

<详细描述>

<页脚注释>
  • 类型 (Type):描述提交的类别,指明提交的性质。
  • 范围 (Scope) :指定变更的具体模块、功能或文件。
  • 简短描述:对本次提交的简要总结。
  • 详细描述(可选):提供更详细的信息,解释为什么要做这个提交、如何做的、解决了什么问题等。
  • 页脚注释(可选):链接到项目管理工具中的任务、bug 或故事等。

4.2 常见的提交类型

这些类型通常是采用 Conventional Commits 标准的常见值,目的是使提交信息一致且具有结构化。

  1. fix: 类型 为 fix 的提交表示在代码库中修复了一个 bug。
  2. feat: 类型 为 feat 的提交表示在代码库中新增了一个功能。
  3. BREAKING CHANGE: 在脚注中包含 BREAKING CHANGE: 或 <类型>(范围) 后面有一个 ! 的提交,表示引入了破坏性 API 变更。 破坏性变更可以是任意类型提交的一部分。
  4. build: 用于修改项目构建系统,例如修改依赖库、外部接口或者升级 Node 版本等;
  5. chore: 用于对非业务性代码进行修改,例如修改构建流程或者工具配置等;
  6. ci: 用于修改持续集成流程,例如修改 Travis、Jenkins 等工作流配置;
  7. docs: 用于修改文档,例如修改 README 文件、API 文档等;
  8. style: 用于修改代码的样式,例如调整缩进、空格、空行等;
  9. refactor: 用于重构代码,例如修改代码结构、变量名、函数名等但不修改功能逻辑;
  10. perf: 用于优化性能,例如提升代码的性能、减少内存占用等;
  11. test: 用于修改测试用例,例如添加、删除、修改代码的测试用例等。

每次提交应该只包含一个逻辑变更,避免混合多个不相关的修改。

5. git全局配置推荐

[user]
    name = xx
    email = xx@xx.com

[http "https://github.com"]
    proxy = 127.0.0.1:7890       # GitHub 代理,可根据实际网络环境修改

[core]
    autocrlf = true              # 自动转换换行符,Windows 推荐 true,macOS/Linux 推荐 input
    quotepath = false            # 中文路径不再转义显示为 \uXXXX
    editor = code --wait         # 默认编辑器 VSCode,可改为 notepad 或 vim
    preloadindex = true          # 加快 git status 速度
    fscache = true               # Windows 下缓存文件系统信息,提高性能
    untrackedCache = true        # 加速未跟踪文件检测,特别是大仓库

[color]
    ui = auto                    # Git 命令输出自动彩色显示(log、diff 等)

[alias]
    st = status                  # git st → git status
    co = checkout                # git co → git checkout
    br = branch                  # git br → git branch
    ci = commit                  # git ci → git commit
    df = diff                     # git df → git diff
    lg = log --graph --decorate --pretty=format:'%C(yellow)%h%Creset -%C(cyan)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
                                  # 美观的提交历史,带分支、标签、图形化显示
    last = log -1 HEAD           # 查看最后一次提交
    unstage = reset HEAD --      # 取消暂存区文件
    amend = commit --amend --no-edit  # 修改最后一次提交但不更改提交信息

[diff]
    tool = vscode
    algorithm = histogram        # 更智能的 diff 算法,处理大文件和移动代码块更准确
    colorMoved = plain           # 启用移动代码块检测,显示更直观
    mnemonicPrefix = true        # diff 前缀更易理解
    renames = true               # 自动检测文件重命名
    indentHeuristic = true       # 更智能的 diff 块划分
    compactionHeuristic = true   # 优化 diff 输出可读性

[difftool "vscode"]
    cmd = code --wait --diff $LOCAL $REMOTE  # 使用 VSCode 作为 diff 工具

[merge]
    tool = vscode

[mergetool "vscode"]
    cmd = code --wait $MERGED                 # 使用 VSCode 作为 merge 工具

[pull]
    rebase = false              # 避免默认 rebase,可根据个人习惯改 true

[push]
    default = simple            # 避免推送到错误分支
    autoSetupRemote = true      # 新建分支时自动设置上游分支
    followTags = true           # 推送 commit 时自动推送关联的 tag

[init]
    defaultBranch = master      # 初始化仓库默认分支名,可改为 main

[column]
    ui = auto                   # 列表命令自动对齐输出

[branch]
    sort = -committerdate       # 分支列表按最近提交时间排序

[tag]
    sort = version:refname      # 标签列表按版本号排序

[fetch]
    prune = true                # 自动删除远程已删除的分支
    pruneTags = true            # 自动删除远程已删除的标签
    # fetch.all 可选,根据项目是否多远程决定是否开启
    # git config --global fetch.all true

[help]
    autocorrect = prompt        # 输入命令有误时提示纠正,避免误操作

[commit]
    verbose = true              # 提交时显示 diff 内容,方便检查

[rerere]
    enabled = true              # 启用冲突重用功能
    autoupdate = true           # 自动应用已解决的冲突

[rebase]
    autoStash = true            # rebase 前自动 stash,完成后自动 pop
    autoSquash = true           # 自动处理 fixup!/squash! 提交
    missingCommitsCheck = warn  # 丢失提交时警告

[stash]
    showPatch = true            # stash show 默认显示 diff

[status]
    submoduleSummary = true     # 显示子模块变更摘要
    showStash = true            # 显示 stash 数量
    aheadBehind = true          # 显示分支领先/落后信息

[index]
    threads = true              # 多线程加速索引操作