Git的基本原理和常用命令
前言
Git的基本原理和常用命令。
概念
Git是分布式版本控制系统:
- 分布式:每台计算机都有完整的版本仓库,可无需联网工作,可无需服务端支持
- 版本控制:版本管理(旧版本和新版本),分支管理(其他分支和当前分支)
- 系统:软件
基本原理
系统区域
- 用户文件夹:普通的文件夹
- 工作区(Workspace):用户文件夹中,除.git文件夹外的其他文件
- 版本库:用户文件夹中的.git文件夹
- 暂存区(Stage/Index):.git文件夹中的index文件
- 本地仓库(Repository):.git文件夹中,除index文件外的其他文件
- 远程仓库(Remote):不在本地的文件(一般存储在代码托管平台:如Github或Gitee)
文件的系统区域流
工作区->暂存区->本地仓库->远程仓库:
- git add:工作区->暂存区
- git commit:暂存区->本地仓库
- git push:本地仓库->远程仓库
远程仓库->本地仓库->暂存区->工作区:
- git clone:远程仓库->用户文件夹
- git pull:远程仓库->工作区
- git fetch:远程仓库->本地仓库
- git merge:本地仓库->工作区
git pull = git fetch + git merge
- git reset:本地仓库->暂存区
- git restore:暂存区->工作区
工作区的文件状态
- 未跟踪(Untracked):未上传过暂存区的文件,不参与版本控制
- 未修改(Unmodified):上传过暂存区的文件,参与版本控制,和本地仓库的版本相同
- 已修改(Modified):上传过暂存区的文件,参与版本控制,和本地仓库的版本不同
- 已暂存(Staged ),暂存区中的文件
文件的工作区状态流
- git add:未跟踪->已暂存
- git rm:已暂存->未跟踪
- 修改文件:未修改->已修改
- git checkout:已修改->未修改
- git add:已修改->已暂存
映射关系
- 本地用户名和邮箱——远程用户名和邮箱
- 本地仓库——远程仓库
- 本地分支——远程分支
映射关系的建立
本地用户名和邮箱——远程用户名和邮箱:
- 在代码托管平台绑定邮箱
- git config
本地仓库——远程仓库:
- git remote
- git clone
本地分支——远程分支:
- git pull = git fetch + git merge
- git push
特殊文件
- HEAD:指针,在本地指向:HEAD->当前分支->当前分支最近提交的版本
- index:暂存区
工作流程
用户配置流程
- 在代码托管平台绑定邮箱
- git config –list
- git config –global user.name <用户名>
- git config –global user.email <邮箱>
作用:记录用户操作信息
本地用户名和邮箱——远程用户名和邮箱的映射无严格关系:
未在代码托管平台绑定邮箱,有本地配置,可操作,不显示代码托管平台的账号信息
在代码托管平台绑定邮箱,有本地配置,可操作,显示代码托管平台的账号信息
初始化(下载和安装)Git后,需进行用户配置流程
再使用Git时,一般无需进行用户配置流程
初始化并使用流程
- 创建并初始化远程仓库
- 创建用户文件夹
- git init
- git remote add <本地对远程仓库的别名:一般为origin> <远程仓库的地址>
- git pull <本地对远程仓库的别名:一般为origin> <远程分支名>:<本地分支名>
- 基本上传流程,回退操作,分支开发流程,分支合并流程
克隆并使用流程
- 创建并初始化远程仓库
- git clone <远程仓库的地址>
- 基本上传流程,回退操作,分支开发流程,分支合并流程
基本上传流程
- 创建或修改文件
- git add .(注意有“.”)
- git commit -m <说明>
- git push <远程主机名> <本地分支名>:<远程分支名>
回退操作
- git reset –soft <版本号>(使用git log查看版本号)
- git checkout – <文件名>
- git rm –cached <文件名>
提示:
- 单人开发:本地仓库版本在远程仓库版本的上游,无法拉取远程仓库版本。在远程仓库的版本必在本地仓库,若需要远程仓库版本,获取本地仓库版本即可
- 多人开发:是更新而不是回退操作,进行分支开发流程,分支合并流程
分支开发流程
- 在代码托管平台创建其他分支或已有其他分支
- git branch <分支名>
- git switch <分支名>
- git pull <本地对远程仓库的别名:一般为origin> <远程分支名>:<本地分支名>
- 基本上传流程
分支合并流程
- 被合并分支进行基本上传流程
- 合并分支进行基本上传流程
- git switch <合并分支名>
- git merge <被合并分支名>
- 打开文件,查看冲突内容
- 修改文件,解决冲突内容
- 基本上传流程
- git branch -d <被合并分支名>
理解:
- 假设:合并分支为master,被合并分支为feature
- 原先:HEAD->master->最近提交点A
- git branch feature:feature->A
- git switch feature:HEAD->feature->A
情况一:
- 修改feature的文件
- 若feature提交:HEAD->feature->最近提交点B
- git merge feature:HEAD->master->最近提交点B,master的文件更新为feature的文件
- 因为A->B,B是A的上游,A更新为B,不会发生冲突
情况二:
- 修改feature的文件
- 若feature提交:HEAD->feature->最近提交点B
- 修改master的文件
- 若master提交:HEAD->master->最近提交点C
- git merge feature:HEAD->master->最近提交点D,feature->最近提交点D
- 因为A->B和A->C互不相交,可能发生冲突。合并后为D,有A->B->D和A->C->D
常用命令
用户配置流程
- git config –list:查看配置信息
- git config –global user.name <用户名>:配置全局用户名
- git config –global user.email <邮箱>:配置全局邮箱
- git config user.name <用户名>:配置当前用户名
- git config user.email <邮箱>:配置当前邮箱
初始化并使用流程
- git init:用户文件夹->工作区+版本库
- git remote add <本地对远程仓库的别名:一般为origin> <远程仓库的地址>:本地仓库——远程仓库
- git remote rm <本地对远程仓库的别名:一般为origin>:删除本地仓库——远程仓库映射
- git pull <本地对远程仓库的别名:一般为origin> <远程分支名>:<本地分支名>:远程仓库的远程分支->本地仓库的本地分支
克隆并使用流程
- git clone <远程仓库的地址>:远程仓库->用户文件夹
- git clone <远程仓库的地址> <用户文件夹名>:远程仓库->用户文件夹,指定用户文件夹名
基本上传流程
- git add .(注意有“.”):工作区->暂存区
- git commit -m <说明>:暂存区->本地仓库
- git push <远程主机名> <本地分支名>:<远程分支名>:本地仓库的本地分支->远程仓库的远程分支
回退操作
- git reset –soft <版本号>(使用git log查看版本号):本地仓库->暂存区
- git checkout – <文件名>:暂存区->工作区
- git rm –cached <文件名>:已暂存->未跟踪
分支开发流程
- git branch:查看分支
- git branch <分支名>:创建分支
- git switch <分支名>:切换分支
- ls:查看当前分支的工作区文件
分支合并流程
- git merge <被合并分支名>:当前分支合并指定分支
- git branch -d <被合并分支名>:删除分支
其他
- git status:查看状态
- git status -s:查看精简的状态
- git diff:比较工作区和暂存区文件的不同
- git log:查看日志
- git blame <文件名>:查看文件的日志
- git tag:设置标签
总结
Git的基本原理和常用命令。
参考资料
- Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)——教程
- Git 教程 | 菜鸟教程 (runoob.com)——教程
- Git:工作原理(核心)_LXX_YYT的博客-CSDN博客_git工作原理——系统区域图,文件的系统区域流图
- 深入分析Git基本工作原理-git-PHP中文网——教程
- Git之深入解析reset命令原理以及与checkout命令的区别_╰つ栺尖篴夢ゞ的博客-CSDN博客_git reset原理——reset命令的原理
- Git原理及使用 - 知乎 (zhihu.com)——详尽原理
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 夜悊的技术小宅!