Git

Git 清理命令操作实战手册

在项目开发过程中,Git 仓库会随每次修改、推送和发布逐渐累积大量中间提交记录、无效 Tag 和冗余的 Actions 工作流,导致提交历史臃肿、git log 难以阅读,重置或推送时还容易出错。

下面基于实际项目操作记录,介绍如何使用 Git 命令清理这些冗余数据,保持仓库干净整洁,适用于重置提交历史、清理 Tag / Release、重新初始化仓库和批量删除 Actions 工作流。

清理远程提交

清理 Tag

  • 清理远程提交前,如果存在 Tag 和 Release,必须先执行本操作。
  • 删除本地和远程的 Tag 标签,使后续重置历史时不会因 Tag 冲突而失败。

运行以下命令,查看 Tag:

Bash
1
2
3
4
5
6
7
8
# 查看本地 tag
git tag

# 查看远程 tag
git ls-remote --tags origin

# 查看本地 + 远程 tag
git show-ref --tags

运行以下命令,删除 Tag:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 删除本地 Tag(单个)
git tag -d v1.1

# 删除本地 Tag(多个)
git tag -d v1.1 v1.2 v1.3 v1.4

# 删除远程 Tag(单个)
git push origin --delete v1.1

# 删除远程 Tag(多个)
git push origin --delete v1.1 v1.2 v1.3 v1.4

运行以下命令,验证删除结果:

Bash
1
2
3
4
5
# 验证删除结果(本地)
git tag     

# 验证删除结果(远程)
git ls-remote --tags origin

如果存在 Releases,只能手动在网页删除,打开 https://github.com/你的用户名/仓库名/releases,找到要删除的 Release,点击右上角 ...>Delete,确认删除。

重置提交历史

  • 将本地 Git 历史压缩为一次提交,并强制推送覆盖远程。
  • 操作不可逆,执行前请确认。

运行以下命令,重置 Git 提交历史:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 1. 查看提交历史,找到初始提交(位于末尾)
git log --oneline

# 2. 软重置到初始提交,保留所有文件改动(7 位编码)
git reset --soft <commit hash>

# 3. 重新提交(包含所有累积改动)
git add .
git commit -m "重新整理仓库"

# 4. 强制推送(覆盖远程历史)
git push --force-with-lease

# 5. 验证是否仅存两条 Git 记录
git log --oneline

# 6. 如果存在 Tag,重新打 Tag 并推送
git tag v1.1
git push origin v1.1

撤回最近一次提交

  • 修改最近一次提交的内容,不会增加新的提交记录,而是替换原有的提交。
  • 如果已推送到远程,需要强制推送覆盖。

运行以下命令,修正提交(保留修改):

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 1. 添加修改
git add .

# 2. 修正最后一次提交
git commit --amend --no-edit  # 不修改 commit message
git commit --amend  # 修改 commit message

# 3. 强制推送覆盖
git push --force-with-lease

# 4. 验证结果
git log --oneline -1

重新初始化仓库

  • 删除本地所有 Git 提交历史、分支和配置,并推送至新建的 Github 空仓库。
  • 操作不可逆,执行前做好项目备份。

登录 GitHub,点击右上角 +>New repository,填写仓库名称等信息后创建空仓库。

运行以下命令,删除本地 .git 文件夹(所有历史、分支、配置都会被清除):

Bash
1
rm -rf .git

运行以下命令,提交并推送至远程仓库:

Bash
1
2
3
4
5
6
git init  
git add -A
git commit -m "初始提交"
git branch -M main
git remote add origin git@github.com:<username>/<repository>.git
git push -u origin main

清理本地修改

  • 丢弃工作区或暂存区中所有未提交的改动,将本地代码恢复到指定状态。
  • 操作不可逆,执行前请确认没有需要保留的修改。

运行以下命令,回退提交:

Bash
1
2
3
4
5
6
7
8
# 回退到上一个提交,丢弃所有改动
git reset --hard HEAD~1

# 回退到指定提交,丢弃所有改动
git reset --hard <commit-hash>

# 拉回远程最新代码(放弃本地所有修改)
git fetch origin && git reset --hard origin/main

运行以下命令,删除未跟踪的文件:

Bash
1
2
3
4
5
6
7
8
# 预览会删除哪些文件(安全)
git clean -n

# 删除未跟踪的文件
git clean -f

# 删除未跟踪的文件和目录
git clean -fd

运行以下命令,清理分支:

Bash
1
2
3
4
5
6
7
8
# 查看所有本地分支
git branch

# 删除本地分支
git branch -D <分支名>

# 删除远程分支
git push origin --delete <分支名>

清理工作流记录

  • 批量删除 GitHub Actions 页面上的运行记录,释放页面空间。
  • 只删除 Actions 记录,不影响代码、Tag 和 Release。

安装 GitHub CLI

前往 CLI 下载 Windows 版本,或运行以下命令安装(默认安装在 C 盘):

Bash
1
winget install --id GitHub.cli

运行以下命令,检查是否已安装:

Bash
1
gh --version

安装完成后需要重启终端窗口,确认当前在正确的目录:

Bash
1
pwd

CLI 授权登录

方式一:网页授权登录:

Bash
1
gh auth login

按照提示,选择 GitHub.com>HTTPS>Login with a web browser,浏览器会打开授权页面,输入 8 位验证码,点击授权。

方式二:Token 登录

登录 GitHub,点击 头像>Settings>Developer Settings>Personal access tokens>Tokens (classic)>Generate new token (classic),勾选 repoworkflowadmin:org 中的 read:org 权限,生成并复制 Token。

运行以下命令,使用 Token 登录:

Bash
1
echo "token" | gh auth login --with-token

删除运行记录

运行以下命令,查看记录:

Bash
1
2
3
4
5
6
7
8
# 查看最近 10 条
gh run list --limit 10    

# 查看最近 100 条
gh run list --limit 100     

# 查看特定分支的记录         
gh run list --branch main --limit 100  

运行以下命令,批量删除运行记录:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 删除最近 100 条
gh run list --limit 100 --json databaseId --jq '.[].databaseId' | xargs -I {} gh run delete {}

# 删除最近 500 条
gh run list --limit 500 --json databaseId --jq '.[].databaseId' | xargs -I {} gh run delete {}

# 删除最近 1000 条(覆盖全部)
gh run list --limit 1000 --json databaseId --jq '.[].databaseId' | xargs -I {} gh run delete {}

# 保留最新一条,删除其余所有
gh run list --limit 1000 --json databaseId --jq '.[].databaseId' | tail -n +2 | xargs -I {} gh run delete {}

# 仅删除 main 分支的记录
gh run list --branch main --limit 100 --json databaseId --jq '.[].databaseId' | xargs -I {} gh run delete {}

运行以下命令,验证结果:

Bash
1
gh run list --limit 5
留言交流