当前位置: 首页 > news >正文

教你学git

前言

git是一种用于多人合作写项目。详细说明如下

文章目录

  • 前言
    • 什么是版本控制?
    • 什么是 Git?
      • 它就属于人工版本控制器
      • 版本控制工具
      • 常见版本控制工具
    • 怎么工作的?
      • git 文件生命周期
      • 状态
      • 区域
    • 安装
    • 配置
      • -- global
      • 检查配置
    • 创建仓库
    • 工作流与基本操作
    • 查看工作区的文件状态
      • 如果显示乱码的解决方式
        • 显示乱码
        • 终端乱码
    • 添加工作区文件到暂存区
      • 创建版本
        • 提交备注
        • 修改默认编辑器
        • 单行备注
    • 查看提交日志
    • 修复提交
    • 删除
      • 撤销重置
        • 从暂存区中撤销到工作区
        • 该命令既可以用于回退版本
    • 比较
    • 分支
      • 查看分支
      • 创建分支
      • 切换分支
      • 分支合并
      • 删除分支
    • 合并记录
        • ~ 与 ^
        • rebase 操作
    • 合并冲突
    • 标签
      • 新建 tag
      • 查看 tag
    • 协同开发
      • github
    • SSH
        • 生成 SSH 秘钥
        • 添加代理
        • 添加 私钥
        • 在 github 上添加公钥
        • 测试
      • git 远程
        • 链接
        • 查看远程提交
        • 提交(同步)远程
        • 远程分支
        • 删除分支
    • 扩展:工作流 - git work flow
    • GUI 工具

首先要了解一下什么是版本控制

什么是版本控制?

版本控制是指对软件开发过程中各种程序代码、说明文档等文件的变更进行管理,它将追踪文件变化,记录文件的变更时间、变更内容、甚至变更执行人进行记录,同时对每一个阶段性变更(不仅仅只是一个文件的变化)添加版本编号,方便将来进行查阅特定阶段的变更信息,甚至是回滚

什么是 Git?

它就属于人工版本控制器

通过人工的复制行为来保存项目的不同阶段的内容,添加适当的一些描述文字加以区分

  • 繁琐、容易出错
  • 产生大量重复(冗余)数据

版本控制工具

通过程序完成上述人工版本控制行为

  • 方便且功能强大
  • 只记录不同版本之间变化的部分

常见版本控制工具

  • CVS
  • SVN
  • Git
  • ……

怎么工作的?

首先,我们得先了解两个重要概念

  • 状态
  • 区域

git 文件生命周期

在这里插入图片描述

状态

同时,git 又提供了三种(也可以说是四种)不同的记录状态

  • 已修改(modified)
  • 已暂存(staged)
  • 已提交(committed)

有一个特殊的状态

  • 未追踪(Untracked)

区域

git 提供了三个不同的工作区,用来存放不同的内容

  • 工作目录
  • 暂存区域
  • Git 仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkFxl9BU-1676979124415)(.\assets\areas.png)]

安装

https://git-scm.com/

配置

当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改

git config user.name "你的姓名"
git config user.email "你的邮箱"

– global

通过 --global 选项可以设置全局配置信息

git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"

检查配置

# 打印所有config
git config --list
# 打印指定config
git config user.name

创建仓库

进入希望纳入 git 版本控制的项目目录,使用 git init 初始化

git init

该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这个目录也是上面我们说的三个区域之一,这个目录也是 Git 保存数据记录的地方,非常重要,如非必要,不要轻易改动

工作流与基本操作

当一个项目被 Git 初始化以后,只是表示我们希望通过 Git 来管理当前的这个项目文件的不同时期版本记录,但是这个时候项目中已存在的文件,或者以后新增的文件都是没有进入版本控制管理的,它们是 未追踪(Untracked) 的状态

查看工作区的文件状态

git status

如果显示乱码的解决方式

显示乱码

git config --global core.quotepath false

终端乱码

菜单 -> 设置 -> 文本 -> 本地 / 编码

或修改配置文件

进入windoes的cmd 然后分别输入以下五行
git config --global core.quotepath false
git config --global gui.encoding utf-8
git config --global i18n.commit.encoding utf-8
git config --global i18n.logoutputencoding utf-8
set LESSCHARSET=utf-8

输入完成之后再执行命令

添加工作区文件到暂存区

git add

git add 1.txt
# 添加多个文件
git add 2.txt 3.txt
# 添加整个目录
git add ./a
# 添加多个目录
git add ./b ./c
# 添加所有文件
git add .

创建版本

git commit

将暂存区里的改动给提交到本地 git 仓库,也就是为这次工作(一般会把某个具有特定意义的工作作为一个版本,它可以是多个文件的变化)

  • 每次提交同时会生成一个 40 位的哈希值,作为该次提交版本的唯一 id

提交备注

每次提交都需要填写备注信息

git commit
# 会调用默认(或自定义)的文本编辑器

修改默认编辑器

git config core.editor notepad# 添加 vscode 编辑器 - mac
# 通过 vim 打开环境变量配置文件
vim ~/.bash_profile
# 添加环境变量
export PATH=/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin:$PATH
# 保存退出
source ~/.bash_profile
# 测试:在终端中直接通过命令 code 调用 vscode
git config --global core.editor "code --wait"

单行备注

git commit -m 备注信息

查看提交日志

git log

// 完整格式
git log
// 简要格式(单行)
git log --oneline

修复提交

git commit --amend

修复(替换上一次)提交,在不增加一个新的提交版本的情况下将新修改的代码追加到前一次的提交中

git commit --amend -m 提交

删除

git rm

# 从 git 仓库与工作区中删除指定文件
git rm 文件# 只删除 git 仓库中的文件
git rm --cached 文件# rm 以后,需要 commit 这次操作,否则 rm 将保留在暂存区
git commit -m 修正

撤销重置

git reset

从暂存区中撤销到工作区

// 从暂存区中撤销一个指定文件
git reset HEAD 文件名称
// 从暂存区中国年撤销所有文件
git reset HEAD .

该命令既可以用于回退版本

# 回退到指定的 commitID 版本
git reset --hard commitID

比较

# 比较 工作区和暂存区
git diff 文件 
# 比较 暂存区和仓库
git diff --cached [commitId] 文件
# 比较 工作区和仓库
git diff commitId filename
# 比较 仓库不同版本
git diff commitId1 commitId2

分支

我们的开发就像是游戏的任务,默认是在主线(master)上进行开发的。许多时候,还有各种支线任务,git 支持我们创建分支来进行项目开发

查看分支

git branch

创建分支

git branch 分支名称

切换分支

git checkout 分支名称
# 也可以使用 checkout -b 来新建分支
git checkout -b 分支名称

分支合并

# B 合并到 A,需要切换到 A 分支
git merge 被合并分支# 查看已经合并的分支
git branch --merged
# 查看未合并的分支
git branch --no-merged

删除分支

# 如果分支为未合并状态,则不允许删除
git branch -d 分支名称
# 强制删除
git branch -D 分支名称

合并记录

rebase

# 合并 HEAD 前两个祖先记录
git rebase -i HEAD~2

~ 与 ^

~ : 纵向

^ : 横向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3d94WqTi-1676979124417)(assets/path.png)]

rebase 操作

# p, pick = use commit => 使用
# r, reword = use commit, but edit the commit message => 使用,但重新编辑说明
# e, edit = use commit, but stop for amending => 使用
# s, squash = use commit, but meld into previous commit => 使用,但合并上一次
# f, fixup = like "squash", but discard this commit's log message => 就像 squash 那样,但会抛弃这个 Commit 的 Commit message
# x, exec = run command (the rest of the line) using shell => 执行脚本
# d, drop = remove commit => 移除
git rebase -i HEAD~3
# 弹出编辑器,根据需要的进行修改,然后保存
# 如果为 r,s 则会再次弹出编辑器,修改新的 commit message,修改之后保存

如果出现一些问题,可以通过 git rebase --edit-todogit rebase --continue 进行重新编辑保存

合并冲突

有的时候,不同的分支可能会对同一个文件内容和位置上进行操作,这样在合并的过程中就会产生冲突

  • 查看冲突文件
  • 修复冲突内容
  • 提交

标签

有的时候,我们希望给某一个特定的历史提交打上一些标签

新建 tag

git tag -a v1.0.0 HEAD/commitId

查看 tag

git tag

协同开发

以上所有的操作都是建立在本地的,如果我们希望进行团队协同开发,那么这个时候,我们就需要把 git 仓库信息与团队中的所有人进行共享

  • 分布式 - 中心化与去中心化

github

首先注册一个账号

使用 ssh 链接

SSH

https://help.github.com/cn/articles/connecting-to-github-with-ssh

https://help.github.com/cn/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

生成 SSH 秘钥

ssh-keygen -t rsa -C "zmouse@miaov.com"

添加代理

使用 ssh-add 代理,如果没有启动,可以手动启动

eval $(ssh-agent -s)

添加 私钥

ssh-add 私钥路径

在 github 上添加公钥

个人中心 -> 设置 -> ssh -> 添加

测试

ssh -T git@github.com

git 远程

链接

git remote add origin git@github.com:miaov-zmouse/kkb-test.git

查看远程提交

git remote -v

提交(同步)远程

同步本地仓库到远程

git push origin -u master
# -u 简化后续操作
git push origin master

远程分支

# 提交到远程(分支)
git push origin [本地分支名称]:[远程分支名称]# 远程先创建好分支然后拉取到本地
git checkout -b [本地分支名称] origin/[远程分支名称]# 拉取远程分支到本地
git pull origin [远程分支名称]:[本地分支名称]# 查看远程仓库
git remote show origin# 查看本地分支
git branch# 查看远程分支
git branch -r# 查看所有分支
git branch -a# 删除本地分支
git branch -d [本地分支名称]# 删除远程分支
git push origin --delete [远程分支名称]
# or
git push origin :[远程分支名称]# 设置默认提交分支
git branch --set-upstream-to=origin/[远程分支名称] [本地分支名称]

删除分支

git remote remove origin

扩展:工作流 - git work flow

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqWGKVF3-1676979124418)(assets/gitflow.png)]

GUI 工具

https://git-scm.com/download/gui/win

  • Sourcetree
  • other editor

总结 :
总结来说 git 分为俩种方式 一种是cmd 输入指令就行,还有一种就是在编译器里面下载插件 《Git History》 使用图形化工具。
git 完全可以自学。

相关文章:

教你学git

前言 git是一种用于多人合作写项目。详细说明如下 文章目录前言什么是版本控制?什么是 Git?它就属于人工版本控制器版本控制工具常见版本控制工具怎么工作的?git 文件生命周期状态区域安装配置-- global检查配置创建仓库工作流与基本操作查看…...

【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题

任务描述 错误出现出现过四五次,应该是诊断单元tf卡读写出问题导致下面这条告警一直高频写入到/var/log/下的syslog、kern.log、messages中 Nov 23 06:25:12 embest kernel: omap_hsmmc 48060000.mmc: [omap_hsmmc_pre_dma_transfer] invalid cookie: data->hos…...

【C++】多线程

多任务处理有两种形式,即:多进程和多线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行 文章目录1. 多线程介绍2. Windows多线程1. 多线程介绍 每一个进程(可执行程序)都有一个主线…...

0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)

文章目录4 插入4.1 序4.2 向单个2-结点插入新键4.3 向树底部的2-结点插入新键4.4 向一棵双键树(3-结点)中插入新键4.5 颜色调整4.6 根结点总是黑色4.7 向树底部的3-结点插入新键4.8 将红链接在树中向上传递4.9 实现5 删除5.1 删除最小键5.2 删除6 有序性…...

vue 生成二维码插件 vue-qr使用方法

一、安装 npm install vue-qr --save二、引入 import VueQr from vue-qrcomponents:{VueQr,},三、使用 <vue-qr:text"dyQrcode":size"170":logoSrc"logo":margin"6":logoScale"0.2"></vue-qr>四、属性说明 …...

网络工程课(二)

ensp配置vlan 一、配置计算机ip地址和子网掩码 二、配置交换机LSW1 system-view [Huawei]sysname SW1 [SW1]vlan batch 10 20 [SW1]interface Ethernet0/0/1 [SW1-Ethernet0/0/1]port link-type access 将接口设为access接口 [SW1-Ethernet0/0/1]port default vlan 10 [SW1-E…...

Pytorch并行计算(三): 梯度累加

梯度累加 梯度累加&#xff08;Gradient Accmulation&#xff09;是一种增大训练时batch size的技巧。当batch size在一张卡放不下时&#xff0c;可以将很大的batch size分解为一个个小的mini batch&#xff0c;分别计算每一个mini batch的梯度&#xff0c;然后将其累加起来优…...

蓝桥杯入门即劝退(十八)最小覆盖子串(滑动窗口解法)

欢迎关注点赞评论&#xff0c;共同学习&#xff0c;共同进步&#xff01; ------持续更新蓝桥杯入门系列算法实例-------- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章…...

Android一~

进程和线程的区别https://zhuanlan.zhihu.com/p/60375108https://zhuanlan.zhihu.com/p/138689342线程池的用法和原理tcp三次握手和四次挥手、tcp基础http请求报文格式二叉树中序遍历&#xff08;算法&#xff09;activity启动模式OKhttp源码讲解Java修饰符Java线程同步的方法s…...

一月券商金工精选

✦研报目录✦ ✦简述✦ 按发布时间排序 国盛证券 “薪火”量化分析系列研究&#xff08;二&#xff09;-票据逾期数据中的选股信息 发布日期&#xff1a;2023-01-04 关键词&#xff1a;股票、票据、票据预期 主要内容&#xff1a;本文深入探讨了“票据持续逾期名单”这一…...

UML中常见的9种图

UML是Unified Model Language的缩写&#xff0c;中文是统一建模语言&#xff0c;是由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明&#xff0c;展示&#xff0c;构建和记录软件系统的产出。通过使用UML使得在软件开发之前&#xff0c; 对整个软件设计有更好的…...

使用SpringBoot实现无限级评论回复功能

评论功能已经成为APP和网站开发中的必备功能。本文采用springbootmybatis-plus框架,通过代码主要介绍评论功能的数据库设计和接口数据返回。我们返回的格式可以分三种方案,第一种方案是先返回评论,再根据评论id返回回复信息,第二种方案是将评论回复直接封装成一个类似于树的数据…...

Kafka 介绍和使用

文章目录前言1、Kafka 系统架构1.1、Producer 生产者1.2、Consumer 消费者1.3、Consumer Group 消费者群组1.4、Topic 主题1.5、Partition 分区1.6、Log 日志存储1.7、Broker 服务器1.8、Offset 偏移量1.9、Replication 副本1.10、Zookeeper2、Kafka 环境搭建2.1、下载 Kafka2.…...

[学习笔记]Rocket.Chat业务数据备份

Rocket.Chat 的业务数据主要存储于mongodb数据库的rocketchat库中&#xff0c;聊天中通过发送文件功能产生的文件储存于/app/uploads中&#xff08;文件方式设置为"FileSystem"&#xff09;&#xff0c;因此在对Rocket.Chat做数据移动或备份主要分为两步&#xff0c;…...

【ZOJ 1090】The Circumference of the Circle 题解(海伦公式+正弦定理推论)

计算圆的周长似乎是一项简单的任务——只要你知道它的直径。但如果你没有呢&#xff1f; 我们给出了平面中三个非共线点的笛卡尔坐标。 您的工作是计算与所有三个点相交的唯一圆的周长。 输入规范 输入文件将包含一个或多个测试用例。每个测试用例由一条包含六个实数x1、y1、x…...

【go】slice原理

slice包含3个部分&#xff1a; 1.内存的起始位置 2.切片的大小(已经存放的元素数量) 3.容量(可以存放的元素数量) 使用make初始化切片会开辟底层内存&#xff0c;并初始化元素值为默认值&#xff0c;如数字为0&#xff0c;字符串为空 使用New初始化切片不会开辟底层数组&…...

【数据库】MySQL概念知识语法-基础篇(DQL),真的很详细,一篇文章你就会了

目录通用语法及分类DQL&#xff08;数据查询语言&#xff09;基础查询条件查询聚合查询&#xff08;聚合函数&#xff09;分组查询排序查询分页查询内连接查询外连接查询自连接查询联合查询子查询列子查询行子查询表子查询总结通用语法及分类 ● DDL: 数据定义语言&#xff0c…...

博客界的至高神:属于自己的WordPress网站,你值得拥有!

【如果暂时没时间安装&#xff0c;可以直接跳转到最后先看展示效果】 很多朋友都想有一个对外展示的窗口&#xff0c;在那里放一些个人的作品或者其他想对外分享的东西。大部分人选择了在微博、公众号等平台&#xff0c;毕竟这些平台流量大&#xff0c;我们可以很轻易地把自己…...

操作系统(day13)-- 虚拟内存;页面分配策略

虚拟内存管理 虚拟内存的基本概念 传统存储管理方式的特征、缺点 一次性&#xff1a; 作业必须一次性全部装入内存后才能开始运行。驻留性&#xff1a;作业一旦被装入内存&#xff0c;就会一直驻留在内存中&#xff0c;直至作业运行结束。事实上&#xff0c;在一个时间段内&…...

SQL零基础入门学习(四)

SQL零基础入门学习&#xff08;三&#xff09; SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新记录。 SQL INSERT INTO 语法 INSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名&#xff0c;只需提供被插入的值即可&#xff1a; INSERT …...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...