目 录CONTENT

文章目录

Git 高级使用

PySuper
2025-10-18 / 0 评论 / 0 点赞 / 3 阅读 / 0 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

Git 高阶使用

Git 是一个功能极其丰富的分布式版本控制系统,拥有众多高级功能。下面我将从不同维度为您详细介绍 Git 的高级功能和重要参数:

📊 Git 高级功能概览

功能类别

核心功能

主要命令

用途说明

🔄 分支管理

分支策略、合并策略

branch, merge, rebase

高效的并行开发和代码集成

📝 提交管理

提交重写、历史编辑

commit --amend, rebase -i

整理提交历史,保持清晰

🔍 代码追溯

二分查找、责备分析

bisect, blame

定位问题引入点和责任人

🏷️ 版本标记

标签管理、发布标记

tag, describe

标记重要版本和发布点

🌲 历史查看

高级日志、图形化显示

log, show

多维度查看项目历史

📦 存储管理

暂存更改、工作区保存

stash

临时保存未完成的更改

⚙️ 配置管理

别名、钩子、属性

config

个性化定制 Git 行为

🔧 核心命令高级参数详解

分支与合并管理

# 创建并切换到新分支
git checkout -b feature-branch
# 或者(Git 2.23+)
git switch -c feature-branch

# 删除已合并的分支
git branch -d old-branch
# 强制删除未合并的分支
git branch -D dangerous-branch

# 查看分支跟踪关系
git branch -vv

# 变基合并(整理提交历史)
git rebase -i HEAD~3  # 交互式变基最近3个提交

# 合并时创建合并提交(即使可以快进)
git merge --no-ff feature-branch

提交历史管理

# 修改最近一次提交
git commit --amend
# 修改最近一次提交信息
git commit --amend -m "新的提交信息"

# 交互式变基(重写历史)
git rebase -i HEAD~5  # 编辑最近5个提交

# 在变基过程中可执行的操作:
# pick - 使用提交
# reword - 使用提交但修改提交信息
# edit - 使用提交但暂停修改
# squash - 将提交合并到前一个提交
# fixup - 类似squash但丢弃提交信息
# drop - 删除提交

高级日志查看

# 图形化显示分支历史
git log --oneline --graph --all

# 显示文件变更统计
git log --stat

# 显示具体修改内容
git log -p

# 按时间筛选
git log --since="2023-01-01" --until="2023-12-31"

# 按作者筛选
git log --author="用户名"

# 搜索提交信息
git log --grep="修复bug"

# 显示某个文件的修改历史
git log --follow filename

代码追溯与调试

# 二分查找定位问题提交
git bisect start
git bisect bad HEAD        # 标记当前版本有问题
git bisect good v1.0       # 标记v1.0版本正常
# Git会自动二分测试,直到找到问题提交
git bisect reset           # 结束二分查找

# 查看文件每行最后修改信息
git blame filename

# 查看某行代码的详细修改历史
git log -L 10,20:filename  # 查看10-20行的历史

标签与发布管理

# 创建轻量标签
git tag v1.0.0

# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本1.0.0发布"

# 签署标签
git tag -s v1.0.0 -m "签署版本1.0.0"

# 查看标签详情
git show v1.0.0

# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push origin --tags

# 删除标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0

暂存与工作区管理

# 暂存当前工作目录的修改
git stash
# 暂存并添加描述
git stash push -m "正在开发的功能暂存"

# 查看暂存列表
git stash list

# 恢复最近暂存的内容
git stash pop
# 应用特定暂存(不删除)
git stash apply stash@{1}

# 删除暂存
git stash drop stash@{0}
# 清空所有暂存
git stash clear

🛠️ 高级配置与钩子

Git 配置优化

# 设置全局用户名和邮箱
git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"

# 设置命令别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'

# 设置默认编辑器
git config --global core.editor "code --wait"

# 设置行尾符处理(Windows)
git config --global core.autocrlf true
# (Linux/Mac)
git config --global core.autocrlf input

Git 钩子(Hooks)

Git 钩子位于 .git/hooks/ 目录,常见钩子:

  • pre-commit: 提交前检查代码规范

  • prepare-commit-msg: 准备提交信息

  • post-commit: 提交后触发通知

  • pre-push: 推送前运行测试

示例 pre-commit 钩子:

#!/bin/sh
# 检查代码格式
npm run lint
# 运行测试
npm test

🔍 高级搜索与过滤

# 搜索工作目录中的内容
git grep "搜索内容"

# 搜索提交内容(代码变更)
git log -S "搜索内容"  # 搜索添加或删除该内容的提交
git log -G "正则表达式" # 使用正则表达式搜索

# 按文件路径过滤
git log -- "src/**/*.js"

# 显示分支关系图
git log --oneline --graph --decorate --all

📈 性能优化参数

# 开启文件系统监视(大项目性能提升)
git config --global core.fsmonitor true

# 设置压缩级别
git config --global core.compression 9

# 使用增量传输
git config --global feature.incrementalTransfer true

# 设置大文件阈值
git config --global core.bigFileThreshold 2m

🚀 实用技巧组合

清理仓库

# 清理未跟踪文件
git clean -fd
# 交互式清理
git clean -i

# 优化仓库
git gc --aggressive

子模块管理

# 添加子模块
git submodule add https://github.com/user/repo.git

# 初始化和更新子模块
git submodule update --init --recursive

补丁管理

# 生成补丁
git format-patch HEAD~3

# 应用补丁
git am *.patch

rebase、reset、stash

我来详细讲解 Git 中三个非常重要的高级功能:rebaseresetstash

🔄 Git Rebase(变基)

基本概念

Rebase 用于重新应用提交,将分支的基点从一个提交移动到另一个提交,从而"重写"提交历史。

核心用法

1. 基础变基

# 将当前分支变基到 main 分支
git checkout feature-branch
git rebase main

# 或者使用一行命令
git rebase main feature-branch

2. 交互式变基(最强大功能)

# 重新整理最近3个提交
git rebase -i HEAD~3

# 重新整理从某个提交开始的所有提交
git rebase -i commit-hash

交互式变基会打开编辑器,显示可执行的操作:

pick a1b2c3d 添加用户登录功能
pick e4f5g6h 修复登录bug
pick h7i8j9k 添加记住密码功能

# 可用的命令:
# p, pick = 使用提交
# r, reword = 使用提交,但编辑提交信息
# e, edit = 使用提交,但暂停修改
# s, squash = 使用提交,但合并到前一个提交
# f, fixup = 类似"squash",但丢弃提交信息
# d, drop = 删除提交

高级用法

3. 提交合并(压缩提交)

# 将多个提交合并为一个
git rebase -i HEAD~3
# 然后将第2、3行的pick改为squash或fixup

4. 提交重排序

# 在交互式变基中重新排列提交顺序
git rebase -i HEAD~5
# 然后直接调整行的顺序

5. 分割提交

git rebase -i HEAD~3
# 将想要分割的提交标记为edit
# Git会在该提交处暂停,然后:
git reset HEAD~1
git add -p  # 交互式暂存部分更改
git commit -m "第一部分"
git add .
git commit -m "第二部分"
git rebase --continue

重要参数

--continue    # 继续变基(解决冲突后)
--abort       # 中止变基,回到原始状态
--skip        # 跳过当前提交
--autostash   # 自动暂存未提交的更改
--no-verify   # 跳过pre-commit钩子

使用场景

  • 整理本地分支历史:在推送到远程前清理提交

  • 更新功能分支:保持线性历史,避免合并提交

  • 提取特定更改:从其他分支提取部分提交

⚡ Git Reset(重置)

三种重置模式

1. --soft(软重置)

# 移动HEAD指针,但不修改暂存区和工作目录
git reset --soft HEAD~1
# 提交被取消,更改保留在暂存区

使用场景:重新提交,修改提交信息或拆分提交。

2. --mixed(混合重置,默认)

# 移动HEAD指针,重置暂存区,但不修改工作目录
git reset HEAD~1
# 或显式指定
git reset --mixed HEAD~1
# 提交被取消,更改保留在工作目录(未暂存)

使用场景:取消暂存的更改,重新选择要提交的文件。

3. --hard(硬重置)

# 移动HEAD指针,重置暂存区和工作目录
git reset --hard HEAD~1
# 提交和所有更改都被丢弃

使用场景:完全放弃最近的更改(谨慎使用!)。

高级用法

4. 重置到特定提交

# 重置到特定提交
git reset --hard a1b2c3d

# 重置到远程分支状态
git reset --hard origin/main

5. 路径重置(部分重置)

# 只重置特定文件
git reset HEAD -- filename.txt
# 从暂存区移除文件,但保留工作目录的更改

# 重置文件到特定版本
git reset commit-hash -- filename.txt

6. 恢复误操作

# 查看所有操作记录(包括reset、rebase等)
git reflog

# 从reflog中找回误删的提交
git reset --hard HEAD@{1}

重要参数

--soft        # 只移动HEAD指针
--mixed       # 移动HEAD指针并重置暂存区(默认)
--hard        # 移动HEAD指针,重置暂存区和工作目录
--merge       # 类似--hard,但保留未提交的更改
--keep        # 类似--hard,但保留未提交的更改和未跟踪文件

📦 Git Stash(储藏)

基本用法

1. 基础储藏

# 储藏当前工作目录和暂存区的更改
git stash

# 等价于
git stash push

# 储藏包括未跟踪的文件
git stash -u
# 或
git stash --include-untracked

# 储藏所有文件(包括忽略的文件)
git stash -a
# 或
git stash --all

2. 带描述的储藏

# 添加描述信息
git stash push -m "正在开发用户认证功能"

# 储藏特定文件
git stash push -- filename1.txt filename2.txt

储藏管理

3. 查看储藏列表

# 查看所有储藏
git stash list
# 输出:stash@{0}: On main: 描述信息
#       stash@{1}: On feature: 另一个描述

# 查看储藏的具体内容
git stash show stash@{0}

# 查看储藏的详细差异
git stash show -p stash@{0}

4. 应用和恢复储藏

# 应用最近储藏(不删除)
git stash apply

# 应用特定储藏
git stash apply stash@{1}

# 应用并删除储藏(弹出)
git stash pop

# 弹出特定储藏
git stash pop stash@{1}

5. 删除储藏

# 删除最近储藏
git stash drop

# 删除特定储藏
git stash drop stash@{1}

# 清空所有储藏
git stash clear

高级用法

6. 从储藏创建分支

# 当应用储藏出现冲突时,可以创建新分支
git stash branch new-branch-name stash@{0}

7. 选择性应用储藏

# 交互式应用(选择特定更改)
git stash show -p | git apply -3

重要参数

push          # 创建新储藏(可省略)
list          # 列出所有储藏
show          # 显示储藏内容
apply         # 应用储藏但不删除
pop           # 应用并删除储藏
drop          # 删除储藏
clear         # 删除所有储藏
branch        # 从储藏创建分支
-u, --include-untracked  # 包含未跟踪文件
-a, --all     # 包含所有文件(包括忽略的)
-m, --message # 添加描述信息

🎯 实战场景组合

场景1:临时切换分支处理紧急bug

# 1. 储藏当前工作
git stash push -m "正在开发的功能A"

# 2. 切换到主分支并修复bug
git checkout main
git checkout -b hotfix-bug
# ... 修复bug ...
git add .
git commit -m "修复紧急bug"

# 3. 回到功能分支恢复工作
git checkout feature-branch
git stash pop

场景2:整理提交历史

# 1. 查看最近提交
git log --oneline -5

# 2. 交互式变基整理提交
git rebase -i HEAD~3
# 在编辑器中将某些提交改为squash或fixup

# 3. 如果不满意,重置重来
git rebase --abort
# 或使用reflog找回原始状态

场景3:撤销错误提交

# 1. 查看提交历史
git log --oneline

# 2. 软重置到错误提交之前
git reset --soft HEAD~1
# 现在更改在暂存区,可以重新提交

# 3. 或者硬重置完全放弃
git reset --hard HEAD~1
# 谨慎:这会永久删除更改!

⚠️ 注意事项

Rebase 警告

  • 不要对已推送到共享仓库的提交进行变基

  • 变基会重写历史,可能导致协作问题

  • 在团队分支上使用 merge 而不是 rebase

Reset 警告

  • --hard 会永久删除未提交的更改

  • 使用前确保重要更改已提交或储藏

  • 使用 reflog 可以恢复大多数误操作

Stash 提示

  • 储藏是临时的,长期不用的储藏可能被Git清理

  • 给储藏添加有意义的描述

  • 定期清理不再需要的储藏

这三个命令是 Git 高级用法的核心,熟练掌握它们可以极大提升开发效率和工作流灵活性。

使用案例

使用 git log --oneline , 查看当前的提交日志

再使用 git rebase -i qwerasd , 回退到 指定的一个版本 (多个提交点之前的那个 head 点)

会有弹出的编辑界面, 需要去修改, 只保存 我们需要的一个 commit 消息, 其他的在前面 加上 s , 就是删除的意思

待会儿还会再弹出一个, 就把不要了的 commit 给注释掉, 添加 #

再使用 git log --oneline 查看提交状态

可以再使用 git show 在本地确定一下 当前提交的代码变更

最后 如果之前没有提交或者合并, 就使用 git push

如果提交到当前自己一个人的分支上, 还是出现问题, 那可能是 提交信息变更导致的, 就使用 git push -f强制推送

VsCode Setting

{
    "vscodeGitCommit.insertMode": "Replace",
    "vscodeGitCommit.template": [
        "<{feat}>[#{issue_number}]<{author}> [{scope}]:{message}"
    ],
    "vscodeGitCommit.variables": {
        "prefix": "keke",
        "feat": [
            {
                "label": "feat",
                "detail": "新功能"
            },
            {
                "label": "fix",
                "detail": "修复BUG"
            },
            {
                "label": "docs",
                "detail": "文档修改"
            },
            {
                "label": "style",
                "detail": "代码格式修改"
            },
            {
                "label": "refactor",
                "detail": "代码重构"
            },
            {
                "label": "test",
                "detail": "测试相关"
            },
            {
                "label": "other",
                "detail": "其他修改,比如构建流程、辅助工具等和业务无关的"
            }
        ],
        "author": [
            {
                "label": "PySuper",
                "detail": "PySuper"
            }
        ]
    },
    "vscodeGitCommit.defaultVariablesValues": {
        "issue_number": "none",
        "message": "",
        "body": ""
    },
    "vscodeGitCommit.variablesDisplayTitles": {
        "scope": "影响范围: model|deploy|dataset ... 多个时使用'+'连接",
        "issue_number": "issue编号,没有时填none",
        "message": "修改点简述",
        "body": "修改点详述"
    },
    "git.suggestSmartCommit": false,
    "security.workspace.trust.emptyWindow": false,
    "editor.minimap.size": "fit",
    "editor.rulers": [],
    "workbench.colorTheme": "Monokai Classic",
    "editor.lineHeight": 1.6,
    "terminal.integrated.cursorStyle": "line",
    "terminal.integrated.cursorBlinking": true,
    "window.customTitleBarVisibility": "windowed",
    "workbench.startupEditor": "none",
    "editor.defaultFormatter": "charliermarsh.ruff",
    "editor.wordWrap": "bounded",
    "editor.mouseWheelZoom": true,
    "merge-conflict.autoNavigateNextConflict.enabled": true,
    "gitlens.blame.avatars": false,
    "gitlens.blame.heatmap.enabled": false,
    "window.newWindowProfile": "默认",
    "files.trimTrailingWhitespace": true,
    "window.zoomLevel": 1,
    "gitlens.statusBar.dateFormat": "",
    "gitlens.statusBar.pullRequests.enabled": false,
    "gitlens.views.showCurrentBranchOnTop": false,
    "remote.SSH.remotePlatform": {
        "QUECAI_208": "linux",
        "QUECAI_DEV": "linux"
    },
    "terminal.integrated.defaultProfile.windows": "Git Bash",
    "terminal.integrated.stickyScroll.enabled": false,
    "editor.stickyScroll.enabled": true,
    "gitlens.views.scm.grouped.views": {
        "commits": true,
        "branches": true,
        "remotes": true,
        "stashes": true,
        "tags": true,
        "worktrees": true,
        "contributors": true,
        "fileHistory": true,
        "repositories": true,
        "searchAndCompare": false,
        "launchpad": false
    },
    "settingsSync.ignoredExtensions": [
        "ms-vscode-remote.remote-ssh",
        "ms-vscode-remote.remote-ssh-edit",
        "ms-vscode.remote-server"
    ],
    "projectManager.sortList": "Recent"
}

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区