Git学习——Git基本工作原理(入门级教程,通过玩转Git本地仓库,帮助新手快速入手Git)
如果你只是想知道如何用Git上传代码至托管平台,请看:创建码云仓库并完成第一次上传(https) 及 使用ssh协议上传代码
如果你想了解Git本地仓库的工作原理,欢迎阅读本文。
文章目录
- 一、分区及工作流程
- 1. Git分区
- 2. 工作流程
- 二、本地仓库初始化
- 1. git init
- 2. .git/目录简单介绍
- 三、用户信息配置
- 1. 用户名和邮箱配置介绍
- 2.使用git config配置用户信息
- 四、管理暂存区文件
- 1. Git文件状态
- 2. 添加文件到暂存区
- 3. 删除暂存区的文件
- 4. 文件修改管理
- 五、提交文件到本地仓库
- 六、推送到远程仓库
- 1. 创建远程仓库
- 2. 添加远程仓库地址
- 3. 查看远程仓库地址
- 4. 删除远程仓库地址
- 5. 推送到远程仓库
- https上传
- ssh上传
- 七、从远程仓库clone、fetch或pull
- 1. 克隆远程仓库到本地
- 2. 获取远程仓库(fetch)
- 3. 拉取远程仓库(pull)
一、分区及工作流程
1. Git分区
Git的分区包括工作区、暂存区、本地仓库(本地版本库)、远程仓库(远程版本库)。
工作区
工作区(Workspace)即本地代码所在的目录,同时也是存放 .git/ (本地仓库)的目录。暂存区
暂存区(Index/Stage)是工作区和本地仓库的缓存空间,里面记录着即将提交给本地仓库(版本库)的文件修改信息,.git/ 目录里的index文件就是暂存区。本地仓库
本地仓库(Repository)也称本地库或版本库,存放了本地的所有版本(commit提交记录),本地仓库的文件都在 .git/ 目录中。远程仓库
远程仓库(Remote)在网络上,GitHub、Gitee和GitLab都能创建远程仓库,和本地仓库一样,远程仓库存放的也是不同的代码版本,只是这些版本可以来自多个本地仓库。
2. 工作流程
------------------------------------------------------下图来源网络---------------------------------------------------------
上图生动地描述了Git不同分区之间的操作命令。
- 假如要实现上传代码功能,工作区使用add添加文件到暂存区,暂存区再通过commit提交版本给本地仓库,最后本地仓库使用push将版本推送到远程仓库;
- 工作区修改的文件可以通过checkout命令从本地仓库或暂存区恢复;如果要将工作区某分支的代码更新为远程仓库最新版本,可以使用pull命令;
- 对远程仓库使用clone可以将远程仓库主分支拷贝到本地仓库,fetch命令与pull类似,只是pull会合并本地代码,而fetch只会把最新版本抓取到本地版本库,不考虑本地仓库是否有新增。
二、本地仓库初始化
1. git init
本地仓库(版本库)需要使用 git init 命令来创建(也可以直接从远程仓库克隆,后面介绍)。
进入工作区(代码存放目录),输入git init,git会在工作区新建一个.git/目录:
2. .git/目录简单介绍
在一个新建的.git/目录中,有3个文本文件:
- config存放了本地仓库的配置信息;
- description用来描述仓库的名字;
- HEAD为本地仓库当前分支,默认为master,指向了refs/heads/master,可见refs/目录主要存放一些分支信息;
后面在对本地仓库进行操作时,还会产生其他文件,比如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文件状态
在管理暂存区之前,我们还需要了解工作区文件的几种状态:
- Untracked 未跟踪,工作区中没有加入过暂存区的文件,不参与版本控制;
- Unmodified 未修改,加入版本控制,但和版本库中文件快照相同;
- Modified 已修改,加入版本控制,而且和上次加入版本库时的快照不同;
- Staged 已暂存,下一步可以提交到本地仓库(版本库)。
------------------------------------------------------下图来源网络---------------------------------------------------------
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学习——Git基本工作原理(入门级教程,通过玩转Git本地仓库,帮助新手快速入手Git)相关推荐
- 本地仓库的基本操作与概念——Git的学习与使用(三)
本部分内容将会对基本库的使用,相关基础概念进行介绍,通过本部分的总结可以对于本地库进行管理,更好的理解Git的使用. 现在我们的机器上有了一个 真实项目 的 Git 仓库,并从这个仓库中检出了所有文件 ...
- TI CC1101学习笔记:工作原理简单入门
众所周知,在IOT的市场应用中,从通信协议细分的话,有SUB-1G,2.4G,3G, 4G,以及最新推出的5G,虽然5G通信协议已经在崭露头角,但是不同的通信协议在不同的应用领域之中还是占据着一定的重 ...
- Git 详细教程之一: Git 简介及其基本工作原理
Git 是一个免费的.开源的『分布式版本控制系统』,可以快速高效地处理从小型到大型的各种项目.官网为:https://git-scm.com/.它具有廉价的本地库,方便的暂存区域和多个工作流分支 ...
- git上传分支的原理_GIT分支,创建分支与合并分支的工作原理与教程
开发一个版本,采用的发布流程: (1).从master的最新代码拉取一个开发分支,在上面进行开发 (2).在开发分支上不断地进行提交版本,期间,master也会有因为其他版本上线而不停有版本合并 (3 ...
- Git学习小记之分支原理
介绍 如果想要熟练使用 Git,没有分支理念是绝对行不通的,在用 Git 管理项目的时候,经常需要使用 commit 这个命令,那么这个 commit 到底是指什么呢? 按照官方的解释,这应该成为一个 ...
- 什么是深度学习?其工作原理是什么?
什么是深度学习? 简单来说,深度学习就是样本研究. 从最基本的概念上看,深度学习就是机器学习的一种方法,教计算机筛选输入的信息,进而对信息进行预测和分类.其观察结果可以通过图片.文字或声音的方式呈现. ...
- php授权系统原理,Mysql权限系统工作原理-PHP教程,PHP基础
权限系统工作原理 mysql权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个mysql服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来 ...
- mysql权限系统的工作原理_Mysql权限系统工作原理_PHP教程
权限系统工作原理 MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来 ...
- Servlet学习笔记-Servlet工作原理和过程
1.前言 Java Servlet技术简称Servlet技术,是Java开发Web应用的底层技术.由Sun公司于1996年发布,用来代替CGI--当时生成Web动态内容的主流技术.官方文档对Ser ...
最新文章
- java 排序算法 讲解_java实现排序算法之冒泡排序法详细讲解
- 分享10个我最满意的windows工具,极大提升工作效率
- VS2017报错头文件unistd.h
- 机器学习实战 | SKLearn最全应用指南
- C# CSV文件读取(带换行单元格中内容处理)
- sql unicode转中文_SELECT语句《SQL必知必会》
- 单价数量和总价的公式_人教版四年级数学上册单价、数量和总价之间的关系微课...
- jQuery链式操作[转]
- IC设计常用文件及格式介绍
- leetcode371
- spring security 实现微信登录
- 史上最全论文下载方法
- 形式语言与自动机理论蒋宗礼 第五章答案
- Selenium获取动态图片验证码
- 网关是什么?工业网关是什么?
- 每日案例(第五期):智慧金融11-12 | 知识图谱实践案例集(速读版)
- golang-文章翻译-go常见的10种错误
- jq获取span标签的赋值和取值
- Spring Cloud之Hystrix服务容错
- 七种方法教你如何获取以太坊测试网Token