# 常用技巧

2022年9月13日9分钟阅读

- FormalSciences/ComputerScience
- GettingStarted/VersionControl
- Git/Advanced

## Config 配置

Git 配置文件分为三级，系统级（—system）、用户级（—global）和目录级（—local），三者的使用优先级以离目录（repository）最近为原则，如果三者的配置不一样，则生效优先级 目录级>用户级>系统级。

- 系统级（/etc/gitconfig）：使用 —system 来进行配置，该配置对系统上所有用户及他们所拥有的仓库都生效的配置值。

    git config --system user.name "用户名"
    git config --system user.email "邮箱地址"`

- 用户级（~/.gitconfig）：使用 —global 来进行配置，该配置对当前用户上所有的仓库有效。

    git config --global user.name "用户名"
    git config --global user.email "邮箱地址"

- 目录级（.git/config）：使用 —local 来进行配置，只对当前仓库生效。

    git config --local user.name "用户名"
    git config --local user.email "邮箱地址"

## 设置默认分支

可以根据需求设置为系统级（—system）、用户级（—global）和目录级（—local）。

    git config --global init.defaultBranch <分支名称>

    # 设置默认分支 main
    git config --global init.defaultBranch main

## 多平台换行符问题 (LF or CRLF)

**文本文件所使用的换行符，在不同的系统平台上是不一样的。**UNIX/Linux 使用的是 0x0A（LF），早期的 Mac OS 使用的是 0x0D（CR），后来的 OS X 在更换内核后与 UNIX 保持一致了。但 DOS/Windows 一直使用 0x0D0A（CRLF） 作为换行符。

    # 提交时转换为LF，检出时转换为CRLF
    git config --global core.autocrlf true
    # 提交时转换为LF，检出时不转换
    git config --global core.autocrlf input
    # 提交检出均不转换
    git config --global core.autocrlf false
    # 拒绝提交包含混合换行符的文件
    git config --global core.safecrlf true
    # 允许提交包含混合换行符的文件
    git config --global core.safecrlf false
    # 提交包含混合换行符的文件时给出警告
    git config --global core.safecrlf warn

如果涉及到在多个系统平台上工作，推荐将 git 做如下配置：

    git config --global core.autocrlf input
    git config --global core.safecrlf true

## Alias 重命名别名

    git config --global alias.st status //status 缩写成 st
    git config --global alias.co checkout //checkout 缩写成 co
    git config --global alias.br branch //branch 缩写成 br
    git config --global alias.ci commit //commit 缩写成 ci

    alias g='git'
    alias ga='git add'
    alias gco='git checkout'
    alias gcb='git checkout -b'
    alias gcm='git checkout master'
    alias gcd='git checkout develop'
    alias gd='git diff'
    alias gf='git fetch'
    alias gfo='git fetch origin'
    alias gl='git pull'
    alias gp='git push'

Git 常用命令，可以根据实际需要创建缩写命令。

## GPG 签名提交

### 创建新的GPG 密钥

1. 生成 GPG 密钥对

    // 1.1 创建 GPG 密钥
    gpg --full-gen-key

    // 1.2 列出 GPG 密钥
    gpg --list-secret-keys --keyid-format LONG "your_email@example.com"

    // 1.3 复制 GPG 密钥 ID，以下示例复制 4AEA00A342C24CA3。
    sec   ed25519/4AEA00A342C24CA3 2021-09-14 [SC]
          6DE3507E82DEB6E8828FAAC34AEA00A342C24BD4
    uid                 [ 绝对 ] your_name "your_email@example.com"
    ssb   cv25519/812B586FD245B560 2021-09-14 [E]

    // 1.4 导出 GPG 公钥（以上述 ID 为例）
    gpg --armor --export 4AEA00A342C24CA3

2. 平台添加 GPG 公钥配置

将 GPG 公钥添加到 git 托管平台，例如 Github、Gitlab、Gitee 等。

3. 本地 Git 仓库关联 GPG 密钥

    // 3.1 列出 GPG 密钥
    gpg --list-secret-keys --keyid-format LONG "your_email@example.com"

    // 3.2 复制 GPG 密钥 ID，以下示例复制 4AEA00A342C24CA3。
    sec   ed25519/4AEA00A342C24CA3 2021-09-14 [SC]
          6DE3507E82DEB6E8828FAAC34AEA00A342C24BD4
    uid                 [ 绝对 ] your_name "your_email@example.com"
    ssb   cv25519/812B586FD245B560 2021-09-14 [E]

    // 3.3 本地 Git 仓库中配置该密钥，对 commit 提交进行签名。
    git config --global user.signingkey 4AEA00A342C24CA3

4. 签名 Git commit

运行 Git commit 命令时需要用到 `-S` 参数，如果不希望每次都要输入 `-S` 标志，可以配置默认签名。

    // 签名提交
    git commit -S -m "your_commit_message"

    // 开启默认签名提交
    git config --global commit.gpgsign true

5. 验证签名

最后可以推送签名提交到 git 托管平台，验证是否签名成功！

### 导入已有的 GPG 密钥

如果你已经有现成的 GPG 密钥，可以导入并使用。

1. 导入 GPG 私钥：

       gpg --import your_private_key_file

2. 导入 GPG 公钥：

       gpg --import your_public_key_file

3. 信任导入的 GPG 密钥：

       gpg --edit-key your_key_id
       gpg> trust
       gpg> 5 (ultimate trust)
       gpg> quit

4. 重复创建新的GPG 密钥中的第三步。

## 压缩提交记录

如果在新分支进行了多次提交，然后想合并到主分支。可以使用 —squash 选项，压缩合并提交。

    // 将目标分支的提交压缩为一个，然后合并分支
    git merge --squash <branchName>

## 忽略文件更改

- 未提交：添加忽略文件相对路径到 .gitignore 中即可。

- 已提交：`git rm --cached file`，添加忽略文件相对路径到 .gitignore 中即可。

## 配置 Git 的凭据存储

当使用 Git 进行代码管理时，你可以配置 Git 的凭据存储，这样就不需要每次都输入用户名和密码。下面是详细的步骤：

### 使用凭证缓存

1. 开启凭证缓存：

       git config --global credential.helper cache

2. 设置缓存超时时间（默认为 15 分钟，以下示例设置为 1 小时）：

       git config --global credential.helper 'cache --timeout=3600'

### 使用凭证管理器

Git for Windows 以及较新的 Git 版本提供了凭证管理器（Credential Manager），可以在多平台下存储和管理凭证。

1. Windows 用户：

       git config --global credential.helper manager

2. MacOS 用户：

       git config --global credential.helper osxkeychain

3. Linux 用户：

       git config --global credential.helper cache

### 使用凭证存储

这种方法会将凭证以纯文本的方式存储在磁盘上，安全性较低。

1. 开启凭证存储：

       git config --global credential.helper store

2. 第一次使用 Git 操作时输入用户名和密码后，凭证会被保存到磁盘。

3. 使用 `cat` 命令查看 `.git-credentials` 文件的内容：

       cat ~/.git-credentials

请注意，使用 `store` 凭据存储方式会将密码明文保存在磁盘上，所以请确保你的机器是安全的，并且不要在共享或公共设备上使用该功能。

## 全局的 Git 日志美化

可以使用 `git config --global format.pretty` 设置一个全局的 Git 日志格式化语句。

    git config --global format.pretty "%C(red)%h%C(reset) - %C(yellow)%d%C(reset) %s %C(green)(%cr) %C(bold blue)<%an>%C(reset)"

常用的配置选项及其描述：

配置选项 | 描述
--- | ---
`%H` | 提交的完整哈希字符串
`%h` | 提交的简短哈希字符串
`%T` | 树的完整哈希字符串
`%t` | 树的简短哈希字符串
`%P` | 父节点的完整哈希字符串
`%p` | 父节点的简短哈希字符串
`%an` | 作者的名字
`%ae` | 作者的电子邮件地址
`%ad` | 作者修订日期（可以用 —date=选项定制格式）
`%ar` | 作者修订日期，相对格式（例如，“2 weeks ago”）
`%cn` | 提交者的名字
`%ce` | 提交者的电子邮件地址
`%cd` | 提交日期
`%cr` | 提交日期，相对格式
`%s` | 提交信息标题
`%b` | 提交信息正文
`%Cred` | 文字颜色为红色
`%Cgreen` | 文字颜色为绿色
`%Cblue` | 文字颜色为蓝色
`%Creset` | 重置前面设置的颜色
`%C(yellow)` | 文字颜色为黄色
`%d` | 修饰（比如分支名，标签名）
`%D` | 修饰的完整列表