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.gitgit remote set-url origin git@github.com-personal:username/repository.git
- 而
git@github.com:username/repository.git将采用默认的密钥,一般是 id_rsa
commitlint
| prefix | desc |
|---|---|
| build | 构建相关 |
| chore | 杂项 |
| ci | CI/CD 相关 |
| docs | 文档 |
| feat | 功能 |
| fix | 修复 |
| perf | 性能 |
| refactor | 重构 |
| revert | 回退 |
| style | 代码风格 |
| test | 测试 |
GitFlow
- 我个人常用的习惯并不是和 GitFlow 完全匹配的
- 在个人项目/小团队/小项目
- 如果一个 5 分钟就能修改好的 bugfix 也要新建分支/合并分支,显得太繁琐了。
- 所以我需要 develop 分支,小提交就直接在 develop 工作。
- 同样的,如果版本是逐个发布的,而不会同时准备多个版本的发布工作,
- 那么只需要 release 分支,发布完了就合并到 main 上面,再打 tag 就好了。
| compare | production | next release | public develop | feature |
|---|---|---|---|---|
| GitFlow | main | develop | none | feature/xxx |
| Pancake | main | release | develop | feature/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.