Git 和 GitHub:(五)一文给出常用 Git 命令,持续更新中...... 📅 2026/7/26 8:51:19 上一篇下一篇Git Bash 的使用与快捷键目 录Git 命令2.1git -v查看本地 git 版本2.2git init初始化本地 git 仓库2.3git clone克隆远程仓库2.4git remote管理远程仓库2.5git fetch拉取最新更改但不合并不修改2.6git pull拉取远程最新更改merge/rebase2.7git checkout旧切换分支没有则创建2.8git switch新切换分支没有则创建2.9git add将修改添加到暂存区2.10git commit提交修改到本地仓库2.11git status查看哪些文件被修改/新增……2.12git log查看提交历史记录2.13git merge合并提交合进来2.14git rebase变基提交搬过去2.15git push将提交推送到远程仓库2.16git branch操作本地分支2.17git stash临时保存修改2.18git restore恢复工作区或暂存区2.19git reset回退最近的提交或改动Git 命令所有命令均需要右键点击【Git Bash here】之后在命令交互框内执行命令大小写敏感 2.1git -v查看本地 git 版本在 Git CMD / Git Bash 中使用git -v可以查看 git 的版本2.2git init初始化本地 git 仓库① 作用在本地初始化一个新的 Git 仓库即在当前目录或指定目录中创建.git子目录② 常用选项无③ 使用方式方式一先进入一个已存在的空文件夹该文件夹的名称通常被当作“本地仓库名”然后执行git init初始化示例mkdirmy-project-git1cdmy-project-git1gitinit也可以在非空文件夹中使用不过后续 git add 的时候就会把一开始已存在的内容添加到暂存区然后提交。方式二直接使用git init 目录名Git 会自动创建名为目录名的新文件夹并在其中初始化仓库示例gitinit my-project-git1④ 注意Git 本身没有 “仓库名” 的概念所谓 “仓库名” 通常指本地文件夹名或远程托管平台上的项目名如 GitHub 的username/repo2.3git clone克隆远程仓库必须在一个空文件夹内操作如果目标文件夹存在且非空Git 会报错拒绝克隆gitclone -[选项]远程仓库分支名url本地目录名# (完整版指令)克隆远程仓库的某个分支到某个本地文件夹下, 自动初始化并关联远程地址① 作用从远程仓库克隆一份完整副本到本地自动初始化并关联远程地址② 常用选项-b branch指定要克隆的分支--depth 1浅克隆只拉取最新一次提交节省时间与空间.克隆到当前文件夹不再新建文件夹③ 使用方式方式一克隆整个仓库到当前目录下会先创建并进入一个和仓库名同名的文件夹再进行存放示例gitclone https://github.com/user/my-project.git方式二克隆整个仓库到当前目录下不再新建文件夹示例gitclone https://github.com/user/my-project.git.方式三克隆远程仓库的某个分支并保存到本地文件夹名本地目录名示例# git clone -b 分支名 仓库地址 目标文件夹名gitclone-bdev https://github.com/user/my-project.git my-project-dev# 克隆https://github.com/user/my-project.git远程仓库的dev分支到本地文件夹my-project-dev下克隆远程仓库的某个分支并加上--recursive选项示例gitclone--recursive-b分支名url其中 -b 后面要紧跟分支名2.4git remote管理远程仓库① 作用管理远程仓库的名称与 URL如 origin、upstream 等② 常用子命令/选项git remote add 远程仓库名 url还没有关联或克隆远程仓库添加一个远程仓库git remote -v已经关联或克隆远程仓库列出所有关联/克隆的远程仓库及其 URLgit remote set-url 远程仓库名 new-url已经关联或克隆远程仓库修改远程仓库的 URL③ 使用方式查看当前远程仓库及其 URL示例gitremote-v添加名为origin的远程仓库以 HTTPS 格式为例示例gitremoteaddorigin https://github.com/user/my-project.git2.5git fetch拉取最新更改但不合并不修改gitfetch -[选项]远程仓库名分支名① 作用从远程仓库下载最新提交和对象到.git 目录下但不自动合并、不修改工作区或当前分支② 常用选项--all拉取所有配置的远程仓库如origin、upstream等的更新多 remote 场景远程仓库名 branch只拉取指定远程仓库的特定分支如git fetch origin dev-p或--prune清理已删除的远程分支引用强烈推荐定期使用例如同事在 GitHub 上删了feature/login你本地的origin/feature/login也会被自动移除③ 使用方式获取origin的最新数据不改变本地分支示例gitfetch origin查看远程分支状态后再决定是否合并示例gitfetch origingitlog main..origin/main# 查看本地 main 缺少哪些远程提交gitdiffmain origin/main# 对比代码差异清理 “僵尸” 远程分支引用推荐定期执行示例gitfetch-p# 或 git fetch --prune2.6git pull拉取远程最新更改merge/rebase可以先看看后面的 git merge 和 git rebasegitpull -[选项]远程仓库名分支名① 作用用于从远程仓库获取最新代码并整合到当前分支。本质是两个操作的组合但具体是哪两个取决于是否使用--rebase选项② 常用选项--rebase用 rebase 替代 merge保持线性历史remote branch指定拉取的远程分支③ 使用方式拉取并合并远程main分支示例gitpull origin main以 rebase 方式同步更新推荐用于个人分支示例gitpull--rebaseorigin main④ 理解默认行为git pullgit fetchgit mergegitpull origin main# 等价于gitfetch origin# 1. 获取远程最新数据不改变工作区gitmerge origin/main# 2. 将远程分支合并到当前分支会产生一个合并提交保留分叉结构真实反映开发过程使用--rebasegit pull --rebasegit fetchgit rebasegitpull--rebaseorigin main# 等价于gitfetch origin# 1. 获取远程最新数据gitrebase origin/main# 2. 将本地提交“变基”到远程分支之后线性历史无合并提交看起来像所有工作都在最新代码基础上顺序完成2.7git checkout旧切换分支没有则创建① 作用切换分支或恢复工作区文件旧用法② 常用选项-b branch创建并切换到新分支-- file丢弃工作区对某文件的修改慎用③ 使用方式切换到已有分支示例gitcheckout main创建并切换到新分支示例gitcheckout-bfeature/login撤销某个文件的修改恢复到 HEAD 版本示例gitcheckout -- README.md④ 注意Git 2.23 推荐用git switch切换分支、git restore恢复文件但checkout仍广泛使用。2.8git switch新切换分支没有则创建后续更新2.9git add将修改添加到暂存区① 作用将工作区的修改添加到暂存区staging area为下次提交做准备② 常用选项.或-A添加所有变更包括新增、修改、删除-i交互式分块添加可选择部分修改③ 使用方式添加所有更改示例gitadd.添加指定文件# 添加单个文件gitadd文件名.c# 添加多个文件空格隔开gitadd文件1.c 文件2.h 文件3.txt# 添加某个目录里的所有改动gitadd子目录/如果不确定文件名git status会列出所有改动直接用鼠标选中复制就行。交互式暂存git add -igitadd-i会进入一个菜单可以按2update选择已跟踪的文件按4add untracked选择新文件按*输入文件编号批量勾选2.10git commit提交修改到本地仓库① 作用将暂存区的内容永久保存为一次提交commit到本地仓库② 常用选项-m message直接提供提交信息--amend修改上一次提交可改内容或 message③ 使用方式提交并仅附带一行说明示例gitcommit-mfeat: add user login API进入编辑页面详细编辑提交说明一般都是进入Vim步骤键入下列指令后回车gitcommit如果有警告则按指示操作按E可继续编辑按一下i键 → 左下角会出现-- INSERT --这时就可以正常打字了输入提交说明写完提交说明后按Esc键退出编辑模式。输入:wq并按Enter保存并退出提交就完成了。如果不想提交了按Esc后输入:q!并回车即可放弃提交。修改最新一次提交比如漏加文件或写错更新说明示例gitaddmissing-file.txt# 保留原更新说明gitcommit--amend--no-edit# 要修改更新说明gitcommit--amend# 然后回车进入编辑页面然后再次推送的话只能使用如下格式指令强制推送gitpush --force-with-lease origin dev/liangxiao# git push --force-with-lease origin 分支名2.11git status查看哪些文件被修改/新增……① 作用显示工作区与暂存区的状态哪些文件被修改、新增、未跟踪等② 常用选项-s简短输出格式适合脚本或快速查看③ 使用方式查看详细状态示例gitstatus快速查看一行一个文件示例gitstatus-s2.12git log查看提交历史记录① 作用查看提交历史记录② 常用选项--oneline每条提交显示为一行SHA 简写 message--graph显示分支合并图-n num只显示最近 n 条记录③ 使用方式查看最近 5 条简洁日志示例gitlog--oneline-5查看带分支图的完整历史示例gitlog--graph--oneline--all退出 git log按键盘上的q键即可即 quit 的首字母如果按q没反应可以试试先按一下Ctrl C再按q或者直接按Ctrl C强制中断当前进程不过q是标准退出方式绝大多数情况管用。2.13git merge合并提交合进来① 作用将指定分支的更改合并到当前分支创建一个新的合并提交merge commit有两个父提交并且不修改任何已有提交② 常用选项--no-ff禁用快进合并强制创建 merge commit保留分支结构③ 使用方式合并某个分支到当前分支以feature/login分支为例示例gitmerge feature/login保留分支历史推荐用于功能分支合入主干示例gitmerge --no-ff feature/login④ 理解假设有如下历史A — B — C ← main 分支 \ D — E ← feature 分支main分支提交了 3 次在 C 提交停下然后基于main的 B 提交创建了feature分支并且在feature上做了 D、E 两个新提交现在在main上执行gitmerge featureGit 会创建一个新的合并提交 M它同时指向 C 和 EA — B — C —— M ← main现在包含合并 \ / D — E ← feature结果是所有原始提交A、B、C、D、E一个都没动ID 不变。分支的分叉结构被完整保留你能清楚看到feature是从 B 之后分出去的后来又被合回来。历史真实反映了开发过程谁在什么时候开了分支、做了什么、何时合并——全都看得见。2.14git rebase变基提交搬过去① 作用将当前分支的提交“移植”到目标分支的最新提交之后形成线性历史② 常用选项-i交互式 rebase可 squash、edit、drop 提交--onto高级用法精确控制 rebase 范围③ 使用方式将当前分支变基到main上示例gitrebase main交互式整理最近 3 个提交示例gitrebase-iHEAD~3④ 理解git rebase的分支图特点是把一个分支的提交“搬”到另一个分支的最新提交之后形成一条线性历史原来的分叉结构消失。可以用一个具体例子来说明假设有如下历史A — B — C ← main 分支 \ D — E ← feature 分支main分支提交了 3 次在 C 提交停下然后基于main的 B 提交创建了feature分支并且在feature上做了 D、E 两个新提交若此时在feature分支上运行gitcheckout featuregitrebase mainGit 会找出feature相对于main的新提交D、E暂时“移除”D、E把feature指向main的最新提交 C重新应用 D、E 的变更生成新的提交 D’、E’rebase 之后的分支图A — B — C — D — E ← feature 分支 ↑ main 仍在 Cmain仍然在 C没动feature现在是一条从 C 延伸出来的直线原来的 D、E 被替换为新的提交 D’、E’内容相同但 commit ID 不同分叉痕迹消失了看起来像是你在main最新代码基础上直接开发的无法看出feature曾经是独立开发的如果之后你再切换到main并执行git merge feature因为feature已经基于mainGit 会直接“快进”fast-forward不会产生合并提交gitcheckout maingitmerge feature结果A — B — C — D — E ← main 和 feature 都指向这里⑤ 注意不要对已推送到公共仓库的提交使用 rebasegit rebase main 之后main 本身的提交历史并没有被影响。2.15git push将提交推送到远程仓库① 作用将本地分支的提交推送到远程仓库② 常用选项-u设置上游分支首次推送时使用后续可直接git push--force-with-lease安全地强制推送仅在远程未被他人更新时覆盖③ 使用方式首次推送本地分支并关联远程示例gitpush-uorigin feature/login更新已关联的远程分支示例gitpush安全强制推送修复提交后示例gitpush --force-with-lease origin feature/login删除远程某个分支gitpush origin--delete分支名2.16git branch操作本地分支① 作用列出、创建或删除本地分支② 常用选项-d branch删除已合并的分支-D branch强制删除分支即使未合并-v显示每个分支的最新提交③ 使用方式查看所有本地分支示例gitbranch删除已合并的旧分支示例gitbranch-dold-feature2.17git stash临时保存修改① 作用临时保存当前工作区和暂存区的修改便于切换上下文② 常用选项git stash push -m msg保存并附带说明git stash pop恢复最近一次 stash 并删除记录git stash list查看所有 stash 记录③ 使用方式临时保存修改不提交示例gitstash push-mWIP: half-done form validation恢复最近的 stash示例gitstash pop2.18git restore恢复工作区或暂存区工作区本地工程文件夹暂存区git add 之后暂存的地方① 作用用于从某个来源恢复工作区或暂存区中的文件即丢弃修改② 常用选项--worktree / -W恢复工作区默认行为--staged / -S恢复暂存区--sourcetree指定恢复来源默认为暂存区或 HEAD--patch / -p交互式选择恢复哪些修改块③ 使用方式丢弃工作区的修改恢复文件到最新的 git add 之后的版本这会用暂存区中的版本覆盖工作区的文件相当于撤销工作区中的改动示例gitrestorefile# 或明确指定gitrestore--worktreefile取消暂存把文件从暂存区移回工作区:这会把文件从暂存区移除但保留工作区的修改。示例gitrestore--stagedfile同时恢复暂存区和工作区这会同时把暂存区和工作区都恢复到 HEAD 提交的状态相当于完全放弃该文件的所有修改。示例gitrestore--staged--worktreefile# 或简写为gitrestore-SWfile从指定源恢复使用--source可以从任意提交或分支恢复文件示例# 从某个提交恢复某个文件到工作区gitrestore--sourceabc1234file# 从另一个分支恢复某个文件gitrestore--sourcemainfile# 从某个提交恢复某个文件并放入暂存区gitrestore--sourceHEAD~2--stagedfile④实例# 丢弃对某个文件的修改gitrestore app.js# 把刚才 git add 的文件撤回来但修改保留着gitrestore--stagedapp.js# 从 master 分支借一个文件过来gitrestore--sourcemaster config.yml# 交互式恢复一部分修改要一部分不要gitrestore--patchapp.js2.19git reset回退最近的提交或改动reset 的核心作用是移动 HEAD 指针以及可选地影响暂存区和工作区。主要用法是gitreset --[选项]HEAD~n# HEAD代表最新提交, n表示要回退的提交数量, n1表示回退到上一次提交根据参数不同它有三种主要模式模式选项暂存区工作区本地文件常用场景--soft不动不动撤销 commit但保留所有改动在暂存区方便重新提交--mixed默认重置清空不动撤销 commit 并取消暂存改动留在工作区--hard重置清空丢失彻底丢弃某次提交及之后的所有本地真实改动常用示例撤销最近一次 commit但保留改动在暂存区gitreset--softHEAD~1撤销最近 n 次 commit撤销最近一次 commit并把改动放回工作区取消暂存文件回到“已修改但未暂存”状态可以重新选择要 add 哪些gitreset HEAD~1# 或显式写成 git reset --mixed HEAD~1彻底丢弃最近一次 commit 及其所有改动危险除非靠reflog找回gitreset--hardHEAD~1取消git add把已暂存的文件移回工作区这是日常开发中最高频的用法 —— 把不小心 add 的文件从暂存区移除gitreset HEAD 文件名# 或者新版 Git 提供更友好的提示gitrestore--staged文件名比如 keil 工程不小心把 .uvguix.admin 和 .uvoptx 文件也添加到暂存区了就可以使用此命令。回退到某个特定 commit# 查看历史找到目标 commit 的哈希gitlog--oneline# 回退到那个 commit保留之后的所有改动在工作区gitreset 目标commit哈希安全警告如果该 commit 已经推送到远程reset后再push需要--force-with-lease会影响其他协作者。即使--hard了git reflog仍能看到之前 HEAD 的位置可以通过git reset --hard HEAD{n}找回。前提是改动曾经被 commit 过或暂存过。