Git学习笔记(流程图+示例)

news2024/11/18 13:59:51

概念

在这里插入图片描述
图中左侧为工作区,右侧为版本库。Git 的版本库里存了很多东西,其中最重要的就是暂存区。
• 在创建 Git 版本库时,Git 会为我们自动创建一个唯一的 master 分支,以及指向 master 的一个指
针叫 HEAD。(分支和HEAD的概念后面再说)
• 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区目录树的文件索引会被更新。
• 当执行提交操作git commit 时,master 分支会做相应的更新,可以简单理解为暂存区的目录
树才会被真正写到版本库中。

通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过使用 git add 和 git commit 命令才能将文件添加到仓库中进行管理!!!
在这里插入图片描述
在本地的 git 仓库中,有几个文件或者目录很特殊
• index: 暂存区, git add 后会更新该内容。
• HEAD: 默认指向 master 分支的一个指针。
• refs/heads/master: 文件里保存当前 master 分支的最新commit id 。
• objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。

本地命令

查看历史操作

git log
git log --pretty=oneline 一行显示,显示的更美观(pretty)
在这里插入图片描述

查看版本库(object文件夹中)对象的内容

git cat-file
-p代表显示结果更加便于查看
在这里插入图片描述

显示暂存区和工作区文件的差异

git diff [file]
也可以使用 git diff HEAD – [file] 命令来查看版本库和工作区文件的区别
在这里插入图片描述

版本回退

git reset [–soft | --mixed | --hard] [HEAD]
• --mixed 为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内
容,工作区文件保持不变。
• --soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
• --hard 参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命
令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重。
• HEAD 说明:
◦ 可直接写成 commit id,表示指定退回的版本
◦ HEAD 表示当前版本
◦ HEAD^ 上一个版本
◦ HEAD^^ 上上一个版本
◦ 以此类推…
• 可以使用 ~数字表示:
◦ HEAD~0 表示当前版本
◦ HEAD~1 上一个版本
◦ HEAD^2 上上一个版本
◦ 以此类推

如果后悔怎么办
git reflog 命令,该命令用来记录本地的每一次命令
在这里插入图片描述

撤销修改命令

  1. 如果在工作区,则可以直接删除,但Git 其实还为我们提供了更好的方式,我们可以使用 git checkout – [file] 命令让工作区的文件回到最近一次 add 或 commit 时的状态,即把暂存区中的内容同步到工作区。 要注意git checkout – [file] 命令中的 – 很重要,切记不要省略,一旦省略,该命令就变为其他意思了
  2. 已经add但没有commit
    git reset 回退命令,该命令如果使用 --mixed 参数,可以将暂存区的内容退回为指定的版本内容,但工作区文件保持不变。那我们就可以回退下暂存区的内容了,–mixed是默认参数可以省略。将暂存区恢复到指定版本后,使用checkout命令同步工作区
  3. 已经commit了
    使用版本回退到上一个版本:git reset --hard HEAD^

删除命令

git rm -> git commit 。先把工作区和暂存区的内容删除,再把分支内的对象删除

远程命令

克隆仓库命令

git clone

  • 可以使用HTTPS也可以使用ssh,其中ssh每次push就不需要输入密码,HTTPS每次push都需要输入密码。
    要使用ssh克隆,需要把本地的公钥保存在平台中才能有权限克隆。

  • 远程仓库的默认名称是 origin 。在本地我们可以使用 git remote 命令,来查看远程库的
    信息

  • 或者,用 git remote -v 显示更详细的信息

上传下载命令

git push 该命令用于将本地的分支版本上传到远程并合并
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
例:git push origin master 将本地的 master 分支推送到 origin 主机的 master 分支

git pull 命令,该命令用于从远程获取代码并合并本地的版本。
git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull <远程主机名> <远程分支名>

分支管理

HEAD所指向的分支就是当前用户在工作的分支
查看本地分支 git branch
查看远程分支 git branch -r
查看本地+远程分支 git branch -a
创建分支 git branch 分支名
切换分支 git checkout 分支名 (git checkout -b 分支名 如果不存在则创建分支)
合并分支 git merge 分支名
删除分支 git branch -d 分支名 需要在其它分支上删除该分支
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和
直接在master分支上工作效果是一样的,但过程更安全。

创建并切换分支

创建分支建议从远程创建分支,因为本地新建分支可能本地的master不是最新的,需要进行同步工作
在这里插入图片描述
各个分支所指向的相同文件是不同版本的:
在这里插入图片描述

合并分支

要想master拥有dev的最新版本,需要切换到master,然后使用git merge 分支名称在这里插入图片描述
这里Fast-forward指的是直接将master指向的commit id指向了dev的最新版本的commit id
在这里插入图片描述

合并冲突

git commit之后:两个分支,一个文件两个版本
在这里插入图片描述

当两个分支都对同一个文件进行修改时,commit会发生冲突,报错:
在这里插入图片描述
此时冲突的文件内容被git修改成如下格式:
在这里插入图片描述
解决方案:
程序员自己决定保留哪一部分内容,对文件内容进行修改,然后再 git add-》git commit
解决冲突后成了这样:
在这里插入图片描述
注意!!! dev仍然指向自己的版本,而master才指向合并后的版本。

扩展

git log --graph --pretty=oneline --abbrev-commit
可以展示类似于上面的整个文件的版本控制图:
在这里插入图片描述

分支管理策略

Fast forward模式

Fast forward 模式,以下简称ff模式
当使用 ff 模式进行merge时,两个分支指向的commit id都会指向最新的版本。删除分支后,查看分支历史时,会丢掉分支信息,看不出来最新提交到底是 merge 进来的还是正常提交的,只有当合并冲突时,会采用非fast forward模式,才能看到全部的分支信息。
在这里插入图片描述
在这里插入图片描述
那么如何不使用该模式呢?
–no-ff 参数,表示禁用 Fast forward 模式。禁用 Fast forward 模式后合并会创建一个新的commit ,所以加上-m 参数,把描述写进去。
类似于:git merge --no-ff -m “merge with no-ff” 分支名

之后整个分支图如下:
在这里插入图片描述

分支策略

在这里插入图片描述

bug分支

假如我们现在正在 dev2 分支上进行开发,开发到一半,突然发现master 分支上面有 bug,需要解决。
首先,当然可以直接在dev2上改bug。但这不符合dev2扥初衷,dev2分支初衷是用来扩展的。那么此时推荐新建bug分支。

在Git中,每个 bug 都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

此时的问题在于dev2没有完成开发,无法提交,而如果此时创建分支,bug分支会把dev2放在工作区的内容也添加到它的分支的管理下,这可怎么办?

使用git stash命令将当前的工作区信息进行储藏,被储藏的内容可以在将来某个时间恢复出来。以此来避免bug分支的内容与dev2的内容冲突。
在这里插入图片描述
此时工作区是干净的没有被修改过的被git追踪管理的文件。

那么就可以新建bug分支,然后修复bug,提交bug修复的代码文件。

然后再返回dev2分支去进行开发:使用git stash list可以查看之前保存工作区中的dev2分支的内容,使用git stash pop来恢复该内容到工作区
在这里插入图片描述

当开发完成后,与主分支进行合并,但此时要 注意!!! ,建议不要直接使用master合并dev2的内容,因为如果master直接合并dev2的内容,他们是一定有冲突的,因为master最新版本是基于bug修复后的,而dev2是基于bug修复前的版本开发的,master领先dev2一个版本。
在这里插入图片描述

而如果此时直接去在master分支上对dev2进行合并,然后修复冲突,而修复冲突是手工的,如果解决冲突出错了,就会导致master分支上又有bug。
所以,建议在dev2分支去合并master分支的内容,解决冲突后再进行合并到master中。
在这里插入图片描述

删除分支

git branch -d 分支名(必须要合并了内容才能删除)
git branch -D 分支名(强制删除,不管是否合并)

注意事项

远程分支和本地分支

如果远程的分支本地没有,那么使用git branch -a 或者 -r 都是无法看到该分支的。需要使用git pull拉取下来

远程分支与本地分支的连接

查看远程分支与本地分支的连接命令:git branch -vv
在这里插入图片描述

在这里插入图片描述

标签管理

标签tag ,可以简单的理解为是对某次 commit 的一个标识,相当于起了一个别名。例如,在项目
发布某个版本的时候,针对最后一次 commit 起一个 v1.0 这样的标签。

打tag

  • 命令git tag [name] :默认打在最近一次commit上

  • 命令git tag:显示所有标签

  • 如何打在任意commit记录上呢?
    git log --pretty=oneline --abbrev-commit 找到想要打标签的commit id,--abbrev-commit参数表示缩小显示的id值
    再使用git tag [name] [commit id]
    另外,标签不是按时间顺序列出,而是按字母排序的。

  • Git 还提供可以创建带有说明的标签,用-a指定标签名,-m指定说明文字,格式为:
    git tag -a [name] -1 m “XXX” [commit_id]

查看tag

  • git show [tagname] 查看标签信息

删除tag

git tag -d [tagname]

如果标签已经推送到远程,要删除远程标签就麻烦一点,需要先使用**git tag -d [tagname]**从本地删除,然后,从远程删除。删除命令也是push,格式:git push origin :refs/tags/[tagname]
其中,:refs/tags/[tagname]看下图
在这里插入图片描述

远程推送tag

为创建的标签只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令git push origin [tagname]

如果本地有很多标签,也可以一次性的全部推送到远端:
git push origin --tags

常见问题

远程仓库分支已经被其他人修改,需要合并分支到master

解决:假设有dev分支和master分支。
第一步:如果远程master分支被修改,则本地master分支pull,解决冲突。(保持这个好习惯,首先输这个命令保证master是 最新的)
第二步:判断dev远程分支是否被人修改,那么把远程的dev分支内容git pull拉取下来后,手动解决冲突
第三步:当确认分支无误后,就可以合并到master。而合并 master 推荐先 dev 合并 master,解决冲突后,再让 master 合并 dev 分支。
第四步:push master分支

在这里插入图片描述

有本地分支,但没有该远程分支

首先在本地修改完内容后,add-》commit。由于没有远程分支所以无法push到远程,那么此时就需要建立远程分支,可以直接使用git push [远程仓库名(一般为origin)][分支名]

如果远程有,那么给本地和远程的分支建立连接
git checkout -b [分支名] [origin/分支名]
git branch --set-upstream-to=origin/分支名 分支名
,’ / ’ 不能省

git pull命令

简短的git pull 两个作用

  1. 拉取本地当前工作分支与远程已建立连接的分支的分支内文件内容
  2. 拉取仓库中的内容,这个不需要建立连接。所以此时如果本地仓库没有而远程仓库有的分支,使用git pull会把远程仓库的分支拉取下来使本地可以看到该远程分支。拉取到该分支后,使用**git checkout -b [分支名] [origin/分支名]**对远程分支与该分支建立连接,之后就可以在本地分支中看到对应远程分支的内容,并进行修改了。注意不能直接对远程分支进行修改,而应再建分支修改内容后提交给远程分支。

git branch -r看到远程仓库已经被删除的分支怎么解决

在这里插入图片描述
此时dev1 ,dev2 和dev3 已经在远程仓库被删除,但本地git branch -r仍然可以看到
使用git remote show origin 能够显示远程仓库的信息
这里使用git remote prune origin 表示修剪远程仓库的内容

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

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

相关文章

服务器又被挖矿记录

写在前面 23年11月的时候我写过一篇记录服务器被挖矿的情况&#xff0c;点我查看。当时是在桌面看到了bash进程CPU占用异常发现了服务器被挖矿。 而过了几个月没想到又被攻击&#xff0c;这次比上次攻击手段要更高明点&#xff0c;在这记录下吧。 发现过程 服务器用的是4090…

【数据结构】详解时间复杂度和空间复杂度的计算

一、时间复杂度&#xff08;执行的次数&#xff09; 1.1时间复杂度的概念 1.2时间复杂度的表示方法 1.3算法复杂度的几种情况 1.4简单时间复杂度的计算 例一 例二 例三 1.5复杂时间复杂度的计算 例一&#xff1a;未优化冒泡排序时间复杂度 例二&#xff1a;经过优化…

Go语言必知必会100问题-19 浮点数溢出问题

问题呈现 在Go语言中&#xff0c;有两种浮点数类型&#xff08;虚数除外&#xff09;&#xff1a;float32和float64. 浮点数是用来解决整数不能表示小数的问题。我们需要知道浮点数算术运算是实数算术运算的近似&#xff0c;下面通过例子说明浮点数运算采用近似值的影响以及如…

LeetCode:143.重排链表

143. 重排链表 解题过程 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; …

python 蓝桥杯之并查集

文章目录 总述合并过程查找过程算法实战实战1 总述 并查集&#xff08;Disjoint-set Union&#xff0c;简称并查集&#xff09;是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题&#xff0c;通常涉及到以下两种操作&#xff1a; 合并&#xff08;Uni…

Redis基础篇:初识Redis(认识NoSQL,单机安装Redis,配置Redis自启动,Redis客户端的基本使用)

目录 1.认识NoSQL2.认识Redis3.安装Redis1.单机安装Redis2.配置redis后台启动3.设置redis开机自启 4.Redis客户端1.Redis命令行客户端2.图形化桌面客户端 1.认识NoSQL NoSQL&#xff08;Not Only SQL&#xff09;数据库是一种非关系型数据库&#xff0c;它不使用传统的关系型数…

Android14 Handle机制

Handle是进程内部, 线程之间的通信机制. handle主要接受子线程发送的数据, 并用此数据配合主线程更新UI handle可以分发Message对象和Runnable对象到主线程中, 每个handle实例, 都会绑定到创建他的线程中, 它有两个作用,: (1) 安排消息在某个主线程中某个地方执行 (2) 安排…

解放生产力,AI加持你也能做这些事!

去年网上流行一个说法叫一人企业或超级IP。一个人就是一家公司&#xff0c;可以更加专注于自身核心技能。既能对工作拥有更大的自主性和控制力&#xff0c;又能舍弃了传统公司管理等繁琐的事务工作&#xff0c;可以全面释放自己的兴趣和潜力。 这个概念给笔者留下了比较深的印…

开源的python 游戏开发库介绍

本文将为您详细讲解开源的 Python 游戏开发库&#xff0c;以及它们的特点、区别和应用场景。Python 社区提供了多种游戏开发库&#xff0c;这些库可以帮助您在 Python 应用程序中实现游戏逻辑、图形渲染、声音处理等功能。 1. Pygame 特点 - 基于 Python 的游戏开发库。…

第3章 数据链路层(1)

3.1数据链路层的功能 加强物理层传输原始比特流的功能,将可能出差错的物理连接改成逻辑上无差错的数据链路[节点的逻辑通道] 3.1.1 为网络提供服务 (1).无确认的无连接服务 适合通信质量好的有线传输链路(实时通信或误码率较低的通信信道)【例如以太网】(2).有确认的无连接服务…

WIN32部分知识介绍

&#x1f308;前言&#xff1a;此篇博客是为下一篇的《贪吃蛇》的做的前戏工作&#xff0c;这篇会讲到贪吃蛇所用到的一些工具以及函数。 首先在讲WIN32的内容时我们想了解一下他的基本概念&#xff1a; Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外…

指数移动平均(EMA)

文章目录 前言EMA的定义在深度学习中的应用PyTorch代码实现yolov5中模型的EMA实现 参考 前言 在深度学习中&#xff0c;经常会使用EMA&#xff08;指数移动平均&#xff09;这个方法对模型的参数做平均&#xff0c;以求提高测试指标并增加模型鲁棒。实际上&#xff0c;_EMA可以…

全栈的自我修养 ———— css中常用的布局方法flex和grid

在项目里面有两种常用的主要布局:flex和grid布局&#xff08;b站布局&#xff09;&#xff0c;今天分享给大家这两种的常用的简单方法&#xff01; 一、flex布局1、原图2、中心对齐3、主轴末尾或者开始对其4、互相间隔 二、grid布局1、基本效果2、加间隔3、放大某一个元素 一、…

数据的加密方式及操作方法

目录 一 什么是加密 二 加密方法 对称加密&#xff08;如AES加密&#xff09; 非对称加密&#xff08;如RSA加密&#xff09; 散列&#xff08;如MD5加密&#xff09; 三 加密操作 1 MD5加密&#xff08;散列&#xff09; 2 AES加密&#xff08;对称加密&#xff09; …

HTMK5七天学会基础动画网页10(2)

制作立方体 学完前面的基础内容&#xff0c;制作立方体是个不错的练习方法&#xff0c;先看成品 再分析一下&#xff0c;六个面让每个面旋转平移就可以实现一个立方体&#xff0c;来看代码: <title> 制作立方体</title> <style> *{ margin: 0; padding: 0; …

如何搭建财务数据运营体系:基于财务五力模型的分析

在当今复杂多变的商业环境中,财务数据作为企业决策的重要参考依据,其运营体系的搭建显得尤为关键。一个健全、高效的财务数据运营体系不仅能够为企业提供准确的财务数据支持,还能帮助企业在激烈的市场竞争中保持领先地位。基于财务五力模型的分析,我们可以从收益力、安定力…

基于深度学习YOLOv8+Pyqt5的抽烟吸烟检测识别系统(源码+跑通说明文件)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;39抽烟 获取完整源码源文件4000张已标注的数据集配置说明文件 可有偿59yuan一对一远程操作跑通 效果展示 基于深度学YOLOv8PyQt5的抽烟吸烟检测识别系统&#xff08;完整源码跑通说明文件&#xff09; 各文件说明 模型评价…

Mybatis-Plus——07,性能分析插件

性能分析插件 一、导入插件二、SpringBoot中配置环境为dev或test环境三、运行测试————————创作不易&#xff0c;笔记不易&#xff0c;如觉不错&#xff0c;请三连&#xff0c;谢谢~~ MybatisPlus也提供了性能分析插件&#xff0c;如果超过这个时间就停止运行&#xff0…

常见3大web漏洞

常见3大web漏洞 XSS攻击 描述&#xff1a; 跨站脚本&#xff08;cross site script&#xff09;-简称XSS&#xff0c;常出现在web应用中的计算机安全漏桶、web应用中的主流攻击方式。 攻击原理&#xff1a; 攻击者利用网站未对用户提交数据进行转义处理或者过滤不足的缺点。 …

前端文件上传

文件上传方式 前端文件上传有两种方式&#xff0c;第一种通过二进制blob传输&#xff08;formData传输&#xff09;&#xff0c;第二种是通过base64传输 文件相关的对象 file对象其实是blob的子类 blob对象的第一个参数必须是一个数组&#xff0c;你可以把一个file对象放进去…