| 上一篇 | 下一篇 |
|---|---|
| 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初始化-
示例:
bashmkdir my-project-git1 cd my-project-git1 git init也可以在非空文件夹中使用,不过后续 git add 的时候就会把一开始已存在的内容添加到暂存区然后提交。
-
-
方式二 :直接使用
git init <目录名>,Git 会自动创建名为<目录名>的新文件夹,并在其中初始化仓库-
示例:
bashgit init my-project-git1
-
④ 注意:
- Git 本身没有 "仓库名" 的概念,所谓 "仓库名" 通常指本地文件夹名或远程托管平台上的项目名(如 GitHub 的
username/repo)
2.3)git clone(克隆远程仓库)
必须在一个空文件夹内操作!!!!如果目标文件夹存在且非空,Git 会报错,拒绝克隆!
bash
git clone -[选项] <远程仓库分支名> <url> <本地目录名>
# (完整版指令)克隆远程仓库的某个分支到某个本地文件夹下, 自动初始化并关联远程地址
① 作用: 从远程仓库克隆一份完整副本到本地,自动初始化并关联远程地址
② 常用选项:
-b <branch>:指定要克隆的分支--depth 1:浅克隆(只拉取最新一次提交,节省时间与空间).:克隆到当前文件夹,不再新建文件夹
③ 使用方式:
-
方式一: 克隆整个仓库到当前目录下(会先创建并进入一个和仓库名同名的文件夹,再进行存放)
-
示例:
bashgit clone https://github.com/user/my-project.git
-
-
方式二: 克隆整个仓库到当前目录下(不再新建文件夹)
-
示例:
bashgit 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选项-
示例:
bashgit clone --recursive -b 分支名 <url>其中 -b 后面要紧跟分支名
-
2.4)git remote(管理远程仓库)
① 作用: 管理远程仓库的名称与 URL(如 origin、upstream 等)
② 常用子命令/选项:
git remote add <远程仓库名> <url>:(还没有关联或克隆远程仓库)添加一个远程仓库git remote -v:(已经关联或克隆远程仓库)列出所有关联/克隆的远程仓库及其 URLgit remote set-url <远程仓库名> <new-url>:(已经关联或克隆远程仓库)修改远程仓库的 URL
③ 使用方式:
-
查看当前远程仓库及其 URL
-
示例:
bashgit remote -v
-
-
添加名为
origin的远程仓库(以 HTTPS 格式为例)-
示例:
bashgit remote add origin https://github.com/user/my-project.git
-
2.5)git fetch(拉取最新更改,但不合并不修改)
bash
git fetch -[选项] <远程仓库名> <分支名>
① 作用: 从远程仓库下载最新提交和对象到(.git 目录下),但不自动合并、不修改工作区或当前分支
② 常用选项:
--all:拉取所有配置的远程仓库(如origin、upstream等)的更新(多 remote 场景)<远程仓库名> <branch>:只拉取指定远程仓库的特定分支(如git fetch origin dev)-p或--prune清理已删除的远程分支引用(强烈推荐定期使用!)- 例如:同事在 GitHub 上删了
feature/login,你本地的origin/feature/login也会被自动移除
- 例如:同事在 GitHub 上删了
③ 使用方式:
-
获取
origin的最新数据(不改变本地分支)-
示例:
bashgit fetch origin
-
-
查看远程分支状态后再决定是否合并
-
示例:
bashgit fetch origin git log main..origin/main # 查看本地 main 缺少哪些远程提交 git diff main origin/main # 对比代码差异
-
-
清理 "僵尸" 远程分支引用(推荐定期执行)
-
示例:
bashgit 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分支-
示例:
bashgit pull origin main
-
-
以 rebase 方式同步更新(推荐用于个人分支)
-
示例:
bashgit pull --rebase origin main
-
④ 理解:
-
默认行为:
git pull=git fetch+git mergebashgit pull origin main # 等价于: git fetch origin # 1. 获取远程最新数据(不改变工作区) git merge origin/main # 2. 将远程分支合并到当前分支会产生一个 合并提交,保留分叉结构,真实反映开发过程
-
使用
--rebase:git pull --rebase=git fetch+git rebasebashgit pull --rebase origin main # 等价于: git fetch origin # 1. 获取远程最新数据 git rebase origin/main # 2. 将本地提交"变基"到远程分支之后线性历史,无合并提交,看起来像所有工作都在最新代码基础上顺序完成
2.7)git checkout(旧,切换分支,没有则创建)
① 作用: 切换分支,或恢复工作区文件(旧用法)
② 常用选项:
-b <branch>:创建并切换到新分支-- <file>:丢弃工作区对某文件的修改(慎用)
③ 使用方式:
-
切换到已有分支
-
示例:
bashgit checkout main
-
-
创建并切换到新分支
-
示例:
bashgit checkout -b feature/login
-
-
撤销某个文件的修改(恢复到 HEAD 版本)
-
示例:
bashgit checkout -- README.md
-
④ 注意:
- Git 2.23+ 推荐用
git switch切换分支、git restore恢复文件,但checkout仍广泛使用。
2.8)git switch(新,切换分支,没有则创建)
后续更新
2.9)git add(将修改添加到暂存区)
① 作用: 将工作区的修改添加到暂存区(staging area),为下次提交做准备
② 常用选项:
.或-A:添加所有变更(包括新增、修改、删除)-i:交互式分块添加(可选择部分修改)
③ 使用方式:
-
添加所有更改
-
示例:
bashgit add .
-
-
添加指定文件
bash# 添加单个文件 git add 文件名.c # 添加多个文件(空格隔开) git add 文件1.c 文件2.h 文件3.txt # 添加某个目录里的所有改动 git add 子目录/如果不确定文件名,
git status会列出所有改动,直接用鼠标选中复制就行。 -
交互式暂存(
git add -i)bashgit add -i会进入一个菜单,可以:
- 按
2(update)选择已跟踪的文件 - 按
4(add untracked)选择新文件 - 按
*输入文件编号批量勾选
- 按
2.10)git commit(提交修改到本地仓库)
① 作用: 将暂存区的内容永久保存为一次提交(commit)到本地仓库
② 常用选项:
-m "message":直接提供提交信息--amend:修改上一次提交(可改内容或 message)
③ 使用方式:
-
提交并仅附带一行说明
-
示例:
bashgit commit -m "feat: add user login API"
-
-
进入编辑页面详细编辑提交说明(一般都是进入Vim)
-
步骤
-
键入下列指令后回车:
bashgit commit -
如果有警告,则按指示操作(按E可继续编辑)
-
按一下
i键 → 左下角会出现-- INSERT --,这时就可以正常打字了(输入提交说明) -
写完提交说明后,按
Esc键退出编辑模式。 -
输入
:wq并按Enter,保存并退出,提交就完成了。
-
- 如果不想提交了,按
Esc后输入:q!并回车,即可放弃提交。
-
-
修改最新一次提交(比如漏加文件或写错更新说明)
-
示例:
bashgit add missing-file.txt # 保留原更新说明 git commit --amend --no-edit # 要修改更新说明 git commit --amend # 然后回车进入编辑页面 -
然后再次推送的话只能使用如下格式指令(强制推送):
bashgit push --force-with-lease origin dev/liangxiao # git push --force-with-lease origin 分支名
-
2.11)git status(查看哪些文件被修改/新增......)
① 作用: 显示工作区与暂存区的状态(哪些文件被修改、新增、未跟踪等)
② 常用选项:
-s:简短输出格式(适合脚本或快速查看)
③ 使用方式:
-
查看详细状态
-
示例:
bashgit status
-
-
快速查看(一行一个文件)
-
示例:
bashgit status -s
-
2.12)git log(查看提交历史记录)
① 作用: 查看提交历史记录
② 常用选项:
--oneline:每条提交显示为一行(SHA 简写 + message)--graph:显示分支合并图-n <num>:只显示最近 n 条记录
③ 使用方式:
-
查看最近 5 条简洁日志
-
示例:
bashgit log --oneline -5
-
-
查看带分支图的完整历史
-
示例:
bashgit 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分支为例)-
示例:
bashgit merge feature/login
-
-
保留分支历史(推荐用于功能分支合入主干)
-
示例:
bashgit 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上-
示例:
bashgit rebase main
-
-
交互式整理最近 3 个提交
-
示例:
bashgit 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 会:
- 找出
feature相对于main的新提交(D、E) - 暂时"移除"D、E
- 把
feature指向main的最新提交 C - 重新应用 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),不会产生合并提交:bashgit 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:安全地强制推送(仅在远程未被他人更新时覆盖)
③ 使用方式:
-
首次推送本地分支并关联远程
-
示例:
bashgit push -u origin feature/login
-
-
更新已关联的远程分支
-
示例:
bashgit push
-
-
安全强制推送(修复提交后)
-
示例:
bashgit push --force-with-lease origin feature/login
-
-
删除远程某个分支
bashgit push origin --delete 分支名
2.16)git branch(操作本地分支)
① 作用: 列出、创建或删除本地分支
② 常用选项:
-d <branch>:删除已合并的分支-D <branch>:强制删除分支(即使未合并)-v:显示每个分支的最新提交
③ 使用方式:
-
查看所有本地分支
-
示例:
bashgit branch
-
-
删除已合并的旧分支
-
示例:
bashgit branch -d old-feature
-
2.17)git stash(临时保存修改)
① 作用: 临时保存当前工作区和暂存区的修改,便于切换上下文
② 常用选项:
git stash push -m "msg":保存并附带说明git stash pop:恢复最近一次 stash 并删除记录git stash list:查看所有 stash 记录
③ 使用方式:
-
临时保存修改(不提交)
-
示例:
bashgit stash push -m "WIP: half-done form validation"
-
-
恢复最近的 stash
-
示例:
bashgit stash pop
-
2.18)git restore(恢复工作区或暂存区)
工作区:本地工程文件夹
暂存区:git add 之后暂存的地方
① 作用: 用于从某个来源恢复工作区或暂存区中的文件,即丢弃修改
② 常用选项:
--worktree / -W:恢复工作区(默认行为)--staged / -S:恢复暂存区--source=<tree>:指定恢复来源,默认为暂存区或 HEAD--patch / -p:交互式选择恢复哪些修改块
③ 使用方式:
-
丢弃工作区的修改(恢复文件到最新的 git add 之后的版本):
-
这会用暂存区中的版本覆盖工作区的文件,相当于撤销工作区中的改动
-
示例:
bashgit restore <file> # 或明确指定 git restore --worktree <file>
-
-
取消暂存(把文件从暂存区移回工作区):
-
这会把文件从暂存区移除,但保留工作区的修改。
-
示例:
bashgit restore --staged <file>
-
-
同时恢复暂存区和工作区:
-
这会同时把暂存区和工作区都恢复到 HEAD 提交的状态,相当于完全放弃该文件的所有修改。
-
示例:
bashgit 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 |
重置 | 清空(丢失) | 彻底丢弃某次提交及之后的所有本地真实改动 |
常用示例:
-
撤销最近一次 commit,但保留改动在暂存区
bashgit reset --soft HEAD~1- 撤销最近 n 次 commit,
-
撤销最近一次 commit,并把改动放回工作区(取消暂存),文件回到"已修改但未暂存"状态,可以重新选择要 add 哪些
bashgit reset HEAD~1 # 或显式写成 git reset --mixed HEAD~1 -
彻底丢弃最近一次 commit 及其所有改动(危险,除非靠
reflog找回)bashgit reset --hard HEAD~1 -
取消
git add(把已暂存的文件移回工作区),这是日常开发中最高频的用法 ------ 把不小心 add 的文件从暂存区移除bashgit reset HEAD 文件名 # 或者(新版 Git 提供更友好的提示) git restore --staged 文件名- 比如 keil 工程不小心把 .uvguix.admin 和 .uvoptx 文件也添加到暂存区了,就可以使用此命令。
-
回退到某个特定 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 过或暂存过。