Git 和 GitHub:(五)一文给出常用 Git 命令,持续更新中......

上一篇 下一篇
Git Bash 的使用与快捷键

目 录

  • [Git 命令](#Git 命令)
    • [2.1)git -v(查看本地 git 版本)](#2.1)git -v(查看本地 git 版本))
    • [2.2)git init(初始化本地 git 仓库)](#2.2)git init(初始化本地 git 仓库))
    • [2.3)git clone(克隆远程仓库)](#2.3)git clone(克隆远程仓库))
    • [2.4)git remote(管理远程仓库)](#2.4)git remote(管理远程仓库))
    • [2.5)git fetch(拉取最新更改,但不合并不修改)](#2.5)git fetch(拉取最新更改,但不合并不修改))
    • [2.6)git pull(拉取远程最新更改,merge/rebase)](#2.6)git pull(拉取远程最新更改,merge/rebase))
    • [2.7)git checkout(旧,切换分支,没有则创建)](#2.7)git checkout(旧,切换分支,没有则创建))
    • [2.8)git switch(新,切换分支,没有则创建)](#2.8)git switch(新,切换分支,没有则创建))
    • [2.9)git add(将修改添加到暂存区)](#2.9)git add(将修改添加到暂存区))
    • [2.10)git commit(提交修改到本地仓库)](#2.10)git commit(提交修改到本地仓库))
    • [2.11)git status(查看哪些文件被修改/新增......)](#2.11)git status(查看哪些文件被修改/新增……))
    • [2.12)git log(查看提交历史记录)](#2.12)git log(查看提交历史记录))
    • [2.13)git merge(合并提交,合进来)](#2.13)git merge(合并提交,合进来))
    • [2.14)git rebase(变基提交,搬过去)](#2.14)git rebase(变基提交,搬过去))
    • [2.15)git push(将提交推送到远程仓库)](#2.15)git push(将提交推送到远程仓库))
    • [2.16)git branch(操作本地分支)](#2.16)git branch(操作本地分支))
    • [2.17)git stash(临时保存修改)](#2.17)git stash(临时保存修改))
    • [2.18)git restore(恢复工作区或暂存区)](#2.18)git restore(恢复工作区或暂存区))
    • [2.19)git reset(回退最近的提交或改动)](#2.19)git reset(回退最近的提交或改动))

Git 命令

所有命令均需要右键点击【Git Bash here】之后,在命令交互框内执行

命令大小写敏感 !!!

2.1)git -v(查看本地 git 版本)

在 Git CMD / Git Bash 中,使用 git -v 可以查看 git 的版本


2.2)git init(初始化本地 git 仓库)

① 作用: 在本地初始化一个新的 Git 仓库 (即在当前目录或指定目录中创建 .git 子目录)

② 常用选项:

③ 使用方式:

  • 方式一 :先进入一个已存在的空文件夹(该文件夹的名称通常被当作"本地仓库名"),然后执行 git init 初始化

    • 示例:

      bash 复制代码
      mkdir my-project-git1
      cd my-project-git1
      git init

      也可以在非空文件夹中使用,不过后续 git add 的时候就会把一开始已存在的内容添加到暂存区然后提交。

  • 方式二 :直接使用 git init <目录名>,Git 会自动创建名为 <目录名> 的新文件夹,并在其中初始化仓库

    • 示例:

      bash 复制代码
      git init my-project-git1

④ 注意:

  • Git 本身没有 "仓库名" 的概念,所谓 "仓库名" 通常指本地文件夹名或远程托管平台上的项目名(如 GitHub 的 username/repo

2.3)git clone(克隆远程仓库)

必须在一个空文件夹内操作!!!!如果目标文件夹存在且非空,Git 会报错,拒绝克隆!

bash 复制代码
git clone -[选项] <远程仓库分支名> <url> <本地目录名>
# (完整版指令)克隆远程仓库的某个分支到某个本地文件夹下, 自动初始化并关联远程地址

① 作用: 从远程仓库克隆一份完整副本到本地,自动初始化并关联远程地址

② 常用选项:

  • -b <branch>:指定要克隆的分支
  • --depth 1:浅克隆(只拉取最新一次提交,节省时间与空间)
  • .:克隆到当前文件夹,不再新建文件夹

③ 使用方式:

  • 方式一: 克隆整个仓库到当前目录下(会先创建并进入一个和仓库名同名的文件夹,再进行存放)

    • 示例:

      bash 复制代码
      git clone https://github.com/user/my-project.git
  • 方式二: 克隆整个仓库到当前目录下(不再新建文件夹)

    • 示例:

      bash 复制代码
      git clone https://github.com/user/my-project.git .
  • 方式三: 克隆远程仓库的某个分支,并保存到本地文件夹名(本地目录名)

    • 示例:

      bash 复制代码
      # git clone -b 分支名 仓库地址 目标文件夹名
      git clone -b dev https://github.com/user/my-project.git my-project-dev
      # 克隆https://github.com/user/my-project.git远程仓库的dev分支到本地文件夹my-project-dev下
  • 克隆远程仓库的某个分支,并加上 --recursive 选项

    • 示例:

      bash 复制代码
      git clone --recursive -b 分支名 <url>

      其中 -b 后面要紧跟分支名


2.4)git remote(管理远程仓库)

① 作用: 管理远程仓库的名称与 URL(如 origin、upstream 等)

② 常用子命令/选项:

  • git remote add <远程仓库名> <url>:(还没有关联或克隆远程仓库)添加一个远程仓库
  • git remote -v:(已经关联或克隆远程仓库)列出所有关联/克隆的远程仓库及其 URL
  • git remote set-url <远程仓库名> <new-url>:(已经关联或克隆远程仓库)修改远程仓库的 URL

③ 使用方式:

  • 查看当前远程仓库及其 URL

    • 示例:

      bash 复制代码
      git remote -v
  • 添加名为 origin 的远程仓库(以 HTTPS 格式为例)

    • 示例:

      bash 复制代码
      git remote add origin https://github.com/user/my-project.git

2.5)git fetch(拉取最新更改,但不合并不修改)

bash 复制代码
git fetch -[选项] <远程仓库名> <分支名>

① 作用: 从远程仓库下载最新提交和对象到(.git 目录下),但不自动合并、不修改工作区或当前分支

② 常用选项:

  • --all:拉取所有配置的远程仓库(如 originupstream 等)的更新(多 remote 场景)
  • <远程仓库名> <branch>:只拉取指定远程仓库的特定分支(如 git fetch origin dev
  • -p--prune 清理已删除的远程分支引用(强烈推荐定期使用!)
    • 例如:同事在 GitHub 上删了 feature/login,你本地的 origin/feature/login 也会被自动移除

③ 使用方式:

  • 获取 origin 的最新数据(不改变本地分支)

    • 示例:

      bash 复制代码
      git fetch origin
  • 查看远程分支状态后再决定是否合并

    • 示例:

      bash 复制代码
      git fetch origin
      git log main..origin/main  # 查看本地 main 缺少哪些远程提交
      git diff main origin/main  # 对比代码差异
  • 清理 "僵尸" 远程分支引用(推荐定期执行)

    • 示例:

      bash 复制代码
      git fetch -p   # 或 git fetch --prune

2.6)git pull(拉取远程最新更改,merge/rebase)

可以先看看后面的 git merge 和 git rebase

bash 复制代码
git pull -[选项] <远程仓库名> <分支名>

① 作用:

用于从远程仓库获取最新代码并整合到当前分支 。本质是 两个操作的组合 ,但具体是哪两个,取决于是否使用 --rebase 选项

② 常用选项:

  • --rebase:用 rebase 替代 merge,保持线性历史
  • <remote> <branch>:指定拉取的远程分支

③ 使用方式:

  • 拉取并合并远程 main 分支

    • 示例:

      bash 复制代码
      git pull origin main
  • 以 rebase 方式同步更新(推荐用于个人分支)

    • 示例:

      bash 复制代码
      git pull --rebase origin main

④ 理解:

  • 默认行为:git pull = git fetch +git merge

    bash 复制代码
    git pull origin main
    # 等价于:
    git fetch origin        # 1. 获取远程最新数据(不改变工作区)
    git merge origin/main   # 2. 将远程分支合并到当前分支

    会产生一个 合并提交,保留分叉结构,真实反映开发过程

  • 使用 --rebasegit pull --rebase = git fetch + git rebase

    bash 复制代码
    git pull --rebase origin main
    # 等价于:
    git fetch origin         # 1. 获取远程最新数据
    git rebase origin/main   # 2. 将本地提交"变基"到远程分支之后

    线性历史,无合并提交,看起来像所有工作都在最新代码基础上顺序完成


2.7)git checkout(旧,切换分支,没有则创建)

① 作用: 切换分支,或恢复工作区文件(旧用法)

② 常用选项:

  • -b <branch>:创建并切换到新分支
  • -- <file>:丢弃工作区对某文件的修改(慎用)

③ 使用方式:

  • 切换到已有分支

    • 示例:

      bash 复制代码
      git checkout main
  • 创建并切换到新分支

    • 示例:

      bash 复制代码
      git checkout -b feature/login
  • 撤销某个文件的修改(恢复到 HEAD 版本)

    • 示例:

      bash 复制代码
      git checkout -- README.md

④ 注意:

  • Git 2.23+ 推荐用 git switch 切换分支、git restore 恢复文件,但 checkout 仍广泛使用。

2.8)git switch(新,切换分支,没有则创建)

后续更新


2.9)git add(将修改添加到暂存区)

① 作用: 将工作区的修改添加到暂存区(staging area),为下次提交做准备

② 常用选项:

  • .-A:添加所有变更(包括新增、修改、删除)
  • -i:交互式分块添加(可选择部分修改)

③ 使用方式:

  • 添加所有更改

    • 示例:

      bash 复制代码
      git add .
  • 添加指定文件

    bash 复制代码
    # 添加单个文件
    git add 文件名.c
    
    # 添加多个文件(空格隔开)
    git add 文件1.c 文件2.h 文件3.txt
    
    # 添加某个目录里的所有改动
    git add 子目录/

    如果不确定文件名,git status 会列出所有改动,直接用鼠标选中复制就行。

  • 交互式暂存(git add -i

    bash 复制代码
    git add -i

    会进入一个菜单,可以:

    • 2(update)选择已跟踪的文件
    • 4(add untracked)选择新文件
    • * 输入文件编号批量勾选

2.10)git commit(提交修改到本地仓库)

① 作用: 将暂存区的内容永久保存为一次提交(commit)到本地仓库

② 常用选项:

  • -m "message":直接提供提交信息
  • --amend:修改上一次提交(可改内容或 message)

③ 使用方式:

  • 提交并仅附带一行说明

    • 示例:

      bash 复制代码
      git commit -m "feat: add user login API"
  • 进入编辑页面详细编辑提交说明(一般都是进入Vim)

    • 步骤

      • 键入下列指令后回车:

        bash 复制代码
        git commit
      • 如果有警告,则按指示操作(按E可继续编辑)

      • 按一下 i 键 → 左下角会出现 -- INSERT --,这时就可以正常打字了(输入提交说明)

      • 写完提交说明后,按 Esc 键退出编辑模式。

      • 输入 :wq 并按 Enter,保存并退出,提交就完成了。

    • 如果不想提交了,按 Esc 后输入 :q! 并回车,即可放弃提交。
  • 修改最新一次提交(比如漏加文件或写错更新说明)

    • 示例:

      bash 复制代码
      git add missing-file.txt
      
      # 保留原更新说明
      git commit --amend --no-edit  
      
      # 要修改更新说明
      git commit --amend
      # 然后回车进入编辑页面
    • 然后再次推送的话只能使用如下格式指令(强制推送):

      bash 复制代码
      git push --force-with-lease origin dev/liangxiao	# git push --force-with-lease origin 分支名

2.11)git status(查看哪些文件被修改/新增......)

① 作用: 显示工作区与暂存区的状态(哪些文件被修改、新增、未跟踪等)

② 常用选项:

  • -s:简短输出格式(适合脚本或快速查看)

③ 使用方式:

  • 查看详细状态

    • 示例:

      bash 复制代码
      git status
  • 快速查看(一行一个文件)

    • 示例:

      bash 复制代码
      git status -s

2.12)git log(查看提交历史记录)

① 作用: 查看提交历史记录

② 常用选项:

  • --oneline:每条提交显示为一行(SHA 简写 + message)
  • --graph:显示分支合并图
  • -n <num>:只显示最近 n 条记录

③ 使用方式:

  • 查看最近 5 条简洁日志

    • 示例:

      bash 复制代码
      git log --oneline -5
  • 查看带分支图的完整历史

    • 示例:

      bash 复制代码
      git log --graph --oneline --all
  • 退出 git log

    • 按键盘上的 q 键即可(即 quit 的首字母),如果按 q 没反应,可以试试先按一下 Ctrl + C 再按 q,或者直接按 Ctrl + C 强制中断当前进程(不过 q 是标准退出方式,绝大多数情况管用)。

2.13)git merge(合并提交,合进来)

① 作用: 将指定分支的更改合并到当前分支(创建一个新的合并提交(merge commit),有两个父提交,并且不修改任何已有提交)

② 常用选项:

  • --no-ff:禁用快进合并,强制创建 merge commit(保留分支结构)

③ 使用方式:

  • 合并某个分支到当前分支(以 feature/login 分支为例)

    • 示例:

      bash 复制代码
      git merge feature/login
  • 保留分支历史(推荐用于功能分支合入主干)

    • 示例:

      bash 复制代码
      git merge --no-ff feature/login

④ 理解:

假设有如下历史:

复制代码
A --- B --- C      ← main 分支
     \
      D --- E    ← feature 分支

main 分支提交了 3 次,在 C 提交停下;然后基于 main 的 B 提交创建了 feature 分支;并且在 feature 上做了 D、E 两个新提交

现在在 main 上执行:

bash 复制代码
git merge feature

Git 会创建一个新的合并提交 M,它同时指向 C 和 E:

复制代码
A --- B --- C ------ M   ← main(现在包含合并)
     \      /
      D --- E      ← feature

结果是:

  • 所有原始提交(A、B、C、D、E)一个都没动,ID 不变。

  • 分支的分叉结构被完整保留:你能清楚看到 feature 是从 B 之后分出去的,后来又被合回来。

  • 历史真实反映了开发过程:谁在什么时候开了分支、做了什么、何时合并------全都看得见。


2.14)git rebase(变基提交,搬过去)

① 作用: 将当前分支的提交"移植"到目标分支的最新提交之后,形成线性历史

② 常用选项:

  • -i:交互式 rebase(可 squash、edit、drop 提交)
  • --onto:高级用法,精确控制 rebase 范围

③ 使用方式:

  • 将当前分支变基到 main

    • 示例:

      bash 复制代码
      git rebase main
  • 交互式整理最近 3 个提交

    • 示例:

      bash 复制代码
      git rebase -i HEAD~3

④ 理解:

git rebase 的分支图特点是:把一个分支的提交"搬"到另一个分支的最新提交之后,形成一条线性历史,原来的分叉结构消失

可以用一个具体例子来说明,假设有如下历史:

复制代码
A --- B --- C        ← main 分支
     \
      D --- E      ← feature 分支

main 分支提交了 3 次,在 C 提交停下;然后基于 main 的 B 提交创建了 feature 分支;并且在 feature 上做了 D、E 两个新提交

若此时在 feature 分支上运行:

bash 复制代码
git checkout feature
git rebase main

Git 会:

  1. 找出 feature 相对于 main 的新提交(D、E)
  2. 暂时"移除"D、E
  3. feature 指向 main 的最新提交 C
  4. 重新应用 D、E 的变更(生成新的提交 D'、E')

rebase 之后的分支图:

复制代码
A --- B --- C --- D' --- E'   ← feature 分支
        ↑
      (main 仍在 C)
  • main 仍然在 C(没动);feature 现在是一条从 C 延伸出来的直线 ;原来的 D、E 被替换为新的提交 D'、E'(内容相同,但 commit ID 不同)

  • 分叉痕迹消失了 ,看起来像是你在 main 最新代码基础上直接开发的,无法看出 feature 曾经是独立开发的

  • 如果之后你再切换到 main 并执行 git merge feature,因为 feature 已经基于 main,Git 会直接"快进"(fast-forward),不会产生合并提交:

    bash 复制代码
    git checkout main
    git merge feature

    结果:

    复制代码
    A --- B --- C --- D' --- E'   ← main 和 feature 都指向这里

⑤ 注意:

  • 不要对已推送到公共仓库的提交使用 rebase!
  • git rebase main 之后,main 本身的提交历史并没有被影响。

2.15)git push(将提交推送到远程仓库)

① 作用: 将本地分支的提交推送到远程仓库

② 常用选项:

  • -u:设置上游分支(首次推送时使用,后续可直接 git push
  • --force-with-lease:安全地强制推送(仅在远程未被他人更新时覆盖)

③ 使用方式:

  • 首次推送本地分支并关联远程

    • 示例:

      bash 复制代码
      git push -u origin feature/login
  • 更新已关联的远程分支

    • 示例:

      bash 复制代码
      git push
  • 安全强制推送(修复提交后)

    • 示例:

      bash 复制代码
      git push --force-with-lease origin feature/login
  • 删除远程某个分支

    bash 复制代码
    git push origin --delete 分支名

2.16)git branch(操作本地分支)

① 作用: 列出、创建或删除本地分支

② 常用选项:

  • -d <branch>:删除已合并的分支
  • -D <branch>:强制删除分支(即使未合并)
  • -v:显示每个分支的最新提交

③ 使用方式:

  • 查看所有本地分支

    • 示例:

      bash 复制代码
      git branch
  • 删除已合并的旧分支

    • 示例:

      bash 复制代码
      git branch -d old-feature

2.17)git stash(临时保存修改)

① 作用: 临时保存当前工作区和暂存区的修改,便于切换上下文

② 常用选项:

  • git stash push -m "msg":保存并附带说明
  • git stash pop:恢复最近一次 stash 并删除记录
  • git stash list:查看所有 stash 记录

③ 使用方式:

  • 临时保存修改(不提交)

    • 示例:

      bash 复制代码
      git stash push -m "WIP: half-done form validation"
  • 恢复最近的 stash

    • 示例:

      bash 复制代码
      git stash pop

2.18)git restore(恢复工作区或暂存区)

工作区:本地工程文件夹

暂存区:git add 之后暂存的地方

① 作用: 用于从某个来源恢复工作区或暂存区中的文件,即丢弃修改

② 常用选项:

  • --worktree / -W:恢复工作区(默认行为)
  • --staged / -S:恢复暂存区
  • --source=<tree>:指定恢复来源,默认为暂存区或 HEAD
  • --patch / -p:交互式选择恢复哪些修改块

③ 使用方式:

  • 丢弃工作区的修改(恢复文件到最新的 git add 之后的版本):

    • 这会用暂存区中的版本覆盖工作区的文件,相当于撤销工作区中的改动

    • 示例:

      bash 复制代码
      git restore <file>
      # 或明确指定
      git restore --worktree <file>
  • 取消暂存(把文件从暂存区移回工作区):

    • 这会把文件从暂存区移除,但保留工作区的修改

    • 示例:

      bash 复制代码
      git restore --staged <file>
  • 同时恢复暂存区和工作区:

    • 这会同时把暂存区和工作区都恢复到 HEAD 提交的状态,相当于完全放弃该文件的所有修改。

    • 示例:

      bash 复制代码
      git restore --staged --worktree <file>
      # 或简写为
      git restore -SW <file>
  • 从指定源恢复:

    • 使用 --source 可以从任意提交或分支恢复文件:

    • 示例:

      bash 复制代码
      # 从某个提交恢复某个文件到工作区
      git restore --source=abc1234 <file>
      
      # 从另一个分支恢复某个文件
      git restore --source=main <file>
      
      # 从某个提交恢复某个文件并放入暂存区
      git restore --source=HEAD~2 --staged <file>

④实例:

bash 复制代码
# 丢弃对某个文件的修改
git restore app.js

# 把刚才 git add 的文件撤回来,但修改保留着
git restore --staged app.js

# 从 master 分支"借"一个文件过来
git restore --source=master config.yml

# 交互式恢复:一部分修改要,一部分不要
git restore --patch app.js

2.19)git reset(回退最近的提交或改动)

reset 的核心作用是 移动 HEAD 指针,以及可选地影响暂存区和工作区。

主要用法是:

bash 复制代码
git reset --[选项] HEAD~n		# HEAD代表最新提交, n表示要回退的提交数量, n=1表示回退到上一次提交

根据参数不同,它有三种主要模式:

模式(选项) 暂存区 工作区(本地文件) 常用场景
--soft 不动 不动 撤销 commit,但保留所有改动在暂存区,方便重新提交
--mixed(默认) 重置(清空) 不动 撤销 commit 并取消暂存,改动留在工作区
--hard 重置 清空(丢失) 彻底丢弃某次提交及之后的所有本地真实改动

常用示例:

  1. 撤销最近一次 commit,但保留改动在暂存区

    bash 复制代码
    git reset --soft HEAD~1
    • 撤销最近 n 次 commit,
  2. 撤销最近一次 commit,并把改动放回工作区(取消暂存),文件回到"已修改但未暂存"状态,可以重新选择要 add 哪些

    bash 复制代码
    git reset HEAD~1	# 或显式写成 git reset --mixed HEAD~1
  3. 彻底丢弃最近一次 commit 及其所有改动(危险,除非靠 reflog 找回)

    bash 复制代码
    git reset --hard HEAD~1
  4. 取消 git add(把已暂存的文件移回工作区),这是日常开发中最高频的用法 ------ 把不小心 add 的文件从暂存区移除

    bash 复制代码
    git reset HEAD 文件名
    
    # 或者(新版 Git 提供更友好的提示)
    git restore --staged 文件名
    • 比如 keil 工程不小心把 .uvguix.admin 和 .uvoptx 文件也添加到暂存区了,就可以使用此命令。
  5. 回退到某个特定 commit

    bash 复制代码
    # 查看历史,找到目标 commit 的哈希
    git log --oneline
    
    # 回退到那个 commit(保留之后的所有改动在工作区)
    git reset 目标commit哈希

安全警告:

  • 如果该 commit 已经推送到远程,reset 后再 push 需要 --force-with-lease,会影响其他协作者。
  • 即使 --hard 了,git reflog 仍能看到之前 HEAD 的位置,可以通过 git reset --hard HEAD@{n} 找回。前提是改动曾经被 commit 过或暂存过。

相关推荐
析数塔1 小时前
SleeperGem 技术拆解:恶意 gem 是怎么躲过 CI/CD 扫描的
安全·ci/cd·github
柒和远方1 小时前
V053: 从 Git 回退到 AI 工程治理:Vibe Coding 的 Harness 工作流与质量阀门
git·vibecoding
迷茫中的自我5 小时前
GitHub Actions自动化运维实战:从CI/CD到云原生部署
运维·自动化·github
触底反弹14 小时前
Vibe Coding 不写 Git,等于悬崖边飙车
人工智能·git·面试
官乐15 小时前
如何去创建Github仓库
github
泡沫冰@16 小时前
基于Git、Jenkins、Podman、ECS的CI/CD实践
git·jenkins·podman
zfoo-framework17 小时前
git拦截大于5M文件
git
码流怪侠19 小时前
【GitHub】WorldMonitor:一个工程极致主义的实时全球情报仪表盘深度解析
github
马里马里奥-19 小时前
VS Code Git 工作树:解锁多分支并行开发新体验
git