详解Git命令与操作

虽然平时Git用的很多,但得益于Git图形化工具(SourceTree、Github Desktop等)的完善且好用,我对Git命令并不熟练,所以整理一份笔记记录一下且方便以后查看。

1. Git命令总览表

类别 命令 功能描述
仓库操作 git init 初始化新仓库
git clone 克隆远程仓库
文件操作 git add 添加文件到暂存区
git rm 删除文件
git mv 移动/重命名文件
提交操作 git commit 提交更改
git commit --amend 修改最后一次提交
分支操作 git branch 分支管理
git checkout 切换分支/恢复文件
git merge 合并分支
git rebase 变基操作
远程操作 git remote 远程仓库管理
git fetch 获取远程更新
git pull 拉取并合并远程更新
git push 推送本地提交
查看信息 git status 查看工作区状态
git log 查看提交历史
git diff 查看差异
撤销操作 git reset 重置提交
git revert 撤销提交
git restore 恢复文件
储藏操作 git stash 临时储藏修改
标签操作 git tag 标签管理


2. 详细命令解析

2.1 仓库操作命令

2.1.1 初始化新仓库 git init

功能:在当前目录初始化一个新的Git仓库
语法

git init [仓库名]  # 可选,指定目录名称

示例

git init          # 在当前目录初始化
git init my-repo  # 创建my-repo目录并初始化

流程

  1. 创建.git子目录
  2. 初始化仓库数据结构
  3. 设置默认主分支(master/main)

2.1.2 克隆远程仓库 git clone

功能:克隆远程仓库到本地
语法

git clone <仓库URL> [目录名]  # 目录名可选

选项

  • --depth 1:浅克隆(只获取最新版本)
  • --branch <分支名>:克隆指定分支
  • --recursive:递归克隆子模块

示例

git clone https://github.com/user/repo.git
git clone -b dev https://github.com/user/repo.git myproject

2.2 文件操作命令

2.2.1 添加文件到暂存区 git add

功能:将文件添加到暂存区
语法

git add <文件或目录>

常用形式

git add .               # 添加所有修改和新文件
git add -A              # 添加所有修改(包括删除)
git add -u              # 添加所有修改(不包括新文件)
git add *.js            # 添加所有js文件
git add --patch <文件>  # 交互式添加文件部分修改

2.2.2 删除文件 git rm

功能:从Git中删除文件
语法

git rm <文件>

选项

  • --cached:仅从Git中删除,保留本地文件
  • -f:强制删除已修改的文件

示例

git rm oldfile.txt      # 删除文件
git rm --cached file.txt  # 停止跟踪但保留文件

2.2.3 移动/重命名文件 git mv

功能:移动或重命名文件
语法

git mv <源文件> <目标文件>

等效操作

mv oldname newname
git rm oldname
git add newname

2.3 提交操作命令

2.3.1 提交更改 git commit

功能:提交暂存区的更改
语法

git commit [-m "提交信息"]

常用选项

  • -m:直接指定提交信息
  • -a:自动暂存已跟踪文件的修改(跳过git add)
  • --amend:修改最后一次提交
  • --no-verify:跳过pre-commit钩子

示例

git commit -m "修复登录bug"
git commit -am "更新文档"  # 自动暂存已跟踪文件

2.3.2 修改最后一次提交 git commit --amend

功能:修改最后一次提交
用途

  1. 修改提交信息
  2. 添加遗漏的文件
  3. 合并到上一次提交

示例

git commit --amend -m "新的提交信息"
git add forgotten_file.js
git commit --amend --no-edit  # 不修改提交信息

2.4 分支操作命令

2.4.1 分支管理 git branch

功能:分支管理
语法

git branch [选项] [分支名]

常用选项

  • -d:删除分支(已合并)
  • -D:强制删除分支(未合并)
  • -m:重命名分支
  • -a:显示所有分支(包括远程)
  • -v:显示分支最后提交
  • --merged:显示已合并到当前分支的分支

示例

git branch                  # 列出本地分支
git branch -a               # 列出所有分支
git branch new-feature      # 创建新分支
git branch -d old-feature   # 删除分支

2.4.2 切换分支/恢复文件 git checkout

功能:切换分支或恢复文件
语法

git checkout <分支名>       # 切换分支
git checkout -b <新分支名>  # 创建并切换分支
git checkout <文件>        # 恢复文件

新版本替代

git switch <分支名>        # 切换分支
git switch -c <新分支名>   # 创建并切换分支
git restore <文件>         # 恢复文件

示例

git checkout main          # 切换到main分支
git checkout -b hotfix     # 创建并切换到hotfix分支
git checkout HEAD~2 file.js # 恢复文件到前两次提交的版本

2.4.3 合并分支 git merge

功能:合并分支
语法

git merge <分支名>

合并策略

  • --ff:快进合并(默认)
  • --no-ff:总是创建合并提交
  • --squash:压缩合并为一个提交

示例

git checkout main
git merge dev              # 合并dev分支到main
git merge --no-ff feature  # 非快进合并

2.4.4 变基操作 git rebase

功能:变基,重写提交历史
语法

git rebase <目标分支>

交互式变基

git rebase -i <commit>

操作命令

  • pick:保留提交
  • reword:修改提交信息
  • edit:修改提交内容
  • squash:合并到前一个提交
  • fixup:类似squash但丢弃提交信息
  • drop:删除提交

示例

git checkout feature
git rebase main           # 将feature变基到main
git rebase -i HEAD~3      # 交互式修改最近3个提交

2.5 远程操作命令

2.5.1 远程仓库管理 git remote

功能:管理远程仓库
语法

git remote [-v]                  # 查看远程仓库
git remote add <名称> <URL>      # 添加远程仓库
git remote rename <旧名> <新名>   # 重命名
git remote remove <名称>         # 删除
git remote show <名称>           # 查看详情

示例

git remote -v
git remote add upstream https://github.com/original/repo.git
git remote rename origin upstream

2.5.2 拉取远程 git fetch

功能:从远程获取最新内容但不合并
语法

git fetch [远程名] [分支名]

示例

git fetch origin        # 获取origin的所有更新
git fetch origin main   # 只获取origin的main分支

2.5.3 拉取并合并远程 git pull

功能:获取并合并远程更改
语法

git pull [远程名] [分支名]

等效于

git fetch
git merge FETCH_HEAD

选项

  • --rebase:使用变基而非合并

示例

git pull origin main
git pull --rebase origin dev

2.5.4 推送本地 git push

功能:推送本地提交到远程
语法

git push [远程名] [本地分支]:[远程分支]

常用选项

  • -u:设置上游分支
  • --force:强制推送(谨慎使用)
  • --tags:推送所有标签
  • --delete:删除远程分支

示例

git push origin main              # 推送main分支
git push -u origin feature       # 推送并设置上游
git push origin --delete old-branch  # 删除远程分支

2.6 查看信息命令

2.6.1 查看状态 git status

功能:查看工作区和暂存区状态
选项

  • -s:简洁输出
  • -b:显示分支信息

示例

git status       # 详细状态
git status -sb   # 简洁格式带分支信息

2.6.2 查看历史 git log

功能:查看提交历史
常用选项

  • --oneline:单行显示
  • --graph:图形化显示
  • --all:显示所有分支
  • -p:显示差异
  • -n:显示最近n条记录
  • --since/--until:时间筛选
  • --author:按作者筛选
  • --grep:按提交信息搜索

示例

git log -n 3                   # 最近3条提交
git log --oneline --graph --all  # 图形化显示
git log --since="2023-01-01" --until="2023-12-31"

2.6.3 查看差异 git diff

功能:查看差异
常用形式

git diff              # 工作区与暂存区差异
git diff --staged     # 暂存区与最后一次提交差异
git diff HEAD         # 工作区与最后一次提交差异
git diff branch1..branch2  # 两个分支差异
git diff commit1..commit2  # 两次提交差异

2.7 撤销操作命令

2.7.1 重置提交 git reset

功能:重置当前HEAD到指定状态
三种模式

  1. --soft:只重置提交历史,保留工作区和暂存区
  2. --mixed(默认):重置提交历史和暂存区,保留工作区
  3. --hard:完全重置,丢弃所有修改

示例

git reset HEAD~1            # 回退一个提交(保留修改)
git reset --hard HEAD~3     # 彻底回退三个提交
git reset <commit> -- <file> # 重置单个文件

2.7.2 撤销提交 git revert

功能:创建新的提交来撤销指定提交
与reset区别:不会重写历史,适合已推送的提交

示例

git revert HEAD         # 撤销最后一次提交
git revert <commit-hash>  # 撤销特定提交
git revert -m 1 <merge-commit>  # 撤销合并提交

2.7.3 恢复文件 git restore

功能:恢复工作区或暂存区文件
语法

git restore [--source=<commit>] [--staged] [--worktree] <file>

示例

git restore file.txt          # 从暂存区恢复工作区文件
git restore --staged file.txt # 从HEAD恢复暂存区文件
git restore --source=HEAD~2 file.txt  # 从特定提交恢复

2.8 储藏操作命令

2.8.1 临时储藏修改 git stash

功能:临时储藏工作区修改
常用命令

git stash                   # 储藏当前修改
git stash push -m "消息"    # 带消息储藏
git stash list              # 查看储藏列表
git stash apply [stash@{n}] # 恢复储藏
git stash pop               # 恢复并删除储藏
git stash drop [stash@{n}]  # 删除储藏
git stash clear             # 清除所有储藏

示例

git stash push -m "WIP: login feature"
git stash apply stash@{1}

2.9 标签操作命令

2.9.1 标签管理 git tag

功能:管理标签(标记重要版本)
语法

git tag                     # 列出标签
git tag <标签名>             # 创建轻量标签
git tag -a <标签名> -m "消息" # 创建附注标签
git tag -d <标签名>          # 删除标签
git show <标签名>            # 查看标签详情

推送标签

git push origin <标签名>     # 推送单个标签
git push origin --tags       # 推送所有标签

示例

git tag v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0z


3. 高级操作介绍

3.1 变基操作

变基(Rebase)是 Git 中一个强大的历史重写工具,它可以将一系列提交移动到新的基础提交上。与合并(merge)不同,变基会重新应用提交,从而创建更线性的项目历史。

3.1.1 概念介绍

  1. 工作原理

    • 找到当前分支和目标分支的共同祖先
    • 提取当前分支的差异(补丁)
    • 将这些差异应用到目标分支的最新提交上
    • 在目标分支上创建新的提交
  2. 与合并的区别

    特性 变基(Rebase) 合并(Merge)
    历史记录 线性、整洁 保留实际开发过程
    提交ID 会改变 保留原始提交
    适用场景 本地分支整理 公共分支整合

3.1.2 典型用法

  1. 更新本地分支

    git checkout feature
    git rebase main

    这将把 feature 分支的更改"移动"到 main 分支的最新提交之后

  2. 交互式变基

    git rebase -i HEAD~3

    可以:

    • 重新排序提交
    • 合并提交(squash)
    • 修改提交信息(reword)
    • 编辑提交内容(edit)
    • 删除提交(drop)
  3. 解决变基冲突
    当变基过程中出现冲突时:

    # 解决冲突后
    git add <冲突文件>
    git rebase --continue
    # 或放弃变基
    git rebase --abort

提示

  1. 黄金法则:不要对已经推送到远程仓库的提交进行变基
  2. 适用场景
    • 整理本地提交历史
    • 在合并到主分支前更新特性分支
    • 将多个小提交合并为更有意义的提交
  3. 风险提示
    • 变基会重写提交历史
    • 可能导致协作问题(如果其他人基于你的旧提交工作)

3.2 Git钩子

Git钩子(Hooks)是在 Git 操作特定时间点自动运行的脚本,用于自定义和自动化 Git 工作流程。

3.2.1 核心概念

  1. 工作原理

    • 存储在 .git/hooks/ 目录下的可执行文件
    • 在特定 Git 事件发生时触发
    • 可以阻止操作(通过非零退出码)
  2. 钩子类型

    钩子类型 触发时机 常见用途
    pre-commit 提交前 代码风格检查、测试运行
    commit-msg 提交信息编辑后 验证提交信息格式
    post-commit 提交完成后 通知、日志记录
    pre-push 推送到远程前 运行完整测试套件
    pre-rebase 变基前 防止重要分支被变基
    post-checkout 检出分支后 自动安装依赖
    post-merge 合并完成后 重建项目文件

示例

  1. pre-commit 示例

    #!/bin/sh
    # 检查是否有调试代码
    if git diff --cached | grep "console.log"; then
     echo "错误:提交包含调试代码!"
     exit 1
    fi
  2. commit-msg 示例

    #!/bin/sh
    # 确保提交信息符合规范
    if ! grep -qE "^[A-Z]+-[0-9]+: .{5,}" "$1"; then
     echo "提交信息格式错误!示例:JIRA-123: 描述性信息"
     exit 1
    fi
  3. 安装钩子

    • 将脚本放入 .git/hooks/ 目录

    • 确保文件可执行:

      chmod +x .git/hooks/pre-commit

3.2.2 高级技巧

  1. 共享钩子

    • 将钩子存储在项目目录中(如 scripts/hooks/
    • 使用符号链接或安装脚本复制到 .git/hooks/
  2. 使用钩子框架

    • Husky:现代化的 Git 钩子管理
    • pre-commit:多语言预提交框架
  3. 跨平台考虑

    • 使用 shell 脚本或 Node.js/Python 等跨平台语言
    • 避免使用平台特定的命令

3.3 冲突处理

冲突处理是 Git 协作开发中的关键技能,当 Git 无法自动合并更改时,需要手动解决冲突。

常见冲突场景

  • 两个分支修改了同一文件的同一区域
  • 一个分支删除文件而另一个分支修改了该文件
  • 二进制文件冲突(如图片、文档)

3.3.1 冲突解决流程

  1. 识别冲突

    git merge feature-branch
    # 或
    git rebase feature-branch

    出现 CONFLICT 提示

  2. 查看冲突状态

    git status

    显示未合并的路径

  3. 手动解决冲突

    • 使用编辑器打开冲突文件
    • 决定保留哪些更改(或组合两者)
    • 删除冲突标记(<<<<<<<, =======, >>>>>>>)
  4. 标记冲突已解决

    git add <冲突文件>
  5. 完成操作

    git commit  # 合并冲突
    # 或
    git rebase --continue  # 变基冲突

3.3.2 复杂冲突场景处理

  1. 大量文件冲突

    # 查看所有冲突文件
    git diff --name-only --diff-filter=U
  2. 二进制文件冲突

    • 通常需要手动决定保留哪个版本
    • 使用 git checkout --ours/theirs 选择版本
  3. 已提交的冲突解决

    git commit -m "Merge conflict resolution"
    git push
  4. 中止冲突解决

    git merge --abort
    git rebase --abort
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇