【Linux】【git】创建使用+分支管理+场景模拟

news2024/11/15 5:04:12

文章目录

  • 引子
  • 1. 创建 提交 删除
    • init - - 创建一个初始化的本地仓库
    • config - - 对本地仓库的配置
    • add - - 新增
    • commit - - 提交
    • rm - - 删除
  • 2. 状态查看 和 版本回退
    • log - - 日志
    • status - - 查看
    • diff - - 比较
    • reset - - 版本回退
          • 场景模拟1_1
    • reflog - - 参考日志
        • 场景模拟1_2
  • 3. 撤销修改
    • checkout - - 让 工作区 回到最近一次 添加 / 提交
    • reset - - 版本回退
  • 4. 分支管理
    • branch - - 新建、查看、删除本地分支
    • checkout - - 切换分支
        • 场景模拟2_1
    • merge - - 合并
        • 场景模拟2_2
        • 场景模拟3(合并冲突)
    • stash - - 保存工作区内容、取出

引子

git 用作版本管理,是开发人员必须掌握的工具之一。笔者想借由一些基础语法和操作入手,尝试将 git 的工作结构融入其中,以便那些和我一样想要开始学习 git 的朋友能更好的认识这个工具的本质。

🎯写在前面:

  • git 涉及的管理区域需要仔细体会。
  • git 管理的是修改(添加、修改、删除),而不是文件,简单来说对一连串时间主导的 commit obj 的索引的管理,就是 git 的管理。
  • HEAD 指针指向分支的最后一次 commit!!回滚版本实际就是 HEAD 指针前移!!
  • 本篇内容将从本地仓库讲起,冲突问题本地仓库和远端的处理模式基本一致,最后在介绍远端的相关命令,有助于对git模型的整体理解。

1. 创建 提交 删除

init - - 创建一个初始化的本地仓库

  • 命令:git init

在这里插入图片描述
在新建仓库里能看到 .git 文件,是自动生成的仓库区,不要手动修改!我们在此外的区域进行管理即可。
在这里插入图片描述

config - - 对本地仓库的配置

  • 命令:git config [option],在建好的仓库目录下可以对该仓库进行信息配置。
    • -l:查看仓库配置信息;
    • user.name "用户名":设置仓库所属用户名;
    • user.email "用户邮箱":设置仓库所属用户邮箱;
    • --unset user.name:删除仓库所属用户名;
    • --unset user.email:删除仓库所属用户邮箱;
    • --global:一台服务器下创建多个本地仓库时,加上这个选项,会在该服务器下的所有本地仓库中生效。不过,使用该选项创建后,要想删除内容,需要同样用该选项,删除才会生效。

add - - 新增

  • 命令:git add 路径1 [路径2 ...],将本地文件 / 文件夹提交到暂存区。

介绍一下版本库里的区域:

  • objects 对象库
    • add 新增工作区的修改的时候,会将修改的内容写入一个 git 对象中,放入对象库中保存。这其实就做到了文件的版本管理。
      在这里插入图片描述
  • stage 暂存区:
    • 存储的是 git 对象中的索引,是一个轻量化的区域。
      在这里插入图片描述

commit - - 提交

  • 命令:git commit -m "描述",将暂存区的内容写到 [master(图示)] 分支下。

  • master 分支树:

    • 存储的同样是 git 对象中的索引;
    • 由一个指针指向分支结构,我们只要找到这个指针就可以找到一个分支中的所有内容。
      ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2e8f9f

rm - - 删除

  • 命令:git rm [filename],像比与在终端先 rm filename 再进行 add 操作,git 提供的 rm 将这两步合成了一步。使用完就可以直接 commit 提交了。

2. 状态查看 和 版本回退

log - - 日志

  • 命令:git log,可以查看到 HEAD 指针及其之前的版本信息
    (如果版本发生过回退操作,则可能会出现,HEAD 指针之后仍存在历史提交版本的情况,这些情况 log 就看不到了,需要用到 reflog
    • --pretty=oneline:规划成一行,以易懂的形式展示。
    • --graph:将分支规划成图显示在前面。
    • --abbrev-commit:将 id 进行缩写显示。
  • 结合 “.git” 文件的内容一起看一下:
    • HEAD 指向的内容是最后一次 commit 生成的 git 对象,这也是分支 master 的头头;
    • 所有的 git 对象都存在 object 下,记录着每一个 commit 的详细信息;
    • 暂存区的内容都在 index 里。
      在这里插入图片描述

status - - 查看

  • 命令:git status "描述",查看本地、暂存库中的文件状态。

diff - - 比较

  • 命令:git diff [file],显示 已写入暂存区已经被修改但尚未写入暂存区文件 的区别。
    • 尚未提交到暂存区的改动:git diff [file];
      • 这里的结果绿框是改动前,-1 的含义是改动前的文件的第一行被修改了;
      • 橙框是改动后,+1,2 的含义是从第一行起的连续两行被改动了;
        在这里插入图片描述
    • 查看 版本库工作区 的区别:git diff HEAD [-- file]。

reset - - 版本回退

reset 可以将版本库中的操作进行回退

也可以回退到当前版本(工作区、暂存区有修改,可以使用 git reset 让工作区、暂存区和版本库一致,相当于撤回工作区、暂存区的修改)。

a. 回退到指定版本

  • 命令:git reset [option] [HEAD] [filename],这里的HEAD指的是指针,即 git 对象的 ID。
    • --soft:只回退版本库;
    • --mixed:回退暂存库、版本库,是 默认选项
    • --hard:回退工作区、暂存区、版本库。慎用,工作区的新增内容会全部消失。
选项工作区暂存区版本库
--softvers1,vers2vers1,vers2vers1
--mixed(默认项)vers1,vers2vers1vers1
--hardvers1vers1vers1

b. 回退到 当前/上一版本

  • 命令:git reset [option] HEAD[^^] [filename],直接跟 HEAD 是回退到当前版本,在 HEAD 后加 ^ 就是回退到上一个版本,加 ^^ 就是回退到上上个版本。
    • 选项的控制范围也是一样的,如果不加,就是默认 --mixed,让暂存区和版本库一致。
场景模拟1_1
在一个仓库中我做了三次提交:
第一次创建提交:file1(里面的内容是version 1)
第二次创建提交:file2、file3
第三次修改提交:file1(里面的内容是version 1\nversion2)

这里要做的是将版本回退到第一次提交,然后版本再次返回,回退到第三次提交

在这里插入图片描述
如上操作,在回退到第一版时,输入 git log 是只有第一次提交的记录的,我们能顺利回退完全是因为在最开始打印了第三次的提交 id。

在已经 git log 不出原来信息的情况,又要怎么回退到第三次提交呢?

reflog - - 参考日志

  • 命令:git reflog,可以叫做显示可引用的历史版本记录,会记录所有出现过的提交信息。
场景模拟1_2
接着上面的场景模拟1_1,在 git reflog 中可以找到所有的记录!!

在这里插入图片描述
ps:如果版本提交次数太多,想要恢复的那个 id 找不到了,就恢复不了咯~~~

3. 撤销修改

撤销修改这一节,适用于如下情况:我们想把本地的内容撤销掉,恢复上一个版本的内容。撤销的目的主要是,不要让本地代码影响远程仓库!

这里引入一个远程仓库的概念,我们能接触到的几个分区大概就是这样:

工作区 --> 暂存区 --> 版本库 --> 远端仓库
      add     commit     push

而撤销修改的前提就是,需要撤销的内容还没有 push,没有推送至远端,否则这些撤销修改都是没有意义的。

本地 git 仓库存在以下这三种分区,对于要撤销的修改就会有三种状况:

情况工作区暂存区版本库处理方式
只有修改,还没 addxxxgit checkout – [filename]
没有 commitxxxxxxgit reset HEAD [filename]
add、commit 都做了xxxxxxxxxgit reset --hard HEAD^ [filename]

checkout - - 让 工作区 回到最近一次 添加 / 提交

  • 命令:git checkout -- [filename],这里必须要加 - - 否则这个命令就不是这个意思咯

reset - - 版本回退

...具体见上一个板块 ~~

4. 分支管理

这一节牵扯到多个分支的问题,之前因为都是以一个分支举例,所以需要进一步说明一个细节:被 HEAD 指向的分支,是当前工作分支。使用下面这个命令可以查看当前本地分支情况。

branch - - 新建、查看、删除本地分支

  • 命令:git branch查看当前本地分支情况,其中带 * 号的就是当前工作分支。
  • 命令:git branch 分支名新建分支
    • 注意:分支在当前的版本建立,也就是说创建分支的时候,master 和 dev 里放的都是最后一次操作的索引。
  • 命令:git branch -d 分支名删除本地分支。在有提交的情况下,是不能删除的。
  • 命令:git branch -D 分支名强制删除本地分支
    • 不能删除当前所在分支,想要删除一个分支,必须先切换出这个分支才行。
      在这里插入图片描述

checkout - - 切换分支

  • 命令:git checkout [option] 分支名,切换到指定分支。
    • -b:切换到指定分支,如果没有该分支则创建再切换
      在这里插入图片描述
场景模拟2_1

在这里插入图片描述

merge - - 合并

  • 命令:git merge [option] 分支名,可以将指定分支的内容合并进当前分支。
    • --no-ff:不使用 fast-forward 模式,可以在 log 中看出该次提交是来自 merge 的,同时带上 -m "描述" 选项,进行一次提交。
      在这里插入图片描述
场景模拟2_2

接着上个场景2_1
在这里插入图片描述
注意,这里 merge 的时候给出的信息中有一个 fast-forward,这个 快速模式 意思就是通过改变了 master 的指向,快速合并。如果是 fast-forward 模式,会分辨不出来是 merge 进来的还是正常提交的。

场景模拟3(合并冲突)

如果在 merge 的时候,两个分支都对相同内容有改动,就会产生冲突,需要我们去手动解决。<<<<HEAD 和 === 之间的是当前分支的改动,=== 和 >>>dev 之间的是分支dev的改动。

非 fast-forward (no-ff) 模式的合并,去看他的分支,能清楚的看出是 merge 进来的内容。
如果想要普通的 merge 也可以这样看出过程,需要在 merge 后加上 --no-ff 选项
在这里插入图片描述

stash - - 保存工作区内容、取出

stash 又是一个新区域咯~~

  • 推入
    • 命令:git stash / git stash push,可以将所在分支的 工作区中的已经被 git 追踪管理的内容 保存在 stash 中。这份暂存的内容会有一个默认的 msg,内容是当前分支的最近一次提交的 msg,想要自己定义更详细的内容,建议使用下面的命令;
    • 命令:git stash save "msg content",储存时自定义 msg。
  • 查看
    • 命令:git stash list,查看 stash 中存了哪些内容,行开头是 stash 的名称和序号,idx 为 0 是栈顶,一切操作不带 idx 的都默认为对栈顶进行操作。
  • 应用 / 弹出
    • 命令:git stash pop [idx],将 stash 中存储的内容取出至工作区,不带 idx 默认从栈顶弹出。
    • 命令:git stash apply [idx],将 stash 中存储的内容应用至工作区,stash 中不删除,即可以多次应用,不带 idx 默认应用栈顶内容。
  • 删除
    • 命令:git drop [idx],将 idx 标记的 stash 从 list 中丢弃,不带 idx 默认丢弃栈顶内容。

首先声明这样一个场景:我们在日常开发的时候为了保证主分支(线上分支)的稳定,新功能和 BUG 修改工作都应该基于主分支,在自己本地的新建分支上完成,测试通过后 merge 进主分支!git 的分支管理提供给我们如上便利,同时还能实现多人共同协作…

假设我们正在分支 dev 进行新功能开发,本地工作区有内容未提交,但是此时有一个新 bug 需要马上处理。如果这时候我们直接 git checkout master 转回主分支并进行 git checkout -b dev_fix_bug,进入 dev_fix_bug 会发现 dev 编辑的未提交内容都会显示出来,这是我们不希望看到的。此时就需要用到 stash 命令,在 dev 开发分支上将未提交的代码保存!

stash 的暂存只在该分支上有效,当该分支上有 stash 的情况下,pull 了远端最新的代码,或者工作区有改动,导致行内冲突,这样的冲突也是需要我们手动去解决的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K短路(A*算法)

K短路&#xff1a; 在图论中&#xff0c;K短路问题是指在一个图中找到从起点s到终点t的第K短的路径。其中&#xff0c;第1短路径即为最短路径。K短路算法在实际应用中有着广泛的用途&#xff0c;如在通信网络中找到替代的最短路径等。 基本概念 K短路&#xff1a;从起点s到终…

美国服务器稳定么?影响服务器稳定性的6个因素

美国服务器稳定么&#xff1f;美国服务器的稳定性是相当不错的&#xff0c;这主要得益于其先进的技术、成熟的基础设施以及严格的管理措施。美国拥有众多知名的服务器提供商&#xff0c;这些提供商通常会采用顶级的硬件设施&#xff0c;如英特尔、AMD等知名品牌的处理器&#x…

Chromium编译指南2024 - Android篇:前置要求(一)

1.引言 欢迎阅读《Chromium编译指南2024 - Android篇》。本指南旨在帮助开发者理解和掌握在Android平台上编译Chromium的全过程。Chromium是一个开源的浏览器项目&#xff0c;由Google主导开发&#xff0c;并为多个现代浏览器提供基础代码。Android作为全球使用最广泛的移动操…

DirectX_web_setup.exe

F:\Downloads\录屏软件\OBS DirectX_web_setup.exe

IP实现https访问的简易方式

很多项目怕麻烦不愿意申请域名&#xff0c;也不想备案&#xff0c;所以直接用服务器IP地址做WEB项目更快一些&#xff0c;但又想给IP地址申请SSL证书&#xff0c;这种情况下需要用到IP类型的专用SSL证书。 IP SSL证书是支持IP地址实现HTTPS加密的SSL证书&#xff0c;为不能提供…

Linux服务管理(五)Apache服务优化

CustomLog "|/bin/rotatelogs -l /wwwlogs/access_%Y%m%d.log 86400" combined日志旋转可参考这篇文章&#xff1a; https://blog.csdn.net/weixin_43576565/article/details/139989701 要优化首先你得有Apache yum -y install httpd启动 service httpd start写入…

[Qt][按钮类控件]详细讲解

目录 0.按钮状态说明1.Push Button2.Radio Button3.Check Box4.Tool Button 0.按钮状态说明 clicked&#xff1a;⼀次 ⿏标按下⿏标释放 触发pressed&#xff1a;鼠标按下时触发released&#xff1a;鼠标释放时触发toggled&#xff1a;checked属性改变时触发 1.Push Button QP…

seaborn与pandas绘图入门

导入环境 import numpy as np import pandas as pd from numpy.random import randn import matplotlib.pyplot as plt 若是在jupyter notebook编译&#xff0c;需要额外执行下列语句 %matplotlib notebook 该语句在Jupyter Notebook或JupyterLab中使用的IPython魔法命令&…

最新版的AutoGPT,我搭建好了

最近AutoGPT不是更新了嘛 安装 我按照官方的教程 在本地搭建好了 改动 可见的改动&#xff0c;主要是把原来的纯命令行改成前后端的形式 看下前端界面 界面比较简单&#xff0c;主要分3个大块 监控 第一个是监控 主要是看你在 build 里构建的Agents的运行情况 build 第一个是Ag…

C++笔试练习笔记【7】:力扣 91. 解码方法 动态规划练习

文章目录 题目题目分析思路解法正常解法优化解法 题目 题目链接&#xff1a;力扣 91. 解码方法 备用链接&#xff1a;https://leetcode.cn/problems/decode-ways/description/ 题目分析 1.首先我们知道题目给定A~Z编码为1 ~26 &#xff0c;而数字十一字符串的形式给出所以…

js构造函数的prototype赋值总结

我们知道通过构造函数的prototype,可以生成让所有实例对象访问的通用属性和方法,下面通过代码来解释这个过程 function Person(name){this.name name; }Person.prototype.sex man我们定义了一个构造函数Person,然后给它的prototype添加了一个sex的属性,下面我们来看看Person…

MySQL:复杂查询 (一)——聚合函数分组查询联合查询

目录 1、聚合查询 1.1 聚合函数 1.1.1 COUNT() 1.1.2 SUM() 1.1.3 AVG() 1.1.4 MAX()&#xff0c;MIN() 1.2 分组查询 1.2.1 GROUP BY子句 1.2.1.1 round() 1.2.2 HAVING 1.2.3 示例 2、联合查询 2.1 ①取相关表笛卡尔积 2.2 ②过滤无效数据 2.3 ③精简查询结果…

【数据结构】队列,你必须知道的内部原理!!!

&#x1f31e;&#x1f31e;&#x1f31e;生活本就沉闷&#xff0c;但跑起来就会有风 ~~~ 前言&#xff1a; &#x1f31f;&#x1f31f;Hello家人们&#xff0c;这期讲解数据结构队列的基础知识&#xff0c;希望你能帮到屏幕前的你。 &#x1f4da;️上期博客在这里&#xff1…

书生基础岛1-开发全链路

涌现能力&#xff1a;知识到运用的能力。 开源工具箱&#xff1a; 预训练&#xff1a; 微调&#xff1a; 部署&#xff1a; 智能体&#xff1a; 智能体&#xff1a; 知识库构建&#xff1a; RAG&#xff1a;

初识C++ · C++11(1)

目录 前言&#xff1a; 1 统一列表初始化 2 声明 2.1 auto 2.2 decltype 2.3 nullptr 2.4 stl的部分变化 3 右值引用和移动语义 前言&#xff1a; 在C11之前&#xff0c;C98的出现使得C看起来更像是一门独立的语言&#xff0c;C委员会成立后&#xff0c;对外宣称的是5…

神鸟云PCDN业务招募

短Z业务--支持nat0~nat4 省内调度&#xff0c;晚高峰 跑量9成 配置要求: 线路&#xff1a;单条上行30M 硬件&#xff1a;32线程 64内存条 240G系统盘 1G:2T固态盘单价&#xff1a;移动1900 电联2500 镜像下载&#xff1a;http://oss.download.birdicloud.com/box/Cent…

三层架构:IOCDI

三层架构 我们先看一下三层架构是什么 我们想要实现这三层架构的分离&#xff0c;实现一个类实现一个功能。 我们先建立一个包&#xff0c;然后在包下创建接口&#xff0c;然后再实现接口。从而实现三层架构分离。 IOC 为了实现这三层架构的分离&#xff0c;我们把创建类的…

协同过滤之矩阵分解算法问题详解

1、矩阵分解出现的原因 传统的协同过滤依赖用户的历史行为来推测用户对未评分商品的评分&#xff08;潜在兴趣&#xff09;&#xff0c;不需要了解物品的具体属性&#xff0c;也不需要知道用户的具体偏好&#xff0c;只需要历史评分数据就可以进行推荐&#xff0c;存在以下问题…

Query @azure/openai with images?

题意&#xff1a;使用图像与azure/openai进行交互或查询 问题背景&#xff1a; On chat.openai.com I can upload an image and ask chatgpt a question about it, with the existing openai and azure/openai api however there doesnt seem to be a way to do this? The Ch…

QT+ffmpeg环境配置

1.新建一个qt项目 2.下载ffmpeg文件Releases BtbN/FFmpeg-Builds GitHub 3.解压后&#xff0c;打开qt项目地址&#xff0c;将ffmpeg文件复制进qt项目 4.打开新建的qt项目头文件新加入如下内容&#xff1a;&#xff08;如有需求可按需求添加&#xff09; INCLUDEPATH $$PWD/i…