Git 详解(原理、使用)

1. 什么是 Git

Git 是目前最主流的一个版本控制器,并且是分布式版本控制系统,可以控制电脑上所有格式的文档

版本控制器:记录每次修改以及版本迭代的管理系统

  • 对于文本文件,可以记录每次对这个文件的内容进行了怎样的修改

  • 对于二进制文件,具体内容进行了怎样的修改,他没法管理,但可以知道文件大小等方面的变化

2. 安装

常用命令

  • 查看当前安装的 git 版本
git --version
  • Cent OS 安装
yum install git -y
  • Ubuntu 安装
apt-get install git -y
  • windows 安装

    下载安装包直接安装即可,在这里下载

    安装过程中除了安装路径需要修改之外,其他都用默认的即可

要用 Git 来管理文件,必须将文件放在 Git 仓库中,只有仓库中的文件才会被 Git 管理

3. 创建本地仓库

  1. 创建一个目录(工作区)
mkdir mystore
  1. 进入这个目录
cd mystore
  1. 创建 git 本地仓库
git init

此命令执行成功之后会在当前目录中生成一个 .git 隐藏目录(版本库),用来追踪管理仓库,注意不要手动修改这个目录中的文件

  1. 配置本地仓库的 name 和 email

    全局配置的添加和删除需要加上 --global

git config user.name "ly"
git config user.email "361@163.com"
  • 查看刚才的配置

    git config -l
    
  • 删除某一项配置

    git config --unset user.name
    

4. 使用 Git 管理

请添加图片描述

工作区:并未被 Git 管理

暂存区(stage,/index):暂时存放工作区中修改的内容(git 对象的索引)

objects 对象库:修改的工作区内容会写入对象库中一个新的 git 对象中,通过对这些 git 对象的管理维护便可实现对文件的版本管理,故每次 Add 操作都会在版本库中新增一个 git 对象

HEAD:指针,指向某个分支,如 master 分支,存储的也是 git 对象的索引

如果只是单纯将文件置于 mystore 目录下(工作区),Git 是不会进行管理的,需要进行 Add 以及 Commit 操作将要管理的内容置于版本库中之后才会被 Git 管理

4.1 将工作区中的文件使用 Git 进行管理
4.1.1 Add

将工作区中所有的修改内容添加到版本库的暂存区中

git add .
git add 指定某个要添加的修改文件,多个文件用空格分隔

. 表示所有修改的内容

4.1.2 Commit

将暂存区中的目录树写入 HEAD 指向的相应分支下,即将暂存区中的内容提交到相应分支下

经过 commit 操作之后才算真正意义上写入到了版本库

git commit -m "这里对本次提交的内容进行描述,如:普通用户提交个人信息功能完成"

每次提交都会有一个 commit id,可以在 git 中看到

  • 查看提交记录(时间从近到远)
git log
git log --pretty=oneline  # 每次提交打印一行

refs/head/master 中存放的是最近一次提交的 commit id

commit id:是一个索引,指向一个 git 对象,前两位表示 objects 中的目录名,之后的内容表示目录名中的文件名

查看 objects 中某个文件:git cat-file -p commit-id

注意:Git 管理的不是文件,而是文件的修改

  • 查看仓库状态

    查看从上次提交到现在是否对文件进行过修改,暂存区是否还有修改未提交,工作区是否还有修改未添加到暂存区。但不能看到对文件进行了怎样的修改

    git status
    
  • 查看暂存区和工作区差异

    git diff 文件名
    
  • 查看版本库和工作区的差异

    git diff HEAD -- 文件名
    
  • 查看某次提交的代码修改

    git show commitid
    
4.2 版本回退

本质回退的是版本库中的内容

git reset [--soft | --mixed | --hard] [HEAD]
  • –soft:只回退版本库中的内容
  • –mixed(默认选项):版本库和暂存区中的内容都进行回退
  • –hard:工作区、暂存区、版本库中的内容都进行回退

版本库中维护了多个 git 对象,版本回退本质上是将 HEAD -> master 的指向进行了改变,原本指向最近一次修改的 git 对象,回退到上一个提交,就只需要将 master 指向前一个 提交的 git 对象即可

  • 查看本地的每次执行的命令及 commit id

    git reflog
    
4.3 撤销修改

对工作区中的文件进行修改之后想要撤销,将工作区的修改回退到最近一次 add 或 commit 之后的状态

git checkout -- 文件名

分别处于一下状态时,如何回退

工作区暂存区版本库操作
git checkout – filename
1. git reset --hard HEAD^
2. git reset --mixed HEAD; git checkout – filename
git reset --hard HEAD^(前提是代码未进行 push)
  • 删除文件

    git rm filename
    

    会直接在工作区和暂存区中都删除掉,只需要再执行 commit 即可删除

4.4 和远程仓库建立关联
git remote add origin 远程仓库链接

5. 分支管理

5.1 为什么要分支

以软件开发为例,通常情况下一个产品最少有一个生产环境和开发环境,通常在开发环境中经过测试没有问题后将程序部署到生产环境,而不会直接在生产环境乱搞,因为一旦生产环境出现问题,将会造成严重损失。

我们可以通过分支,将 master 分支(稳定代码)作为生产环境的代码,在 dev 分支进行新功能的开发,经过测试没有问题之后再合并到 master 分支,这样对 master 分支代码的影响就会降低

当然,也可以通过分支来更好的进行协同开发,以 master 作为主分支,多人协同开发时,每个人都在自己的分支上进行开发,测试没有问题之后再合并到 master 分支上

请添加图片描述

5.2 分支管理
  • 查看当前仓库有哪些分支

    git branch
    

    HEAD 指向的分支就是工作分支,工作分支名字前面有 * 标记

  • 创建分支

    git branch 分支名
    

    成功创建分支之后,当前分支也指向最近一次提交的 git 对象

  • 切换工作分支

    git checkout 分支名
    

    git checkout -b 新分支名 可同时实现创建新分支和切换到新分支的操作

  • 合并分支

    在 master 分支中合并 abc 分支

    git merge abc
    

    当合并分支有冲突时,需要手动解决冲突,并再次提交(Add,Commit)(no fast-forward)

    • no ff:可以在提交分支中明显看到合并操作

    • ff:不能区分出来是 maser 提交的还是分支合并的

      可以使用 git merge --no-ff -m "合并分支" 分支名 来实现,这样在分支图中就可以清楚的辨别

  • 删除分支

    git branch -d abc
    

    若在分支未被合并之前就要删除分支,则这里的 d 需要改为大写,表示强行删除

  • 可视化分支及提交记录

    git log --graph --abbrev-commit
    
5.3 bug 分支

当 master 分支出现 bug 时,不能直接在 master 分支上进行修改,因为有可能会由于此次修改而引入其他 bug

如果在 dev 分支上开发的过程中,发现 master 分支存在 bug,一般不会直接在 dev 分支上进行 bug 修复,而是基于 master 分支新建分支来专门处理这个 bug

  1. 在 dev 分支上的已被 git 管理而未进行 add 的修改内容,可以通过 git stash 来将工作区中的内容进行存储,否则切换到 master 分支中,也能看到在 dev 分支中对工作区中内容的修改。
  2. 基于 master 分支创建新分支进行 bug 修复,并将其合并到 master 分支,删除这个用于修复 bug 的分支
  3. 切换到 dev 分支,将存储区中的内容恢复 git stash pop,继续进行开发,然后提交
  4. 将 dev 分支合并 master 分支并测试,这样即使合并有冲突,也不会影响 master 分支的代码,若合并之后有冲突,在 dev 分支上进行修改测试,解决问题之后再提交,然后合并到 master 上,就不用再 master 分支上再解决冲突了

6. 本地仓库与远程仓库的交互

6.1 克隆
  • 克隆远程仓库到本地

    git clone 远程仓库链接
    
    1. HTTP 方式

      直接克隆

    2. SSH 方式

      SSH 是对称加密,需要将本地的公钥配置到 git 服务器上

      首先在用户主目录查看是否有 .ssh 目录,若有,进入查看是否有 id_rsaid_rsa.pub 这两个文件,若有,则直接将 id_rsa.pub 中的内容在 git 服务器上进行配置,即可通过 SSH 方式克隆仓库。若没有这两个文件,则执行以下命令生成 SSH 密钥文件,然后在 git 服务器上配置。配置完成后即可进行克隆

      ssh-keygen -t rsa -C "邮箱地址"
      
  • 查看远程仓库

    git remote
    git remote -v
    
6.2 推送

将本地的修改推送到远程仓库

git push origin 本地分支:远程分支

push 操作是远程分支和本地分支之间的交互,要让两个分支建立链接,才能推送成功。克隆时,git 会自动对 master 分支建立链接

6.3 拉取

远程仓库的代码可能被其他用户修改了,需要将远程仓库代码拉取到本地

git pull origin 远程分支:本地分支

这里本质上是两个操作,1. 拉取;2. 合并

  • 拉取分支内的内容,需要建立连接,或者指定分支

  • 拉取仓库内容,无需建立连接或指定分支

6.4 .gitignore 文件

有的文件不需要被 git 追踪管理,可以将其添加到 .gitignore 文件中(存在于工作区根目录),在进行 add、commit、push 等操作时,就会忽略这些文件。

# 忽略 .idea 文件以及以 .out 结尾的文件
.idea
*.out

# 不忽略 today.out 文件
!today.out
  • 如果有的文件添加到了 .gitignore 中,又想上传上去,则可使用以下命令强制上传

    git add -f 文件名
    

.ignore 文件特别多,有的时候上传文件,被忽略,已经不知道哪一项配置导致的,可以使用 git check-ignore -v 文件名 来得知

给命令配置别名

git config --global alias.con config

7. 标签管理

通过标签,来对某个 commit id 进行标记,相当于 commit id 的别名,可以通过标签来标记重要的版本以及对 commit id 的语义化

.git 目录中管理了 tags

  • 为最近一次提交打标签

    git tag 标签名
    
  • 查看所有标签

    git tag
    
  • 为之前的某次提交打标签

    git tag 标签名 commitid
    
  • 打标签带上描述信息

    git tag -a 标签名 -m "描述信息" commitid
    
  • 查看某个标签

    git show 标签名
    
  • 删除标签

    git tag -d 标签名
    

    要删除远程仓库的标签,需要在本地删除之后,进行 push

    git push origin :标签名
    
  • 推送本地标签到远程仓库

    git push origin 标签名
    
  • 推送所有标签

    git push origin --tags
    

8. 其他

  • 创建本地分支并和远程分支建立链接

    git checkout -b 分支名 origin/分支名
    
    git branch –-set-upstream-to=远程仓库名/远程分支名 本地分支名
    
  • 查看链接

    git branch -vv
    
8.1 同一分支上多人协作开发
  1. 开发完毕后进行 push
  2. 若有冲突,无法 push,则先进行 pull
  3. 本地解决冲突,重新提交并 push
  4. 合并分支,删除开发分支
8.2 多人多分支协作

让某个功能私有某一个分支

8.3 合并分支

分支的合并可以在本地进行也可以在远程仓库进行(PR)

PR:开发人员在完成某个功能的开发之后,填写 PR 申请单,向管理员发起分支合并的申请,由管理员审核并决定是否要合并,管理员审核通过之后即可自动在远程仓库合并

  • 查看远程分支情况

    git remote show origin
    
  • 删除 stale 的分支

    git remote prune origin
    

DevOps(Development Operations):重视开发和运维人员沟通合作的。通过自动化 “软件交互” 和 “架构变更” 的流程,使得构建、测试、发布能更加方便高效可靠。DevOps 的软件开发过程包含计划、编码、构建、测试、预发布、运维、监控。

8.4 环境隔离

为了使最终发布上线的代码的更稳定,需要部署稳定的代码到服务器上,而不会直接在用户直接访问到的服务器上进行开发和测试。因此需要有多个环境来分别进行开发、测试、部署等。也就有了开发环境、测试环境、预发布环境、灰度环境、生产环境等。

8.5 Git Flow 模型

Git Flow 是一个非常常见的分支模型。

分支名称适用环境解释
master主分支生产环境
develop开发分支开发环境
release预发布分支预发布 / 测试环境
feature需求开发分支本地
hotfix紧急修复分支本地
8.5.1 master 分支

只读。用于部署生产环境,一般由合并 release 分支得到。所有的 master 分支的推送都要打标签记录,便于追溯,且 master 分支不能删除。

8.5.2 feature 分支

基于 develop 分支创建,用于新功能或新特性的开发,开发完成之后,将 feature 分支合并到 develop 分支,后删除。

  • 命名规则:feature/user_createtime_feature(功能描述)
8.5.3 develop 分支

基于 master 分支创建,只读,记录开发提交,始终保持最新完成以及 bug 修复后的代码

8.5.4 release 分支

预发布分支,在 feature 分支合并到 develop 分支之后,基于 develop 分支创建 用于提交给测试人员进行测试。若测试有问题,则需要开发者在 develop 分支上看看是否存在问题,然后在 feature 分支上进行修复。release 分支属于临时分支,代码上线后可删除

  • 命名规则:release/version_publishtime
8.5.5 hotfix 分支

用于对 master 分支的 bug 进行修复(紧急修复),基于 master 分支创建,然后修复 bug,之后将该分支合并到 master 分支以及 develop 分支

8.6 git 相关图标无法显示的问题

在注册表的以下目录中将 Max Cached Icons 改为 2000,并将 ShellIconOverlayIdentifiers 目录下和 git 相关的目录通过缩进排到最前面即可

HKEY_LOCAL_MACHINE\Software\Microsoft\windows\CurrentVersion\Explorer\

git pull 与 git push 命令 是否和所在分支相关
试。若测试有问题,则需要开发者在 develop 分支上看看是否存在问题,然后在 feature 分支上进行修复。release 分支属于临时分支,代码上线后可删除

  • 命名规则:release/version_publishtime
8.5.5 hotfix 分支

用于对 master 分支的 bug 进行修复(紧急修复),基于 master 分支创建,然后修复 bug,之后将该分支合并到 master 分支以及 develop 分支

8.6 git 相关图标无法显示的问题

在注册表的以下目录中将 Max Cached Icons 改为 2000,并将 ShellIconOverlayIdentifiers 目录下和 git 相关的目录通过缩进排到最前面即可

HKEY_LOCAL_MACHINE\Software\Microsoft\windows\CurrentVersion\Explorer\

git pull 与 git push 命令 是否和所在分支相关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/785820.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频汇聚平台EasyCVR设备录像回看请求播放时间和实际时间对不上,是何原因?

安防监控EasyCVR视频汇聚平台可提供多协议(RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK)的设备接入、音视频采集、视频转码、处理、分发等服务,系统具备实时监控、云端录像、回看、告警、平台级联以及多视频流格式分发等视…

【Python】已解决:(最新版selenium框架元素定位报错)NameError: name ‘By’ is not defined

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:(最新版selenium框架元素定位报错)NameError: name ‘By’ is not defined 一、分析问题背景 在使用Selenium进行Web自动化测试或爬虫开…

使用MySQLInstaller配置MySQL

操作步骤 1.配置High Availability 默认选项Standalone MySQL Server classic MySQL Replication 2.配置Type and Networking ◆端口默认启用TCP/P网络 ◆端口默认为3306 3.配置Account and Roles 设置root账户的密码、添加其他管理员 4.配置Windows Service ◆配置MySQL Serv…

Redis连接Resp图形化工具和springboot

Redis连接Resp图形化工具和springboot 1.redis配置1.1 备份、修改conf文件1.2 Redis的其它常见配置:1.3 启动Redis:1.4 停止服务:1.5 开机自启: 2. resp的安装、配置和连接:2.1 GitHub上下载2.2 开始连接redis ![在这里…

服务器数据恢复—raid5阵列热备盘没有激活导致阵列崩溃的数据恢复案例

服务器存储数据恢复环境: 一台EMC存储中有一组raid5磁盘阵列,划分1个lun供小型机使用,上层采用ZFS文件系统。 服务器存储故障: 一台有一组raid5磁盘阵列的存储在运行过程中突然崩溃。管理员检查发现存储中的raid5阵列有两块硬盘离…

【Linux进阶】vim的用法

1.什么是vi/vim? 简单来说,vi是老式的文本编辑器,不过功能已经很齐全了,但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具,就连 vim的官方网站( http://www.vim.org)自己也说vim是一…

【知网CNKI-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

使用PyTorch设计卷积神经网络(CNN)来处理遥感图像Indian Pines数据集

目录 使用PyTorch设计卷积神经网络(CNN)来处理遥感图像Indian Pines数据集,以下是设计和实现这些网络的步骤: 1.数据准备: 1.1 首先,需要加载Indian Pines数据集。 1.2 将数据集转换为PyTorch张量&#x…

股指期货有哪些对冲类型?

股指期货对冲交易主要分为两类:沽出(卖出)对冲和揸入(购入)对冲。 沽出对冲旨在保护未来股票组合价格下跌的风险。在此策略下,对冲者通过出售期货合约来锁定未来的现金售价,并将价格风险从股票…

软件架构之计算机网络

软件架构之计算机网络 第 4 章 计算机网络4.1 网络架构与协议4.1.1 网络互联模型4.1.2 常见的网络协议4.1.3 IPv6 4.2 局域网与广域网4.2.2 无线局域网4.2.3 广域网技术4.2.4 网络接入技术 4.3 网络互连与常用设备4.4 网络工程4.4.1 网络规划4.4.2 网络设计4.4.3 网络实施 4.5 …

web端已有项目集成含UI腾讯IM

通过 npm 方式下载 TUIKit 组件,将 TUIKit 组件复制到自己工程的 src 目录下: npm i tencentcloud/chat-uikit-vue mkdir -p ./src/TUIKit && rsync -av --exclude{node_modules,package.json,excluded-list.txt} ./node_modules/tencentcloud/…

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver gdb是一款开源的、强大的、跨平台的程序调试工具。主要用于在程序运行时对程序进行控制和检查,如设置断点、单步执行、查看变量值、修改内存数据等,从而帮助开发者定位和修复代码中的错误。 gdbserve…

昇思MindSpore学习笔记6-02计算机视觉--ResNet50迁移学习

摘要: 记录MindSpore AI框架使用ResNet50迁移学习方法对ImageNet狼狗图片分类的过程、步骤。包括环境准备、下载数据集、数据集加载、构建模型、固定特征训练、训练评估和模型预测等。 一、概念 迁移学习的方法 在大数据集上训练得到预训练模型 初始化网络权重参数…

突发!马斯克3140亿参数Grok开源!Grok原理大公开!

BIG NEWS: 全球最大开源大模型!马斯克Grok-1参数量3410亿,正式开源!!! 说到做到,马斯克xAI的Grok,果然如期开源了! 就在刚刚,马斯克的AI创企xAI正式发布了此前备受期待大模型Grok-1,其参数量达…

【Linux】文件和目录管理命令——ls,cp,rm,mv

1.文件与目录的查看:Is ls [-aAdfFhilnrRst] 文件名或目录名称ls [ --color{never,auto,always} ]文件名或目录名称ls [ --full-time ]文件名或目录名称 选项与参数: -a:全部的文件,连同隐藏文件&am…

高质量PPT模板素材,免费下载

在制作演示文稿时,选择合适的PPT模板至关重要。为了帮助您轻松找到免费的PPT模板资源,这里分享了6个优秀的网站。这些资源库提供了各种风格和主题的PPT模板,让您的演示内容更生动、更吸引人。 1、baotuppt ppt模板下载-ppt背景 一个专业分享…

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围 在这篇博客中&#xff0c;我将介绍如何使用HTML和JavaScript读取文件夹中的所有图片&#xff0c;并显示这些图片以及它们的RGB范围。这个项目使用现代浏览器提供的<input type"file" webkitdirecto…

探展2024世界人工智能大会之合合信息扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09; &#xff0c;这次非常荣幸受邀作为专业观众参…

深入解析工信认证分类:价值及重要性

随着科技的发展和全球化的推进&#xff0c;企业对于产品和服务的质量、安全、环保等方面的要求日益提高。在这样的背景下&#xff0c;工信认证作为一种权威的第三方认证服务&#xff0c;受到了众多企业的青睐。 一、工信认证的类型 工信认证涵盖了多个领域&#xff0c;包括但不…

温州海经区管委会主任、乐清市委书记徐建兵带队莅临麒麟信安调研

7月8日上午&#xff0c;温州海经区管委会主任、乐清市委书记徐建兵&#xff0c;乐清市委常委、副市长叶序锋&#xff0c;乐清市委办主任郑志坚一行莅临麒麟信安调研&#xff0c;乐清市投资促进服务中心及湖南省浙江总商会相关人员陪同参加。麒麟信安董事长杨涛、总裁刘文清热情…