Git--使用教程
Git的框架讲解
Git 是一个分布式版本控制系统,其架构设计旨在高效地管理代码版本,支持分布式协作,并确保数据的完整性和安全性。
Git 的核心组件:
- 工作区(Working Directory): - 作区是你在本地计算机上实际操作的目录,包含了项目的所有文件。 - 工作区中,你可以编辑、删除或添加文件。
- 暂存区(Staging Area): - 存区是一个中间区域,用于暂时保存你对文件所做的修改,等待提交到本地仓库。 - 你使用
git add
命令时,修改的文件会被添加到暂存区。 - 本地仓库(Local Repository): - 地仓库是一个隐藏的
.git
目录,存储了项目的版本历史和配置信息。 - 本地仓库中,Git 会记录每次提交的快照,以及分支、标签等信息。 - 远程仓库(Remote Repository): - 程仓库是托管在服务器上的 Git 仓库,用于团队协作和代码共享。 - 见的远程仓库托管服务包括 GitHub、GitLab 和 Bitbucket 等。
Git 的工作流程:
- 克隆仓库: - 用
git clone
命令从远程仓库复制一份完整的项目到本地,包括所有的版本历史。 - 在工作区修改文件: - 本地工作区中编辑、添加或删除文件。
- 将修改添加到暂存区: - 用
git add
命令将修改的文件添加到暂存区,准备提交。 - 提交到本地仓库: - 用
git commit
命令将暂存区的修改提交到本地仓库,形成一个新的版本快照。 - 推送到远程仓库: - 用
git push
命令将本地仓库的提交推送到远程仓库,供团队成员共享。 - 拉取远程仓库的修改: - 用
git pull
命令从远程仓库拉取最新的修改,并与本地仓库合并。
Git 的数据存储结构:
- 对象(Objects):
- Git 使用对象来存储数据,主要包括:
- 提交对象(Commit): 录项目的历史版本信息。
- 树对象(Tree): 示目录结构。
- 文件对象(Blob): 示文件内容。
- 标签对象(Tag): 于标记特定的提交点。
- Git 使用对象来存储数据,主要包括:
- 有向无环图(DAG): - it 使用有向无环图来表示提交历史,每个提交对象指向其父提交对象,形成一个有向无环图结构。
- 分支(Branches): - 支是指向提交对象的指针,允许在不同的开发线中并行工作。 - 认的主分支通常命名为
master
或main
。
Git 的优势:
- 分布式架构:
- 每个开发者的本地仓库都是完整的版本库,支持离线工作和分布式协作。
- 高效的分支和合并:
- Git 的分支操作非常轻量级,创建和切换分支速度快,合并操作也非常高效。
- 数据完整性:
- Git 使用 SHA-1 哈希算法来标识对象,确保数据的完整性和一致性。
- 灵活的工作流:
- Git 支持多种工作流,如集中式工作流、功能分支工作流、GitFlow 工作流等,满足不同团队的需求。
过以上架构设计,Git 实现了高效、灵活且安全的版本控制,广泛应用于软件开发和协作中。
Git的使用
一、基础配置
1. 首次使用 Git 的配置
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global core.editor "vim" # 设置默认编辑器
git config --global credential.helper store #保存
git config --list # 查看所有配置
2. 生成 SSH 密钥(用于远程仓库认证)
ssh-keygen -t ed25519 -C "your_email@example.com" # 生成密钥
cat ~/.ssh/id_ed25519.pub # 复制公钥到 GitHub/GitLab
详情可以查看这篇博文:git --SSH配置(免秘钥登录)
二、本地仓库操作
本地仓库由工作区,暂存区,本地仓库三个部分组成
1. 创建仓库
git init # 初始化新仓库
git clone <url> # 克隆远程仓库(自动创建 origin 远程)
2. 文件状态管理
查看状态
git status # 查看工作区/暂存区状态
比较差异
git diff #1.查看更新的详细信息命令
#2.比较工作区和暂存区的差异
git diff HEAD #比较工作区和版本库之间的差异
git diff cached #比较暂存区和版本库之间的差异
git diff ID1 ID2 #比较两个特定版本之间的差异
git diff HEAD~3 HEAD file3.txt #查看指定文件的差异内容
添加文件到暂存区
git add <file> # 添加单个文件到暂存区
git add . # 添加所有修改到暂存区
删除文件
rm <file> #删除工作区文件
git add <file> #将删除后的工作区与暂存区同步
git rm <file> #删除暂存和工作区文件
git rm --cached <file> #将版本库中的文件删除
git reset <file> # 从暂存区移除文件(保留工作区修改)
git restore <file> # 丢弃工作区修改(Git 2.23+)
忽略文件 (对已经添加到版本库中的文件没用) .gitignore
(1)忽略某些文件类型
如果你想忽略某些特定类型的文件,比如编译生成的二进制文件或者日志文件,可以使用通配符 *
。
示例:
- 忽略所有
.log
文件:*.log
- 忽略所有
.class
文件(Java 编译生成的文件):*.class
- 忽略所有
.o
和.a
文件(C/C++ 编译生成的文件):*.o *.a
(2) 忽略目录
你可以通过指定目录名来忽略整个目录。
示例:
-
忽略
build/
目录(常见于构建后的产物):build/
-
忽略
dist/
目录(通常用于存放打包后的文件):dist/
(3) 忽略特定文件
你可以通过指定文件的相对路径来忽略特定的文件。
示例:
-
忽略
secret.txt
文件:secret.txt
-
忽略
config/config.json
文件:config/config.json
(4) 忽略 IDE 和编辑器配置文件
很多 IDE 和编辑器(如 VSCode、IntelliJ、Sublime Text)会生成一些配置文件,这些文件通常不需要提交到 Git 仓库中。
示例:
- 忽略 VSCode 配置文件:
.vscode/
3. 提交更改到版本库
git commit -m "提交描述" # 提交暂存区内容
git commit -am "提交描述" # 自动添加修改文件并提交(不包含新文件)
git commit --amend # 修改最近一次提交(可修改描述或追加文件)
三、分支管理
1. 基础分支操作
git branch # 查看本地分支
git branch <分支名> # 创建新分支
git switch <分支名> #切换分支
git checkout <分支名> # 切换分支,恢复文件(可能存在歧义)
git checkout -b <分支名> # 创建并切换分支(常用)
git branch -d <分支名> # 删除已合并的分支
git branch -D <分支名> # 强制删除未合并分支
2. 合并与冲突解决
git merge <分支名> # 合并指定分支到当前分支
git merge --abort # 终止合并(冲突时)
git rebase <分支名> # 变基操作(线性历史)
git rebase --abort # 终止变基
解决合并冲突流程:
- 用编辑器打开冲突文件(搜索
<<<<<<<
) - 手动修改保留需要的代码
- 删除冲突标记
- 执行
git add <冲突文件>
- 完成合并:
git commit
四、远程仓库操作
1. 关联远程仓库
git remote add origin <url> # 添加远程仓库(命名为 origin)
git remote -v # 查看远程仓库地址
git remote remove origin # 删除远程仓库
2. 推送与拉取
git push -u origin main # 首次推送并设置上游分支
git push # 后续推送(自动关联上游分支)
git pull # 拉取并合并(= git fetch + git merge)
git fetch # 仅获取远程更新(不自动合并)
3. 远程分支管理
git push origin --delete <分支名> # 删除远程分支
git checkout -b <本地分支> origin/<远程分支> # 基于远程分支创建本地分支
五、撤销与历史修改
1. 撤销工作区修改
git checkout HEAD -- <file> # 用最新提交覆盖工作区文件
git restore --staged <file> # 取消暂存(Git 2.23+)
2. 重置提交历史
git reset --soft HEAD~1 # 撤销提交但保留修改在暂存区
git reset --mixed HEAD~1 # 撤销提交并取消暂存(默认)
git reset --hard HEAD~1 # 彻底丢弃最近一次提交的所有修改
3. 回滚提交
git revert <commit-hash> # 创建反向提交来撤销指定提交
六、标签管理
git tag # 查看所有标签
git tag v1.0.0 # 创建轻量标签
git tag -a v1.0.0 -m "描述" # 创建附注标签
git push origin --tags # 推送所有标签到远程
git checkout v1.0.0 # 切换到标签版本
七、高级功能
1. 储藏(Stash)临时修改
git stash # 储藏当前工作区修改
git stash list # 查看储藏列表
git stash apply # 恢复最新储藏(保留储藏记录)
git stash pop # 恢复并删除最新储藏
git stash drop stash@{0} # 删除指定储藏
2. 查看历史
git log --oneline # 简洁历史记录
git log -p # 显示具体修改内容
git log --graph # 图形化分支历史
git blame <file> # 查看文件每行修改者
3. 子模块(Submodule)
git submodule add <url> <path> # 添加子模块
git submodule update --init # 初始化子模块
八、常用工作流示例
1. 日常开发流程
git checkout -b feature/new-login # 创建特性分支
# 修改代码...
git add .
git commit -m "实现登录功能"
git push origin feature/new-login
# 在 Git 平台创建 Pull Request
2. 紧急修复线上 Bug
git checkout main
git pull
git checkout -b hotfix/header-bug
# 修复代码...
git commit -m "修复页头布局问题"
git checkout main
git merge hotfix/header-bug
git push
注意事项
- 慎用
--force
:强制推送可能覆盖他人工作 - 重要操作前备份:复杂操作前先
git stash
或创建临时分支 - 保持提交原子性:每个提交只做一件事,描述清晰
- 定期清理分支:删除已合并的废弃分支
遇到问题时,多用 git status
查看状态,善用 git reflog
找回误删内容。
我误以为命运掌握在别人手里,而没有意识到我可以为自己的人生执笔。 —塞巴斯蒂安·巴里