2022-09-13 16:13:32 +08:00
|
|
|
|
---
|
|
|
|
|
title: 常用技巧
|
|
|
|
|
description: Git 常用技巧
|
|
|
|
|
keywords:
|
2023-11-09 17:30:33 +08:00
|
|
|
|
- Git
|
|
|
|
|
- 技巧
|
2022-09-13 16:13:32 +08:00
|
|
|
|
tags:
|
2024-10-14 16:48:38 +08:00
|
|
|
|
- FormalSciences/ComputerScience
|
|
|
|
|
- GettingStarted/VersionControl
|
|
|
|
|
- Git/Advanced
|
2022-09-13 16:13:32 +08:00
|
|
|
|
author: 7Wate
|
|
|
|
|
date: 2022-09-13
|
|
|
|
|
---
|
2022-10-06 23:45:05 +08:00
|
|
|
|
|
2022-11-16 18:00:21 +08:00
|
|
|
|
## Config 配置
|
2022-10-09 14:55:57 +08:00
|
|
|
|
|
|
|
|
|
Git 配置文件分为三级,系统级(--system)、用户级(--global)和目录级(--local),三者的使用优先级以离目录(repository)最近为原则,如果三者的配置不一样,则生效优先级 **目录级>用户级>系统级**。
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
- **系统级**(/etc/gitconfig):使用 **--system** 来进行配置,该配置**对系统上所有用户及他们所拥有的仓库都生效**的配置值。
|
2022-10-09 14:55:57 +08:00
|
|
|
|
|
2022-11-16 18:00:21 +08:00
|
|
|
|
```shell
|
|
|
|
|
git config --system user.name "用户名"
|
|
|
|
|
git config --system user.email "邮箱地址"`
|
|
|
|
|
```
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
- **用户级**(~/.gitconfig):使用 **--global** 来进行配置,该配置**对当前用户上所有的仓库有效**。
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
git config --global user.name "用户名"
|
|
|
|
|
git config --global user.email "邮箱地址"
|
|
|
|
|
```
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
- **目录级**(.git/config):使用 **--local** 来进行配置,**只对当前仓库生效。**
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
git config --local user.name "用户名"
|
|
|
|
|
git config --local user.email "邮箱地址"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 设置默认分支
|
|
|
|
|
|
|
|
|
|
可以根据需求设置为**系统级(--system)、用户级(--global)和目录级(--local)**。
|
2022-10-16 16:23:25 +08:00
|
|
|
|
|
|
|
|
|
```shell
|
2022-11-16 18:00:21 +08:00
|
|
|
|
git config --global init.defaultBranch <分支名称>
|
2022-10-16 16:23:25 +08:00
|
|
|
|
```
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
```shell
|
|
|
|
|
# 设置默认分支 main
|
|
|
|
|
git config --global init.defaultBranch main
|
|
|
|
|
```
|
|
|
|
|
|
2023-12-29 11:21:57 +08:00
|
|
|
|
## 多平台换行符问题 (LF or CRLF)
|
2022-10-06 23:45:05 +08:00
|
|
|
|
|
|
|
|
|
**文本文件所使用的换行符,在不同的系统平台上是不一样的。**UNIX/Linux 使用的是 0x0A(LF),早期的 Mac OS 使用的是 0x0D(CR),后来的 OS X 在更换内核后与 UNIX 保持一致了。但 DOS/Windows 一直使用 0x0D0A(CRLF) 作为换行符。
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
# 提交时转换为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 做如下配置:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
git config --global core.autocrlf input
|
|
|
|
|
git config --global core.safecrlf true
|
|
|
|
|
```
|
2022-10-09 14:55:57 +08:00
|
|
|
|
|
2022-11-16 18:00:21 +08:00
|
|
|
|
## Alias 重命名别名
|
2022-10-09 14:55:57 +08:00
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
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
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
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 常用命令,可以根据实际需要创建缩写命令。
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
## GPG 签名提交
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
### 创建新的GPG 密钥
|
|
|
|
|
|
2022-11-16 18:00:21 +08:00
|
|
|
|
1. 生成 GPG 密钥对
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
// 1.1 创建 GPG 密钥
|
|
|
|
|
gpg --full-gen-key
|
|
|
|
|
|
|
|
|
|
// 1.2 列出 GPG 密钥
|
2024-07-08 15:38:13 +08:00
|
|
|
|
gpg --list-secret-keys --keyid-format LONG "your_email@example.com"
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
// 1.3 复制 GPG 密钥 ID,以下示例复制 4AEA00A342C24CA3。
|
|
|
|
|
sec ed25519/4AEA00A342C24CA3 2021-09-14 [SC]
|
|
|
|
|
6DE3507E82DEB6E8828FAAC34AEA00A342C24BD4
|
2024-07-08 15:38:13 +08:00
|
|
|
|
uid [ 绝对 ] your_name "your_email@example.com"
|
2022-11-16 18:00:21 +08:00
|
|
|
|
ssb cv25519/812B586FD245B560 2021-09-14 [E]
|
|
|
|
|
|
|
|
|
|
// 1.4 导出 GPG 公钥(以上述 ID 为例)
|
|
|
|
|
gpg --armor --export 4AEA00A342C24CA3
|
|
|
|
|
```
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
2. 平台添加 GPG 公钥配置
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
将 GPG 公钥添加到 git 托管平台,例如 Github、Gitlab、Gitee 等。
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
3. 本地 Git 仓库关联 GPG 密钥
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
// 3.1 列出 GPG 密钥
|
2024-07-08 15:38:13 +08:00
|
|
|
|
gpg --list-secret-keys --keyid-format LONG "your_email@example.com"
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
// 3.2 复制 GPG 密钥 ID,以下示例复制 4AEA00A342C24CA3。
|
|
|
|
|
sec ed25519/4AEA00A342C24CA3 2021-09-14 [SC]
|
|
|
|
|
6DE3507E82DEB6E8828FAAC34AEA00A342C24BD4
|
2024-07-08 15:38:13 +08:00
|
|
|
|
uid [ 绝对 ] your_name "your_email@example.com"
|
2022-11-16 18:00:21 +08:00
|
|
|
|
ssb cv25519/812B586FD245B560 2021-09-14 [E]
|
|
|
|
|
|
|
|
|
|
// 3.3 本地 Git 仓库中配置该密钥,对 commit 提交进行签名。
|
|
|
|
|
git config --global user.signingkey 4AEA00A342C24CA3
|
|
|
|
|
```
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
4. 签名 Git commit
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
运行 Git commit 命令时需要用到 `-S` 参数,如果不希望每次都要输入 `-S` 标志,可以配置默认签名。
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
// 签名提交
|
|
|
|
|
git commit -S -m "your_commit_message"
|
|
|
|
|
|
|
|
|
|
// 开启默认签名提交
|
|
|
|
|
git config --global commit.gpgsign true
|
|
|
|
|
```
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
5. 验证签名
|
2022-11-16 18:00:21 +08:00
|
|
|
|
|
|
|
|
|
最后可以推送签名提交到 git 托管平台,验证是否签名成功!
|
2022-11-17 14:04:19 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
### 导入已有的 GPG 密钥
|
|
|
|
|
|
|
|
|
|
如果你已经有现成的 GPG 密钥,可以导入并使用。
|
|
|
|
|
|
|
|
|
|
1. **导入 GPG 私钥**:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
gpg --import your_private_key_file
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. **导入 GPG 公钥**:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
gpg --import your_public_key_file
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. **信任导入的 GPG 密钥**:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
gpg --edit-key your_key_id
|
|
|
|
|
gpg> trust
|
|
|
|
|
gpg> 5 (ultimate trust)
|
|
|
|
|
gpg> quit
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
4. 重复**创建新的GPG 密钥**中的第三步。
|
|
|
|
|
|
2022-11-17 14:04:19 +08:00
|
|
|
|
## 压缩提交记录
|
|
|
|
|
|
|
|
|
|
如果在新分支进行了多次提交,然后想合并到主分支。可以使用 --squash 选项,压缩合并提交。
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
// 将目标分支的提交压缩为一个,然后合并分支
|
|
|
|
|
git merge --squash <branchName>
|
|
|
|
|
```
|
|
|
|
|
|
2023-03-10 10:31:54 +08:00
|
|
|
|
## 忽略文件更改
|
|
|
|
|
|
|
|
|
|
- 未提交:添加忽略文件相对路径到 .gitignore 中即可。
|
|
|
|
|
|
|
|
|
|
- 已提交:`git rm --cached file`,添加忽略文件相对路径到 .gitignore 中即可。
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
|
|
|
|
## 配置 Git 的凭据存储
|
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
当使用 Git 进行代码管理时,你可以配置 Git 的凭据存储,这样就不需要每次都输入用户名和密码。下面是详细的步骤:
|
|
|
|
|
|
|
|
|
|
### 使用凭证缓存
|
|
|
|
|
|
|
|
|
|
1. **开启凭证缓存**:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
git config --global credential.helper cache
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. **设置缓存超时时间**(默认为 15 分钟,以下示例设置为 1 小时):
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
git config --global credential.helper 'cache --timeout=3600'
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 使用凭证管理器
|
|
|
|
|
|
|
|
|
|
Git for Windows 以及较新的 Git 版本提供了凭证管理器(Credential Manager),可以在多平台下存储和管理凭证。
|
|
|
|
|
|
|
|
|
|
1. **Windows 用户**:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
git config --global credential.helper manager
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. **MacOS 用户**:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
git config --global credential.helper osxkeychain
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. **Linux 用户**:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
git config --global credential.helper cache
|
|
|
|
|
```
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
### 使用凭证存储
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
这种方法会将凭证以纯文本的方式存储在磁盘上,安全性较低。
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
1. **开启凭证存储**:
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
```shell
|
|
|
|
|
git config --global credential.helper store
|
|
|
|
|
```
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
2. **第一次使用 Git 操作时输入用户名和密码后,凭证会被保存到磁盘**。
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
3. **使用 `cat` 命令查看 `.git-credentials` 文件的内容**:
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
```shell
|
|
|
|
|
cat ~/.git-credentials
|
|
|
|
|
```
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2024-07-08 15:38:13 +08:00
|
|
|
|
**请注意**,使用 `store` 凭据存储方式会将密码明文保存在磁盘上,所以请确保你的机器是安全的,并且不要在共享或公共设备上使用该功能。
|
2023-11-01 16:22:54 +08:00
|
|
|
|
|
2023-12-29 11:21:57 +08:00
|
|
|
|
## 全局的 Git 日志美化
|
|
|
|
|
|
|
|
|
|
可以使用 `git config --global format.pretty` 设置一个全局的 Git 日志格式化语句。
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
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` | 修饰的完整列表 |
|