git企业开发的相关理论(二)

news/2024/12/24 8:38:42/

git%E4%BC%81%E4%B8%9A%E5%BC%80%E5%8F%91%E7%9A%84%E7%9B%B8%E5%85%B3%E7%90%86%E8%AE%BA%EF%BC%88%E4%B8%80%EF%BC%89">

目录

git%E4%BC%81%E4%B8%9A%E5%BC%80%E5%8F%91%E7%9A%84%E7%9B%B8%E5%85%B3%E7%90%86%E8%AE%BA%EF%BC%88%E4%B8%80%EF%BC%89-toc" style="margin-left:0px;">git企业开发的相关理论(一)

八.修改文件

九.版本回退

十.撤销修改

情况一(还没有add)

情况二(add后还没有commit) 

 情况三(commit后还没有push)

十一.删除本地仓库中的文件

方法一

方法二

十二.理解分支

1.常见的分支工作流程

2.合并冲突

3.合并模式

4.分支策略及bug分支



git企业开发的相关理论(一)">

八.修改文件

由文章(一),我们可以清楚地知道,git追踪管理的其实是修改,而不是文件。如何知道这一点呢,接下来我们引入两个命令来查看修改前后的变化。

//    显示暂存区和工作区文件的差异(add前)
git diff [file]//    查看版本库和工作区文件的区别(commmit前)
git diff HEAD -- [file]

1.我们可以看到,文件名有后缀还是要加上后缀,才能正常访问

2.我们其实可以直接cat README.txt查看文件,为什么还要多次一举呢?因为代码多了,区别就不容易找了。

3.我们可以看到git diff HEAD -- README.txt与git commit -m 'new'都是增加两行减少一行,而不是只是单纯地增加一行

九.版本回退

                                        关于README.txt的两个版本

第一次提交(README)

C++ direction learning log  --图片中将缩写为C++

第二次提交(new)

C++ direction learning log   --图片中将缩写为C++
new line  --图片中将缩写为new

//    本质是回退版本库中的内容
git reset [--soft | --mixed | --hard] [HEAD]//    当回退版本以后,git log显示的版本也将回到那时
//    当clear后想吃后悔药,git log找不到回退前的哈希值
//    这时就需要如下命令
git reflog

 

如图介绍了使用不同命令之间的区别,同时应该慎用--hard,因为他会将工作区也一并回退,如果你此时正在开发新内容,new下写了几万字了,那这些也将一并回退,并且无法恢复。下面我将演示如何从new回退到C++,再回退到new。

为什么回退的速度如此只快呢?这就是为什么git被称作版本控制器的原因了,我们只是改变了HEAD指针的指向,回退只需要改其指向,指针指向的哈希值变了而已。 

十.撤销修改

//    撤销工作区对指定文件的修改,将文件恢复到 暂存区 或 最新提交版本 的状态。
//    还没有add
git checkout -- [filename]

情况一(还没有add)

情况二(add后还没有commit) 

 情况三(commit后还没有push)

十一.删除本地仓库中的文件

方法一

先在工作区中删除文件,再add,commit一遍,毕竟删除也是修改

方法二

git rm [file]

 先使用git命令删除文件,再commit一遍

由于比较简单,就不做演示,只是要注意删除本地仓库的文件,并非只删除工作区中的文件

十二.理解分支

什么是分支?分支有什么用?一个团队开发代码到一定阶段时,对下一阶段的目标产生了分歧,a有一个思路,b有一个思路,谁的思路最好呢,这时就用得到分支了,他允许开发者在不影响主线代码的情况下,进行独立的开发或试验。Git 的分支本质上是一个指向特定 提交对象(Commit) 的指针。(HEAD)

1.常见的分支工作流程

//    查看当前仓库中的分支
git branch
// 输出示例(*表示当前所在的分支)
// * main
//  develop
//  feature-xyz//     创建一个新分支,但不会切换到该分支
git branch <file>//    切换到指定分支   (注意不要与git checkout -- 混淆)
git checkout <file>//    使用 -b 参数可以同时创建并切换到新分支
git checkout -b <file>//    将其他分支的内容合并到当前分支
git merge <file>//    删除本地分支
git branch -d <file>
//    强制删除(如分支未合并)
git branch -D <file>

下面介绍分支的一般流程,创建分支--在分支上开发--切换回主分支--合并分支--删除分支

 1.我们发现当我们切换一个分支对README.txt进行修改,再切换回来后,发现原来的分支上也出现了修改。这与我们隔离开原来的代码,单独开发的目的不符,这是为什么呢?原来,我们在创建一个新的分支进行修改后,必须add,commit,这样切换会原来的分支,就会发现,做出的修改不会作用于原来的分支。

2.为什么合并分支后建议删除分支?合并后删除无用分支的主要目的是为了保持代码库整洁,避免分支冗余、管理混乱和误操作,同时有助于提升团队协作效率。

2.合并冲突

当你在 Git 中合并分支时,如果两个分支修改了同一个文件的同一部分内容,Git 无法自动合并,便会产生合并冲突(Merge Conflict)。你需要手动解决这些冲突,然后完成合并操作。他通常发生在以下场景

  • 两个分支修改了同一文件的同一行。
  • 一方删除了某个文件,而另一方修改了这个文件。
  • 修改的代码在逻辑上存在冲突。

 下面演示合并冲突发生的原因及解决办法

 我们可以看到当发生合并冲突时会出现如下代码

Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.

解决这种冲突也很朴素,就是直接打开冲突文件,自己选择保留,更改哪些代码。

<<<<<<< HEAD
分支 A 的修改内容
=======
分支 B 的修改内容
>>>>>>> feature-branch//  <<<<<<< HEAD 表示当前分支的修改内容。
//  ======= 是分隔线。
//  >>>>>>> feature-branch 表示被合并分支(如 feature-branch)的修改内容。

3.合并模式

 这里我们只讨论两种合并模式,快进模式和非快进模式。笔者上网查阅这两种的区别时,发现他们的可视化图对于初学者其实不太友好,因为合并前这两种模式的可视化图在我看来并无区别。在这里就用最朴素的方式进行讲解。快进模式就是十二的1.常见的的分支工作流程,非快进模式就是2.合并冲突。区分他们的关键就在于当你切换一个新的分支提交代码后,再切回原来的分支,你有没有提交代码,有就是非快进模式,没有就是快进模式。

//    为了团队协作中便于追踪合并来源,通常推荐使用非快进合并
git merge feature --no-ff

4.分支策略及bug分支

我们创建分支,希望遵循以下原则来确保效率,安全

1.我们希望所有的分支分工明确,master分支是主分支,develop分支负责开发,bug分支负责修bug,因此也希望分支名要能反应分支的功能

2.我们希望分支尤其是主分支保持相对稳定

3.我们希望避免不必要的分支,也包括删除已经完成其使命的分支

在bug分支中,当bug修完后,master分支版本更新了,我们建议先让bug分支合并主分支,然后在bug分支上解决完可能出现的问题,再让master分支合并bug分支,来确保master分支的相对稳定。 


http://www.ppmy.cn/news/1557694.html

相关文章

第79期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

WebRTC服务质量(09)- Pacer机制(01) 流程概述

一、前言&#xff1a; Pacer 是一种数据发送调度机制。它的主要功能是根据网络带宽限制、网络拥塞控制的反馈以及媒体的发送策略&#xff0c;对数据包的发送进行适配和节奏调度&#xff0c;以避免网络拥塞、减少丢包并保证流媒体传输的平滑性。 二、核心概念&#xff1a; 2.…

每天40分玩转Django:Django文件上传

Django文件上传 一、今日学习内容概述 学习模块重要程度主要内容基础文件上传⭐⭐⭐⭐⭐文件字段、基本配置自定义存储⭐⭐⭐⭐⭐存储后端、云存储集成文件处理⭐⭐⭐⭐图片处理、文件验证异步上传⭐⭐⭐⭐AJAX上传、进度显示 二、模型和表单设计 # models.py from django.…

Android OpenGLES2.0开发(十):FBO离屏渲染

人生是一场单程的旅行&#xff0c;即使有些遗憾我们也没有从头再来的机会&#xff0c;与其纠结无法改变的过去不如微笑着珍惜未来。 Android OpenGLES开发&#xff1a;EGL环境搭建Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始Android OpenGLES2.0…

面向对象 类函数的区别 实例方法 类方法 静态方法 抽象方法

前言&#xff1a;面向对象类方法的说明&#xff1a; 实例方法 定义&#xff1a;实例方法是在类中定义的&#xff0c;用于操作类的实例&#xff08;对象&#xff09;的属性和行为的方法。它的第一个参数通常是self&#xff08;在 Python 中&#xff09;或this&#xff08;在 Jav…

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

基于字节大模型的论文翻译(含免费源码)

基于字节大模型的论文翻译 源代码&#xff1a; &#x1f44f; star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型&#xff08;Large Language Model, LLM&#xff09;的论文阅读与翻译辅助工具。它通过用户界面&#xff08…

【Django篇】--动手实践Django基础知识

一、url视图映射 在url.py中定义两个视图函数&#xff0c;并添加到urlpatterns中用于访问。 from django.contrib import admin from django.urls import path from django.shortcuts import HttpResponse# 默认的地址为&#xff1a;http://127.0.0.1:8000/# 如果我想要访问默…