• 技术文章 >开发工具 >git

    深入分析Git基本工作原理

    长期闲置长期闲置2022-04-07 13:31:33转载1264
    本篇文章给大家带来了关于Git的相关知识,其中主要介绍了git的基本工作原理,入门级教程,通过玩转Git本地仓库,帮助新手快速入手Git,希望对大家有帮助。

    推荐学习:《Git学习教程

    一、分区及工作流程

    1. Git分区

    Git的分区包括工作区、暂存区、本地仓库(本地版本库)、远程仓库(远程版本库)。

    1. 工作区
      工作区(Workspace)即本地代码所在的目录,同时也是存放 .git/ (本地仓库)的目录。

    2. 暂存区
      暂存区(Index/Stage)是工作区和本地仓库的缓存空间,里面记录着即将提交给本地仓库(版本库)的文件修改信息,.git/ 目录里的index文件就是暂存区。

    3. 本地仓库
      本地仓库(Repository)也称本地库或版本库,存放了本地的所有版本(commit提交记录),本地仓库的文件都在 .git/ 目录中。

    4. 远程仓库
      远程仓库(Remote)在网络上,GitHub、Gitee和GitLab都能创建远程仓库,和本地仓库一样,远程仓库存放的也是不同的代码版本,只是这些版本可以来自多个本地仓库。

    2. 工作流程

    ------------------------------------------------------下图来源网络---------------------------------------------------------
    在这里插入图片描述

    上图生动地描述了Git不同分区之间的操作命令。

    二、本地仓库初始化

    1. git init

    本地仓库(版本库)需要使用 git init 命令来创建(也可以直接从远程仓库克隆,后面介绍)。
    进入工作区(代码存放目录),输入git init,git会在工作区新建一个.git/目录:
    在这里插入图片描述

    2. .git/目录简单介绍

    在这里插入图片描述
    在一个新建的.git/目录中,有3个文本文件:

    后面在对本地仓库进行操作时,还会产生其他文件,比如logs/——保存提交的记录,index——暂存区。

    【注意】 千万不要手动更改.git/里的文件,可能会破坏本地仓库的结构,造成不良后果。

    三、用户信息配置

    1. 用户名和邮箱配置介绍

    初始化本地仓库后的第一件事情就是给本地仓库添加用户配置信息,包括用户名和邮箱地址,这里的用户名和邮箱地址和托管平台(如gitee)的账户没有直接关系,它唯一的作用就是让别的用户或托管平台知道代码的上传者信息,邮箱乱填也不会导致不能上传代码。

    比如下面我用“张三”和“李四”上传了代码,邮箱地址不是真实存在的,同样可以上传成功:(commit信息出了点意外)
    在这里插入图片描述
    李四的邮箱地址显然不是真实的。
    在这里插入图片描述
    由于“张三”和“李四”的邮箱没有在gitee绑定账户,所以点击它们头像时,不会显示用户信息,如果用户配置里填写了gitee账号的提交邮箱,则可以在gitee上查看上传者账号信息。
    在这里插入图片描述
    gitee用户的提交邮箱,可以在gitee->个人主页->个人设置->邮箱管理中设置和查看:
    在这里插入图片描述

    2.使用git config配置用户信息

    讲了那么多用户名和邮箱的注意事项,其实用户信息配置十分简单:

    git config --global user.name "your name"git config --global user.email "your email"

    user.name 后接用户名,任意填写。
    user.email 后接用户邮箱,任意填写。
    –global 为配置全局属性
    在这里插入图片描述
    提交代码到本地仓库时,git会先检索本地仓库的.git/config文件,如果没有user的信息,则使用全局的配置文件(符合就近原则)。

    全局配置文件存放位置为 系统用户目录/用户名/.gitconfig,里面只有user属性。
    在这里插入图片描述

    不加–global时,仅设置本地仓库的用户配置,本地仓库用户配置信息存放位置:.git/config
    在这里插入图片描述
    上图我仅设置了本地配置的用户名,此时如果提交修改到本地仓库,提交记录(下图)中用户名使用本地配置,因为本地没有配置用户邮箱,所以邮箱依然使用全局配置中指定的邮箱。
    在这里插入图片描述

    四、管理暂存区文件

    配置完用户信息后,我们就可以开始考虑提交代码了,但是有时候,我们并不想把整个工作区的文件都提交到本地仓库(版本库)。暂存区(index/stage)的存在,替我们解决了这个困扰,我们可以先把代码文件添加到暂存区,如果觉得还需要改动,可以将文件从暂存区删除,直到我们觉得文件选择得差不多了,再进行下一步(提交到本地仓库)。

    1. Git文件状态

    在管理暂存区之前,我们还需要了解工作区文件的几种状态:

    ------------------------------------------------------下图来源网络---------------------------------------------------------
    在这里插入图片描述
    git status命令可以用来查看工作区文件当前的状态:

    #查看特定文件的状态
    git status [filename]#查看所有文件状态
    git status
    
    #精简的方式显示文件状态
    git status -s

    2. 添加文件到暂存区

    先查看工作区所有文件的状态,发现还没有任何文件:
    在这里插入图片描述

    现在创建3个文件,再次使用git status(-s表示精简显示),3个文件的状态为Untracked,??为精简显示下Untracked的标志,意思是新创的文件没有被本地仓库(版本库)跟踪。
    在这里插入图片描述
    git add [文件…] 可以添加一个或多个文件到暂存区,使文件状态变为Staged,A表示该文件被add到暂存区。
    在这里插入图片描述
    也可以使用 git add . 或 git add -A 将工作区所有文件添加到暂存库(除了.gitignore里声明的文件,本文暂不介绍)。
    在这里插入图片描述

    3. 删除暂存区的文件

    既然可以向暂存区添加文件,那么反向操作必然也不能少,git rm --cached [文件…] 命令可以将暂存区的文件移除,使其恢复到Untracked状态。
    在这里插入图片描述

    4. 文件修改管理

    如果已经存入暂存区,但在文件提交到本地仓库前,我们对其进行了修改,那么它的状态将变为Modified。
    在这里插入图片描述
    对于Modified状态的文件,我们可以使用git add将修改后的版本加入到暂存区,也可以使用git checkout -- [file...]将工作区的该文件恢复到暂存区的版本。

    git add a.c重新添加a.c到暂存区:
    在这里插入图片描述
    下图为使用git checkout -- a.c从暂存区恢复a.c文件,下图中我没有加 “ --”,它的作用是让checkout不检测任何其他选项参数,目的是防止该命令把a.c当做一个分支(checkout 还有一个作用是切换分支)。
    在这里插入图片描述
    对Modified状态下的文件使用 git diff 可以得出文件修改的详细记录,git diff和diff命令虽然作用都是对比文件,但git diff的作用是对比不同的状态下的同一文件,而diff用来对比两个不同的文件。
    在这里插入图片描述

    五、提交文件到本地仓库

    文件添加到暂存区的目的就是将其提交到本地仓库(版本库),提交命令为git commit -m “message”

    我们可以在commit 后面添加文件,这样能指定提交的文件:
    在这里插入图片描述
    通过git log 可以查看提交记录,HEAD为本地仓库当前分支,指向主分支master:
    在这里插入图片描述
    直接使用 git commit -m “message” 可以将整个暂存区都提交到本地仓库:

    在这里插入图片描述

    #以一行的形式显示所有提交版本:
    git log --pretty=oneline

    在这里插入图片描述

    #一行显示,只显示哈希值的前7位:
    git log --oneline

    在这里插入图片描述

    #显示历史提交版本与当前版本的间隔数:
    git reflog

    在这里插入图片描述

    六、推送到远程仓库

    代码文件提交到本地仓库后,还需要推送到远程仓库进行托管。

    1. 创建远程仓库

    我以码云为例,远程仓库的创建可以通过以下三步实现:
    在这里插入图片描述

    2. 添加远程仓库地址

    git remote add <name> <url> 命令可以添加远程仓库,name为远程仓库地址的别名,自定义,url为仓库网络地址。
    如果要用https的方式上传代码,需要添加远程仓库https地址;用ssh上传代码,则url填远程仓库ssh地址。

    先从码云仓库主页将仓库地址复制下来:
    在这里插入图片描述

    我将远程仓库的本地别名命名为origin:
    在这里插入图片描述
    远程仓库可以设置多个,只要本地别名不冲突即可。

    3. 查看远程仓库地址

    git remote -v 命令可以查看远程仓库地址,也可以通过git config -l查看
    在这里插入图片描述

    4. 删除远程仓库地址

    git remote remove <name> 可以删除本地别名为name的远程地址:
    在这里插入图片描述

    5. 推送到远程仓库

    首先确认远程仓库的别名,我当前设置的远程仓库https协议地址对应的别名为https,ssh协议地址对应的别名为ssh,这两个地址其实是一个仓库,只是协议不同。
    在这里插入图片描述

    https上传

    git push name可以实现本地仓库的上传,name为远程仓库在配置文件中的别名,使用https上传,需要输入账号和密码才能完成上传,Window系统会自动保存账号和密码,如果想修改Window已经保存的用户名和密码,可以参考修改Gitee登录凭据。
    有时第一次上传会出现不成功的情况,可以尝试使用git push -u name master,该命令的作用是将 name 仓库的主分支作为上流分支,-u和–set-upstream作用相同。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    ssh上传

    如果要使用ssh上传,需要先生成SSH密匙,并将公匙保存到gitee个人设置的SSH公匙设置中,具体过程可以参考:生成SSH密匙,实现代码上传
    有时第一次上传会出现不成功的情况,可以尝试使用git push -u name master,该命令的作用是将 name 仓库的主分支作为上流分支,-u和–set-upstream作用相同。
    在这里插入图片描述
    在这里插入图片描述

    七、从远程仓库clone、fetch或pull

    1. 克隆远程仓库到本地

    git的克隆可以将远程仓库拷贝到本地,同时自动进行本地仓库的初始化。
    在任意目录下打开Git bash,输入 git clone <repo> [<dir>],repo为远程仓库网址,dir为克隆仓库的存放路径(可以不用提前创建),如果不填,则默认为远程仓库名(不是本地别名)。
    [注意]:clone和push一样需要密码。
    在这里插入图片描述
    克隆成功,进入该仓库目录,和上传时的工作区一模一样,提交日志也相同。
    在这里插入图片描述

    2. 获取远程仓库(fetch)

    git fetch的作用是将远程仓库的分支拷贝到本地仓库,并把最新版本保存在FETCH_HEAD分支,获取远程仓库分支后,还需手动将其合并到当前分支。
    命令格式: git fetch [<repository>] ,repository为远程仓库的网络地址。
    git merge <分支名>用来合并分支
    在这里插入图片描述

    3. 拉取远程仓库(pull)

    git pull和git fetch类似,但git pull会自动将远程仓库的分支合并到本地的当前分支。
    在这里插入图片描述

    推荐学习:《Git视频教程

    以上就是深入分析Git基本工作原理的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:Git
    上一篇:实例详解git init和git clone获取git仓库 下一篇:git 诞生日你知道吗?
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• git学习之rebase实例详解• 案例加解析!带你总结Git常用操作命令• “程序员做饭指南”,GitHub热榜第一!• 完全掌握Git仓库的搭建以及分支管理• 实例详解Git的常见操作
    1/1

    PHP中文网