如果你只是想知道如何用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的分区包括工作区、暂存区、本地仓库(本地版本库)、远程仓库(远程版本库)。

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

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

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

  4. 远程仓库
    远程仓库(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)相关推荐

  1. 本地仓库的基本操作与概念——Git的学习与使用(三)

    本部分内容将会对基本库的使用,相关基础概念进行介绍,通过本部分的总结可以对于本地库进行管理,更好的理解Git的使用. 现在我们的机器上有了一个 真实项目 的 Git 仓库,并从这个仓库中检出了所有文件 ...

  2. TI CC1101学习笔记:工作原理简单入门

    众所周知,在IOT的市场应用中,从通信协议细分的话,有SUB-1G,2.4G,3G, 4G,以及最新推出的5G,虽然5G通信协议已经在崭露头角,但是不同的通信协议在不同的应用领域之中还是占据着一定的重 ...

  3. Git 详细教程之一: Git 简介及其基本工作原理

       Git 是一个免费的.开源的『分布式版本控制系统』,可以快速高效地处理从小型到大型的各种项目.官网为:https://git-scm.com/.它具有廉价的本地库,方便的暂存区域和多个工作流分支 ...

  4. git上传分支的原理_GIT分支,创建分支与合并分支的工作原理与教程

    开发一个版本,采用的发布流程: (1).从master的最新代码拉取一个开发分支,在上面进行开发 (2).在开发分支上不断地进行提交版本,期间,master也会有因为其他版本上线而不停有版本合并 (3 ...

  5. Git学习小记之分支原理

    介绍 如果想要熟练使用 Git,没有分支理念是绝对行不通的,在用 Git 管理项目的时候,经常需要使用 commit 这个命令,那么这个 commit 到底是指什么呢? 按照官方的解释,这应该成为一个 ...

  6. 什么是深度学习?其工作原理是什么?

    什么是深度学习? 简单来说,深度学习就是样本研究. 从最基本的概念上看,深度学习就是机器学习的一种方法,教计算机筛选输入的信息,进而对信息进行预测和分类.其观察结果可以通过图片.文字或声音的方式呈现. ...

  7. php授权系统原理,Mysql权限系统工作原理-PHP教程,PHP基础

    权限系统工作原理 mysql权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个mysql服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来 ...

  8. mysql权限系统的工作原理_Mysql权限系统工作原理_PHP教程

    权限系统工作原理 MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来 ...

  9. Servlet学习笔记-Servlet工作原理和过程

    1.前言   Java Servlet技术简称Servlet技术,是Java开发Web应用的底层技术.由Sun公司于1996年发布,用来代替CGI--当时生成Web动态内容的主流技术.官方文档对Ser ...

最新文章

  1. java 排序算法 讲解_java实现排序算法之冒泡排序法详细讲解
  2. 分享10个我最满意的windows工具,极大提升工作效率
  3. VS2017报错头文件unistd.h
  4. 机器学习实战 | SKLearn最全应用指南
  5. C# CSV文件读取(带换行单元格中内容处理)
  6. sql unicode转中文_SELECT语句《SQL必知必会》
  7. 单价数量和总价的公式_人教版四年级数学上册单价、数量和总价之间的关系微课...
  8. jQuery链式操作[转]
  9. IC设计常用文件及格式介绍
  10. leetcode371
  11. spring security 实现微信登录
  12. 史上最全论文下载方法
  13. 形式语言与自动机理论蒋宗礼 第五章答案
  14. Selenium获取动态图片验证码
  15. 网关是什么?工业网关是什么?
  16. 每日案例(第五期):智慧金融11-12 | 知识图谱实践案例集(速读版)
  17. golang-文章翻译-go常见的10种错误
  18. jq获取span标签的赋值和取值
  19. Spring Cloud之Hystrix服务容错
  20. 七种方法教你如何获取以太坊测试网Token

热门文章

  1. 国产等离子体仿真软件EasyPSim-PIC3D
  2. java线程通信总结
  3. 视觉算法具体是做什么,视觉神经算法有哪些
  4. java扑克游戏_Java扑克游戏(多人多牌数比较游戏)的实现
  5. Web Api:基于RESTful标准
  6. 为什么3A信用评级证书与投标工作息息相关呢?
  7. 常见AU AAX VST3音乐音频处理插件安装目录
  8. Android简单音乐盒,添加音乐播放的 上一首 和 下一首 控制
  9. 鸿博信通云交换机(云PBX)
  10. SQL调优指南笔记8:Optimizer Access Paths