Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 于 2005 年开发,用于高效管理项目版本变更,支持从个人到大型团队的协作开发。 它以本地化操作、快照存储和分支管理为核心特性,成为全球软件开发的标准工具。
我们就从最基础的 git init、git add、git commit 开始,一步步理解 Git 的运作机制;再到远程协作、分支管理、版本回退、冲突解决,乃至高级操作如 rebase 与 stash。每一个命令都配有实际使用场景和直观示例,让你不仅“会用”,更能“用得明白”。
一、快速开始
1、git客户端命令行
使用git命令直接查看,如下所示:
C:Usersyeqin>gitusage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch] [--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>] <command> [<args>]These are common Git commands used in various situations:start a working area (see also: git help tutorial) clone Clone a repository into a new directory init Create an empty Git repository or reinitialize an existing onework on the current change (see also: git help everyday) add Add file contents to the index mv Move or rename a file, a directory, or a symlink restore Restore working tree files rm Remove files from the working tree and from the indexexamine the history and state (see also: git help revisions) bisect Use binary search to find the commit that introduced a bug diff Show changes between commits, commit and working tree, etc grep Print lines matching a pattern log Show commit logs show Show various types of objects status Show the working tree statusgrow, mark and tweak your common history backfill Download missing objects in a partial clone branch List, create, or delete branches commit Record changes to the repository merge Join two or more development histories together rebase Reapply commits on top of another base tip reset Reset current HEAD to the specified state switch Switch branches tag Create, list, delete or verify a tag object signed with GPGcollaborate (see also: git help workflows) fetch Download objects and refs from another repository pull Fetch from and integrate with another repository or a local branch push Update remote refs along with associated objects'git help -a' and 'git help -g' list available subcommands and someconcept guides. See 'git help <command>' or 'git help <concept>'to read about a specific subcommand or concept.See 'git help git' for an overview of the system.
什么意思?我们翻译成中文看看:
C:Usersyeqin>git用法:git [-v | --version] [-h | --help] [-C <路径>] [-c <名称>=<值>][--exec-path[=<路径>]] [--html-path] [--man-path] [--info-path][-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch][--no-optional-locks] [--no-advice] [--bare] [--git-dir=<路径>][--work-tree=<路径>] [--namespace=<名称>] [--config-env=<名称>=<环境变量>]<命令> [<参数>]这些是在各种情况下常用的 Git 命令:开始一个工作区(参见:git help tutorial)clone 将版本库克隆到新目录中init 创建一个空的 Git 版本库或重新初始化一个现有的版本库处理当前变更(参见:git help everyday)add 将文件内容添加到暂存区mv 移动或重命名文件、目录或符号链接restore 恢复工作区文件rm 从工作区和暂存区中删除文件检查历史记录和状态(参见:git help revisions)bisect 使用二分查找找到引入错误的提交diff 显示提交之间、提交与工作区之间的更改等grep 打印匹配模式的行log 显示提交日志show 显示各种类型的对象status 显示工作区状态成长、标记和调整你们的共同历史backfill 在部分克隆中下载缺失的对象branch 列出、创建或删除分支commit 记录对版本库的更改merge 将两个或多个开发历史合并在一起rebase 在另一个基础顶端重新应用提交reset 将当前 HEAD 重置到指定状态switch 切换分支tag 创建、列出、删除或验证使用 GPG 签名的标签对象协作(参见:git help workflows)fetch 从另一个版本库下载对象和引用pull 从另一个版本库或本地分支获取并集成push 更新远程引用及相关对象'git help -a' 和 'git help -g' 列出了可用的子命令和一些概念指南。查看 'git help <命令>' 或 'git help <概念>' 来了解特定子命令或概念。查看 'git help git' 以获取系统的概览。
我们整理成Git 命令速查表:
| 类别 | 命令 | 功能描述 |
|---|---|---|
| 创建工作区 (初始化/获取) | clone |
将远程仓库克隆(下载)到一个新的本地目录。 |
init |
在当前目录创建一个新的空 Git 仓库。 | |
| 处理当前变更 (文件操作) | add |
将文件的变化添加到暂存区,准备下一次提交。 |
mv |
移动或重命名文件、目录。 | |
restore |
恢复工作区的文件(例如,撤销未暂存的更改)。 | |
rm |
从工作区和暂存区中删除文件。 | |
| 检查状态与历史 (查询与比较) | bisect |
使用二分查找定位引入 bug 的特定提交。 |
diff |
显示不同版本之间或版本与工作区之间的差异。 | |
grep |
在代码库中搜索匹配特定模式的文本行。 | |
log |
显示当前分支的提交历史记录。 | |
show |
显示某次提交的详细信息及其更改内容。 | |
status |
显示工作区和暂存区的当前状态(哪些文件被修改、已暂存等)。 | |
| 管理历史记录 (分支与提交) | branch |
列出、创建或删除分支。 |
commit |
将暂存区的内容创建一个新的提交记录。 | |
merge |
将指定分支的历史合并到当前分支。 | |
rebase |
将当前分支的提交“变基”到另一分支之上,创造更线性的历史。 | |
reset |
将当前分支的 HEAD 指针重置到指定的提交状态(可撤销提交)。 | |
switch |
切换到另一个已存在的分支。 | |
tag |
为特定的提交创建一个标签(常用于版本发布)。 | |
| 协作 (与远程仓库交互) | fetch |
从远程仓库下载最新的对象和分支信息,但不合并到工作区。 |
pull |
fetch+merge,下载远程内容并立即合并到当前分支。 |
|
push |
将本地的提交推送到远程仓库。 |
2、git服务端远程仓库
为了验证指令可以创建空的项目
填写项目名称采用默认值,即可创建完成
仓库提供2种与项目通信的方式
以下是 SSH 和 HTTPS 这两种 Git 通信方式的主要区别:
| 特性 | SSH (Secure Shell) | HTTPS (Hypertext Transfer Protocol Secure) |
|---|---|---|
| 身份验证方式 | 使用非对称加密密钥对。 • 私钥 保存在您的本地电脑上。 • 公钥 添加到 Git 服务(如 GitHub, GitLab)的账户设置中。 • 克隆时无需输入密码,通过密钥对自动、安全地验证身份。 | 使用用户名和密码(或更安全的个人访问令牌)。 • 每次推送等操作时,可能会要求您输入凭证。 • 系统可以将凭证缓存起来,避免重复输入。 |
| 安全性 | 非常高。密钥认证方式能有效防止中间人攻击和密码窃取。 | 高。通信内容通过 SSL/TLS 加密。但使用账户密码存在被窃取的风险,因此官方强烈建议使用个人访问令牌 代替密码。 |
| 便利性 | 初始设置稍复杂,需要生成并配置密钥对。 一旦配置完成,后续使用极其方便,无需每次输入凭证。 | 初始设置非常简单,开箱即用,尤其适合新手。 但如果系统不缓存凭证,可能需要频繁输入。 |
| 常用场景 | • 拥有服务器或项目仓库长期、稳定权限的开发者。 • 频繁与仓库进行交互(推送、拉取)的场景。 • 自动化脚本(一旦配置好密钥,无需人工干预)。 | • 公开项目的只读克隆(无需认证)。 • 临时贡献者或偶尔需要推送代码的用户。 • 在公司防火墙后(有时防火墙会限制 SSH 的 22 端口)。 |
| URL 示例 | git@github.com:username/repository.git |
https://github.com/username/repository.git |
这只是用于连接配置,任选一种即可。
二、指令示例用法
我们把每个示例分成三部分“是什么、为什么、怎么样 ”来解释,并针对多用法选项提供多个示例。
1.git clone
是什么:克隆远程仓库到本地。
为什么:获取完整代码库副本。
示例 1:克隆默认分支
git clone https://github.com/user/project.git
场景:初次下载项目。
结果:创建project目录,拉取默认分支(如main)。
示例 2:克隆指定深度(--depth)
git clone --depth 1 https://github.com/user/large-repo.git
场景:仅克隆最新提交(节省时间/空间)。
结果:仓库历史仅保留最近一次提交。
2.git init
是什么:初始化新仓库。
为什么:将现有目录纳入 Git 管理。
示例 1:标准初始化
git init
场景:将当前目录转为 Git 仓库。
结果:创建隐藏的.git目录。
示例 2:指定仓库目录
git init my-project
场景:新建目录并初始化仓库。
结果:创建my-project目录并初始化 Git。
3.git add
是什么:将工作区改动添加到暂存区。
示例 1:添加所有改动(不包含删除)
git add .
场景:准备提交所有新增/修改的文件。
示例 2:添加特定类型文件
git add *.js
场景:只提交所有 JavaScript 文件改动。
示例 3:交互式添加(-p)
git add -p
场景:选择性添加文件中的部分代码块。
4.git commit
是什么:提交暂存区内容到本地仓库。
示例 1:常规提交
git commit -m "修复登录逻辑"
场景:提交暂存区内容并添加描述。
示例 2:修改最近一次提交(--amend)
git commit --amend -m "优化登录逻辑+按钮样式"
场景:修改上次提交的描述或追加遗漏文件。
5.git status
是什么:查看工作区和暂存区状态。
示例 1:标准状态检查
git status
场景:确认哪些文件被修改/暂存。
示例 2:简短模式(-s)
git status -s
结果:紧凑输出(如M README.md表示修改未暂存)。
6.git branch
是什么:管理分支。
示例 1:查看所有分支(含远程)
git branch -a
结果:列出本地和远程分支(远程以remotes/开头)。
示例 2:删除已合并的分支
git branch --merged | grep -v "main" | xargs git branch -d
场景:批量清理已合并到main的旧分支。
7.git checkout/git switch
是什么:切换分支或恢复文件。
示例 1:创建并切换分支(-b)
git switch -c feature-payment
场景:基于当前分支创建feature-payment并切换。
示例 2:丢弃工作区修改
git checkout -- config.yaml
场景:撤销config.yaml的未暂存改动。
8.git merge
是什么:合并分支到当前分支。
示例 1:普通合并
git switch main git merge dev
场景:将dev分支合并到main。
示例 2:终止合并冲突(--abort)
git merge --abort
场景:放弃解决冲突,恢复到合并前状态。
9.git rebase
是什么:变基(重新应用提交)。
示例 1:变基到目标分支
git switch feature git rebase main
场景:将feature的修改基于最新的main重新应用。
示例 2:交互式变基(-i)
git rebase -i HEAD~5
场景:修改最近 5 个提交(合并、重排序、重写描述)。
10.git pull
是什么:拉取远程更新并合并。
示例 1:默认拉取(fetch + merge)
git pull origin main
场景:更新本地main分支。
示例 2:变基式拉取(--rebase)
git pull --rebase
场景:避免产生多余的合并提交。
11.git push
是什么:推送本地提交到远程仓库。
示例 1:推送到同名分支
git push origin feature-auth
场景:将本地分支推送到远程。
示例 2:删除远程分支
git push origin --delete old-branch
场景:清理远程废弃分支。
12.git reset
是什么:重置当前分支的 HEAD。
示例 1:撤销提交(保留改动)
git reset HEAD~1
场景:撤销最近一次提交,改动保留在工作区。
示例 2:硬重置到指定提交
git reset --hard a1b2c3d
场景:丢弃所有本地修改,回退到特定提交。
13.git restore
是什么:恢复工作区或暂存区文件(Git 2.23+)。
示例 1:丢弃工作区修改
git restore README.md
场景:撤销README.md的未暂存修改。
示例 2:从暂存区移除文件
git restore --staged logo.png
场景:误将logo.png添加到暂存区后撤销。
14.git stash
是什么:临时保存工作区改动。
示例 1:保存当前改动
git stash push -m "暂存登录模块修改"
场景:临时切换分支处理紧急任务。
示例 2:恢复暂存内容
git stash pop
场景:回到原分支后恢复未完成的修改。
15.git log
是什么:查看提交历史。
示例 1:图形化显示分支(--graph)
git log --graph --oneline --all
结果:可视化分支合并历史。
示例 2:按时间过滤
git log --since="2024-01-01" --until="2024-01-15"
场景:查看某时间范围内的提交。
16.git diff
是什么:显示差异。
示例 1:工作区与暂存区差异
git diff
场景:查看未暂存的修改内容。
示例 2:暂存区与最后一次提交差异
git diff --staged
场景:确认即将提交的内容。
17.git remote
是什么:管理远程仓库。
示例 1:添加远程仓库
git remote add upstream https://github.com/original/repo.git
场景:为 fork 的仓库添加源仓库地址。
示例 2:重命名远程
git remote rename origin my-fork
场景:避免与团队仓库命名冲突。
18.git tag
是什么:管理版本标签。
示例 1:创建轻量标签
git tag v1.0.0
场景:标记发布版本。
示例 2:创建含注释的标签
git tag -a v1.1.0 -m "正式发布用户管理模块"
场景:记录版本详细信息。
19.git cherry-pick
是什么:复制特定提交到当前分支。
示例 1:复制单个提交
git cherry-pick a1b2c3d
场景:将修复 bug 的提交应用到生产分支。
示例 2:复制多个提交
git cherry-pick commitA..commitB
场景:移植某功能的所有相关提交(不包含 commitA)。
20.git bisect
是什么:二分查找问题提交。
示例:定位引入 bug 的提交
git bisect start git bisect bad HEAD # 当前版本有 bug git bisect good v1.0.0 # 该版本正常 # 根据测试结果标记 good/bad,Git 自动定位问题提交
场景:快速定位大型项目中引入问题的代码变更。
21.git submodule
是什么:管理嵌套子仓库。
示例 1:添加子模块
git submodule add https://github.com/user/lib.git
场景:在项目中引用第三方库。
示例 2:更新子模块
git submodule update --remote
场景:拉取子模块的最新提交。
22.git worktree
是什么:管理多个工作目录。
示例:为分支创建独立目录
git worktree add ../hotfix-branch hotfix/urgent
场景:同时开发多个功能/修复,避免频繁切换分支。
23.git reflog
是什么:查看本地操作历史(救命命令!)。
示例:找回误删分支
git reflog # 找到删除分支前的操作记录(如 a1b2c3d) git branch recovery-branch a1b2c3d
场景:恢复被reset --hard或branch -D删除的内容。
24.git grep
是什么:代码内容搜索。
示例:全项目搜索关键词
git grep "deprecated_function"
场景:快速定位废弃代码的位置。
25.git blame
是什么:查看文件每行最后修改信息。
示例:定位代码作者
git blame -L 10,20 utils.py
场景:确认文件第 10-20 行的修改者和提交。
附:高频组合命令
| 场景 | 命令 |
|---|---|
| 丢弃所有未提交改动 | git reset --hard HEAD && git clean -fd |
| 修改最近 3 次提交信息 | git rebase -i HEAD~3→ 将pick改为reword |
| 将暂存区重置为远程分支状态 | git fetch origin && git reset --hard origin/main |
三、综合应用
1、将本地工程上传到Git仓库(由0到1)
(1)任务背景
- 环境: Ubuntu22.04
- 项目位置:/home/smore/ELapps
- 目标: 将本地工程上传到Git仓库
- 特殊要求: 不上传toolchain文件夹
(2)执行步骤
# 1、环境准备# 安装Git(需要sudo权限)sudo apt update && sudo apt install git -y# 配置Git用户信息git config --global user.name "用户名"git config --global user.email "邮箱@example.com"# 2、本地仓库初始化cd /home/smore/ELappsgit init# 3、文件提交git add .git commit -m "Initial commit"# 4、远程仓库配置# 添加远程仓库(需要在git服务器上添加仓库)git remote add origin https://xxxxxxxxxxxxxx/elapps.git# 5、先拉取远程代码到本地(可选)git pull origin main# 6、代码推送# 推送到远程仓库(master分支推送到main分支)git push --set-upstream origin master:main
2、git变更仓库处理方式
(1)任务背景
- 环境: Windows 11
- 目标: 本地工程连接的是旧的git仓库,现在要更新到新的Git仓库
(2)执行步骤
# 1、检查当前状态cd /d D:electron_toolsgit statusgit remote -v# 2、添加新的远程仓库git remote add gitlab https://xxxxxxxxxxxxxxxxxx/electron_tools.git# 3、移除旧的远程仓库git remote remove origin# 4、重命名远程仓库(如果需要)git remote rename gitlab origin# 5、添加所有文件git add .# 6、提交更改git commit -m "同步所有文件到新的GitLab仓库"# 7、推送到新仓库git push origin master8、推送所有分支和标签git push --all origingit push --tags origin
3、git push报错
(1)fatal: The current branch master has no upstream branch.
问题发生
命令: git push
错误: fatal: The current branch master has no upstream branch.
含义: 本地 master分支没有设置要跟踪的远程分支
解决过程
诊断步骤
①. 检查分支结构
git branch -a
分析结果:
* master- 当前在本地master分支remotes/origin/master- 远程仓库已有master分支- 关键发现: 本地和远程都有
master分支,但没有建立关联
②. 检查远程仓库信息
git remote -v
确认: 远程仓库地址是 https://xxxxxxx/electron_tools.git
根本原因
虽然远程仓库存在 master分支,但 Git 不知道本地 master分支应该与远程的哪个分支关联。这种情况常见于:
- 克隆仓库后,跟踪关系可能被重置
- 分支是从其他分支切出,没有设置跟踪
- Git 配置中缺少上游分支信息
解决方案
①. 建立跟踪关系
git branch --set-upstream-to=origin/master master
作用: 明确告诉 Git:
- 本地
master分支 - 应该跟踪
- 远程仓库
origin的master分支
成功反馈: branch 'master' set up to track 'origin/master'.
②. 执行推送
git push
结果: 成功推送!
问题总结
| 步骤 | 命令 | 目的 | 结果 |
|---|---|---|---|
| 1 | git push |
尝试推送代码 | ❌ 失败:无上游分支 |
| 2 | git branch -a |
查看分支情况 | ✅ 发现远程有master分支 |
| 3 | git remote -v |
确认远程仓库 | ✅ 远程地址正确 |
| 4 | git branch --set-upstream-to=origin/master master |
建立分支关联 | ✅ 设置跟踪成功 |
| 5 | git push |
再次推送 | ✅ 推送成功 |
177