Git 常用指令汇总

基础配置与初始化

用户信息

  • 设置(全局)

    arduino 复制代码
    git config --global user.name "你的名字"
    git config --global user.email "你的邮箱"
  • 查看

    arduino 复制代码
    git config user.name
    git config user.email

别名配置

  • 设置别名 (以 st 代替 status 为例)

    csharp 复制代码
    git config --global alias.st status
  • 常用别名示例

    perl 复制代码
    git config --global alias.co checkout
    git config --global alias.br branch
    git config --global alias.ci commit
    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

其他全局配置

  • 启用颜色输出

    arduino 复制代码
    git config --global color.ui true
  • 全局忽略文件配置

    可以创建一个全局的 .gitignore_global 文件,忽略所有仓库都通用的文件(如编辑器临时文件、操作系统生成的文件等)。

    lua 复制代码
    git config --global core.excludesfile ~/.gitignore_global

    然后在 ~/.gitignore_global 中写入忽略规则。

初始化仓库

  • 将当前目录变为 Git 仓库

    csharp 复制代码
    git init
  • 查看当前目录

    bash 复制代码
    pwd

生成 SSH Key(用于远程连接)

perl 复制代码
ssh-keygen -t rsa -C "your_email@example.com"

文件操作:添加、删除、移动

添加文件到暂存区(git add

命令 说明
git add <file> 添加指定文件
git add . 添加当前目录所有变更(包括新增、修改、删除)
git add -A 等同于 git add --all,添加所有变更(工作区根目录下所有变更) :在 Git 2.x 中无论当前目录位置都会添加全部变更,旧版行为略有不同,推荐直接使用 --all 避免歧义。
git add -u 只添加已跟踪文件的修改(不处理未跟踪文件)
git add -p 交互式选择部分修改添加
git add -i 进入交互式添加模式
git add -f 强制添加被 .gitignore 忽略的文件

删除文件(git rm

  • 删除工作区文件并暂存删除操作

    bash 复制代码
    git rm <file>
  • 仅从 Git 中删除(保留本地文件)

    bash 复制代码
    git rm --cached <file>
  • 递归删除目录

    bash 复制代码
    git rm -r <dir>
  • 强制删除(文件有未提交修改时)

    bash 复制代码
    git rm -f <file>

移动或重命名文件(git mv

bash 复制代码
git mv <old-name> <new-name>   # 重命名文件并自动暂存
git mv <file> <destination>/    # 移动文件到其他目录

该命令相当于运行了 mv 命令后执行了 git addgit rm,简化了操作。

提交与查看历史

提交暂存区内容(git commit

  • 标准提交(打开编辑器输入信息)

    sql 复制代码
    git commit
  • 直接提交带消息

    sql 复制代码
    git commit -m "提交说明"
  • 跳过暂存区,直接提交已跟踪文件的修改

    sql 复制代码
    git commit -a -m "提交说明"
  • 修改最近一次提交(可修改信息或补充文件)

    sql 复制代码
    git commit --amend
  • 指定作者/日期

    ini 复制代码
    git commit --author="作者名 <email>" --date="YYYY-MM-DD HH:MM:SS"

查看状态(git status

  • 详细状态

    lua 复制代码
    git status
  • 简洁输出

    lua 复制代码
    git status -s
  • 显示被忽略的文件

    lua 复制代码
    git status --ignored

查看提交历史(git log

  • 完整日志

    bash 复制代码
    git log
  • 单行简洁显示

    lua 复制代码
    git log --oneline
  • 图形化显示分支合并图

    css 复制代码
    git log --graph --pretty=oneline --abbrev-commit
  • 显示最近 N 条

    bash 复制代码
    git log -n 5
  • 显示每次提交的差异

    bash 复制代码
    git log -p
  • 显示统计信息

    bash 复制代码
    git log --stat
  • 高级筛选

    • 按提交信息关键词过滤

      ini 复制代码
      git log --grep="关键词"
    • 按代码变更内容搜索(pickaxe)

      bash 复制代码
      git log -S"要搜索的代码片段"

其他查看命令

  • 逐行追溯文件(谁在什么时候修改了哪一行)

    xml 复制代码
    git blame <file>
  • 生成简短的提交统计(用于快速发布日志)

    bash 复制代码
    git shortlog
    git shortlog -sn   # 按提交数量排序显示贡献者
  • 在版本库中搜索文本 (比系统 grep 更快,且只搜索 tracked 文件)

    perl 复制代码
    git grep "要搜索的文字"
    git grep -n "文字"   # 显示行号

查看操作历史(git reflog

  • 记录所有 HEAD 移动历史,可用于找回丢失的提交

    复制代码
    git reflog

    提示@ 是 HEAD 的简写,例如 git show @{yesterday} 可查看昨天 HEAD 指向的提交。

比较差异(git diff

命令 作用
git diff 工作区 vs 暂存区
git diff --staged--cached 暂存区 vs 最新提交(HEAD)
git diff HEAD 工作区 vs 最新提交(所有未提交修改)
git diff <commit1> <commit2> 两个提交之间的差异
git diff <branch1> <branch2> 两个分支之间的差异
git diff -- <file> 查看某个文件的修改
git diff --stat 仅显示统计信息
git diff --name-only 仅显示文件名
git diff --word-diff 按单词显示差异
git diff -w 忽略空格差异

撤销与恢复

工作区修改的撤销

  • 丢弃单个文件的修改(不可恢复)

    lua 复制代码
    git checkout -- <file>
  • 丢弃所有工作区修改(慎用)

    erlang 复制代码
    git checkout .
  • 新版推荐git restore

    xml 复制代码
    git restore <file>

暂存区修改的撤销

  • 将文件从暂存区移回工作区 (取消 git add

    perl 复制代码
    git reset HEAD <file>
  • 取消所有暂存

    perl 复制代码
    git reset HEAD .
  • 新版推荐

    css 复制代码
    git restore --staged <file>

版本回退(git reset

git reset 有三种主要模式:

  • --soft:仅移动 HEAD 指针,保留暂存区和工作区(即撤销提交,但修改仍暂存)
  • --mixed(默认):移动 HEAD,清空暂存区但保留工作区(撤销提交和暂存,修改仍在工作区)
  • --hard:移动 HEAD,清空暂存区并丢弃工作区修改(彻底回到指定提交的状态,慎用)
  • 回退到上一个版本(保留工作区修改)

    perl 复制代码
    git reset --soft HEAD^      # 保留暂存区
    git reset --mixed HEAD^     # 保留工作区,清空暂存区(默认)
  • 彻底回退到指定提交(丢弃之后的所有修改)

    css 复制代码
    git reset --hard <commit-id>
  • 回退部分文件到指定版本(不影响其他文件)

    sql 复制代码
    git checkout <commit-id> -- <file>
    git commit -m "回退文件"

恢复误删的文件

  • 从版本库恢复

    lua 复制代码
    git checkout -- <file>

使用 git revert 安全撤销合并提交

  • 创建一个反向提交(推荐用于已推送的合并)

    sql 复制代码
    git revert -m 1 <merge-commit>

分支管理

创建与切换分支

  • 传统方式

    csharp 复制代码
    git branch <branch-name>          # 创建分支
    git checkout <branch-name>         # 切换分支
    git checkout -b <new-branch>       # 创建并切换
  • 新版方式git switch

    csharp 复制代码
    git switch -c <new-branch>         # 创建并切换
    git switch <branch>                 # 切换已有分支

查看分支

  • 本地分支

    复制代码
    git branch
  • 所有分支(包括远程)

    css 复制代码
    git branch -a

合并分支

  • 将指定分支合并到当前分支

    sql 复制代码
    git merge <branch>
  • 禁用 Fast-Forward 合并(保留分支历史)

    perl 复制代码
    git merge --no-ff -m "说明" <branch>
  • 压缩合并(Squash)

    sql 复制代码
    git merge --squash <branch>
    git commit -m "合并说明"
  • 中止合并(解决冲突时)

    sql 复制代码
    git merge --abort

删除分支

  • 删除本地已合并分支

    xml 复制代码
    git branch -d <branch>
  • 强制删除未合并分支

    xml 复制代码
    git branch -D <branch>
  • 删除远程分支

    perl 复制代码
    git push origin --delete <branch>
    # 或
    git push origin :<branch>

储藏工作现场(git stash

  • 临时保存修改 (包括未跟踪文件加 -u

    perl 复制代码
    git stash push -m "描述"
  • 查看储藏列表

    复制代码
    git stash list
  • 恢复储藏

    perl 复制代码
    git stash apply        # 恢复但不删除
    git stash pop          # 恢复并删除
  • 删除储藏

    perl 复制代码
    git stash drop <stash@{n}>
    git stash clear        # 删除所有

挑选提交(git cherry-pick

将某个(或某几个)提交的更改应用到当前分支,常用于从其他分支移植特定修改。

python 复制代码
git cherry-pick <commit-id>          # 应用单个提交
git cherry-pick <commit1> <commit2>   # 应用多个提交
git cherry-pick <branch>              # 应用分支的最新提交

如果出现冲突,解决后执行 git cherry-pick --continue,或使用 --abort 中止。

变基操作(git rebase

变基可以整理提交历史,使分支看起来像基于最新目标分支开发。

  • 将当前分支变基到目标分支

    xml 复制代码
    git rebase <branch>
  • 交互式变基(修改历史提交)

    bash 复制代码
    git rebase -i HEAD~n   # 修改最近 n 个提交
  • 变基过程中

    • 解决冲突后:git add <file>git rebase --continue
    • 跳过当前提交:git rebase --skip
    • 中止变基:git rebase --abort

注意:变基会改写提交历史,不要对已推送到远程的分支执行变基(除非你清楚后果)。

分支高级操作

  • 只合并部分文件到当前分支

    sql 复制代码
    git checkout <source-branch> -- <file1> <file2>
    git commit -m "合并部分文件"
  • 建立本地分支与远程分支的关联

    ini 复制代码
    git branch --set-upstream-to=origin/<remote-branch>
  • 拉取远程分支到本地

    xml 复制代码
    git checkout -b <local-branch> origin/<remote-branch>

远程仓库操作

克隆远程仓库(git clone

  • 基本克隆

    bash 复制代码
    git clone <url> [本地目录名]
  • 克隆指定分支

    xml 复制代码
    git clone -b <branch> <url>
  • 浅克隆(只拉取最近一次提交)

    bash 复制代码
    git clone --depth 1 <url>
  • 克隆并初始化子模块

    bash 复制代码
    git clone --recurse-submodules <url>

查看远程仓库信息

复制代码
git remote -v

添加远程仓库

xml 复制代码
git remote add <remote-name> <url>

远程仓库管理

  • 重命名远程仓库

    sql 复制代码
    git remote rename <old-name> <new-name>
  • 删除远程仓库

    arduino 复制代码
    git remote remove <remote-name>

推送本地分支(git push

  • 首次推送并建立关联

    perl 复制代码
    git push -u origin <branch>
  • 常规推送

    perl 复制代码
    git push origin <branch>
  • 强制推送(谨慎)

    css 复制代码
    git push --force origin <branch>
  • 更安全的强制推送

    csharp 复制代码
    git push --force-with-lease origin <branch>
  • 删除远程分支

    perl 复制代码
    git push origin --delete <branch>

拉取远程更新(git pull

  • 拉取并合并 (默认 merge

    xml 复制代码
    git pull origin <branch>
  • 拉取并使用变基

    css 复制代码
    git pull --rebase
  • 自动储藏本地修改后拉取

    css 复制代码
    git pull --autostash

从远程抓取但不合并(git fetch

sql 复制代码
git fetch origin
git fetch --tags          # 抓取所有标签

清理远程已删除分支的本地记录

css 复制代码
git fetch -p

关联多个远程库

  • 只需添加不同名称的远程库即可。

子模块操作

  • 添加子模块

    csharp 复制代码
    git submodule add <repository> [路径]
  • 初始化并更新子模块(克隆后或拉取更新后)

    css 复制代码
    git submodule update --init --recursive
  • 更新所有子模块到最新提交

    sql 复制代码
    git submodule update --remote

标签管理

创建标签

  • 轻量标签

    xml 复制代码
    git tag <tag-name>
  • 附注标签(推荐)

    arduino 复制代码
    git tag -a <tag-name> -m "说明"
  • 为历史提交打标签

    python 复制代码
    git tag -a <tag-name> <commit-id> -m "说明"

查看标签

  • 列出所有标签

    复制代码
    git tag
  • 查看标签详情

    sql 复制代码
    git show <tag-name>

删除标签

  • 本地删除

    xml 复制代码
    git tag -d <tag-name>
  • 远程删除

    ruby 复制代码
    git push origin --delete <tag-name>
    # 或
    git push origin :refs/tags/<tag-name>

推送标签

  • 推送单个标签

    perl 复制代码
    git push origin <tag-name>
  • 推送所有未推送的标签

    css 复制代码
    git push origin --tags

基于标签创建分支

xml 复制代码
git checkout -b <branch> <tag-name>

忽略文件(.gitignore

  • 在仓库根目录创建 .gitignore 文件,写入要忽略的文件模式(如 *.lognode_modules/)。
  • .gitignore 本身应纳入版本管理。

高级技巧与注意事项

二分查找(git bisect

快速定位引入 bug 的提交。

perl 复制代码
git bisect start
git bisect bad                 # 当前版本有问题
git bisect good <已知好版本>    # 标记一个好版本
# Git 会切换到中间提交,测试后标记 good/bad,重复直到找到首个坏提交
git bisect reset               # 结束二分查找,回到原分支

解决冲突

  • 手动编辑冲突文件,保留所需内容,然后 git add 标记为已解决,最后 git commit

理解工作区、暂存区、版本库

  • 工作区:本地文件系统看到的文件。
  • 暂存区 (Index):git add 后的存放区域,等待提交。
  • 版本库 (Repository):git commit 后的永久存储。

HEAD 的含义

  • HEAD 指向当前分支的最新提交。HEAD^ 表示上一个版本,HEAD~100 表示前 100 个版本。

    HEAD^HEAD~ 在大多数情况下可以互换,但严格来说:

    • HEAD^ 指当前提交的父提交(用于合并提交时可加数字指定第几个父提交,如 HEAD^2 表示第二个父提交)。
    • HEAD~ 指当前提交的第一父提交的线性历史,HEAD~2 表示向前两个提交(忽略合并分支)。

提示@ 是 HEAD 的简写,例如 git show @~3 等价于 git show HEAD~3

查看命令帮助

  • 任何命令加 --help 可查看详细文档,如 git add --help
相关推荐
无限进步_2 小时前
深入解析list:一个完整的C++双向链表实现
开发语言·c++·git·链表·github·list·visual studio
Awna2 小时前
Git 合并多次提交记录实战
git
火车叼位4 小时前
一次看懂 Git 仓库分叉、冲突已解决但仍在合并中的状态
git
ruanCat5 小时前
simple-git-hooks 踩坑实录:钩子装对了却从没触发过,原来是 .git 目录捣的鬼
前端·git·代码规范
葱卤山猪7 小时前
Git常用核心命令实操总结(新手避坑版)
大数据·git·elasticsearch
深蓝轨迹7 小时前
Git误操作急救手册
chrome·git·elasticsearch
无限进步_8 小时前
【C++】字符串中的字母反转算法详解
开发语言·c++·ide·git·算法·github·visual studio
Tipriest_18 小时前
git reflog介绍(找回之前detach后做的commit)
git
一个有温度的技术博主20 小时前
Git系列四:git的基本概念
git