Post

Git技巧

Git技巧

GitHub SSH KEY

  • 如果已有密钥文件,则只需要把公钥文件内容拷贝到 github 页面
  • 如果还没有密钥,则参考下面命令创建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    cd ~/.ssh/
    ssh-keygen -t rsa -b 4096 -C "your@email.com"
    
    # 如果在docker内,需要手动启动ssh-agent
    eval "$(ssh-agent -s)"
    
    ssh-add id_rsa
    cat id_rsa.pub
    # 把pub文件内容拷贝到github页面
    
  • 多个 GitHub 账号,需要额外配置 SSH Config

    • GitHub 不允许同一个密钥配置给多个账号,所以必须使用多个密钥
    • 多个密钥需要 SSH Config 配置指导提交时 SSH 采用哪个密钥

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      
      # 在 ~/.ssh/config 文件中配置
      # 第一个 GitHub 账号(个人账号)
      Host github.com-personal
          HostName github.com
          User git
          IdentityFile ~/.ssh/id_rsa
          IdentitiesOnly yes
      
      # 第二个 GitHub 账号(工作账号)
      Host github.com-work
          HostName github.com
          User git
          IdentityFile ~/.ssh/id_rsa_work
          IdentitiesOnly yes
      
    • 对应仓库的远程 URL 需要改成:
      • git remote set-url origin git@github.com-work:username/repository.git
      • git remote set-url origin git@github.com-personal:username/repository.git
    • git@github.com:username/repository.git将采用默认的密钥,一般是 id_rsa

commitlint

prefixdesc
build构建相关
chore杂项
ciCI/CD 相关
docs文档
feat功能
fix修复
perf性能
refactor重构
revert回退
style代码风格
test测试

GitFlow

  • 我个人常用的习惯并不是和 GitFlow 完全匹配的
  • 在个人项目/小团队/小项目
    • 如果一个 5 分钟就能修改好的 bugfix 也要新建分支/合并分支,显得太繁琐了。
    • 所以我需要 develop 分支,小提交就直接在 develop 工作。
    • 同样的,如果版本是逐个发布的,而不会同时准备多个版本的发布工作,
    • 那么只需要 release 分支,发布完了就合并到 main 上面,再打 tag 就好了。
compareproductionnext releasepublic developfeature
GitFlowmaindevelopnonefeature/xxx
Pancakemainreleasedevelopfeature/xxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git flow init
git flow status

# 新功能开发
git flow feature start <feature-name>
git flow feature finish <feature-name>

# 版本发布
git flow Release start <version>
git flow Release finish <version>

# 紧急修复,基于已发布版本修复BUG,并且需要尽快发布更新
git flow hotfix start <version>
git flow hotfix finish <version>

# Bug 修复
git flow bugfix start <bugfix-name>
git flow bugfix finish <bugfix-name>

修改历史的作者

迁移仓库后,不同平台的账号和邮箱不一致,希望修正过来。 在大型仓库/多人协作仓库要慎重。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 修改本地历史的用户和邮箱
git filter-branch -f --env-filter '
OLD_EMAIL="old@email.com"
CORRECT_NAME="pancake-lee"
CORRECT_EMAIL="pancake-lee@outlook.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

# 删除全局用户和邮箱
git config --global --unset user.name
git config --global --unset user.email

# 修改当前仓库的用户和邮箱
git config user.name "pancake-lee"
git config user.email "pancake-lee@outlook.com"

# 强制推送(覆盖)远程
git push --force-with-lease --tags origin 'refs/heads/*'

删除历史中的大文件

只修改部分分支是没有用的,因为其他分支可能基于这些旧提交。 必须拉所有远程分支为本地分支,工具才会对所有分支进行操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
git fetch --all

python git-filter-repo --analyze
python git-filter-repo --force --invert-paths --path abc.zip
python git-filter-repo --force --invert-paths --path-glob *.zip

# 清除各种本地缓存,会把stashes也删了
rm -rf .git/refs/original/
# reflog存储了默认90天内所有本地变更历史记录,包括stash。该命令标记所有记录立刻过期,实际被删除发生在prune
git reflog expire --expire=now --all
# 主动触发垃圾回收
git gc --prune=now
# 激进优化模式,Git会更深度地压缩历史数据
git gc --aggressive --prune=now

git push -f --all
git push -f --tags
This post is licensed under CC BY 4.0 by the author.