《三》Git 中的本地仓库

news2024/11/25 0:25:23

初始化本地 Git 仓库:

通过 git init 初始化,可以把当前目录变成了 Git 管理的本地仓库。目前仅仅是做了一个初始化仓库的操作,项目里的文件还没有被跟踪。

在当前目录下会出现一个名为 .git 的目录,这些文件是 Git 仓库的核心。
如果没有看到 .git 目录,那是因为这个目录默认是隐藏的,用 ls -ah 命令就可以看见。
在这里插入图片描述

  1. hooks:包含客户端或服务端的钩子脚本。
  2. info:包含一个全局性排除文件。
  3. logs:保存日志信息。
  4. objects:存储所有数据内容。

可以通过 find .git/objects/ -type f 可以查看 objects 目录下的文件。

  1. refs:存储指向数据的提交对象的指针(分支)。
  2. config:包含项目特有的配置选项。
  3. description:用来显示对仓库的描述信息。
  4. HEAD:指示目前被检出的分支。
  5. index:保存暂存区信息。

可以通过 git ls-files -s 可以查看暂存区的内容。

Git 区域:

在这里插入图片描述

  1. 工作区:就是在电脑里能看到的项目目录。用来写代码。
  2. 版本库:.git 不算工作区,而是 Git 的版本库。用来实实在在存储代码及其历史版本。
  3. 暂存区:存放在 .git 目录下的 Index 文件。用来临时存储代码。

本地仓库的操作命令:

创建本地仓库:
  1. 创建一个空文件夹。
  2. 通过 git init 命令把这个目录变成 Git 可以管理的本地仓库。
添加文件到本地仓库:

可反复多次使用 git add 添加多个文件,通过git commit 一次提交。

  1. 在当前目录下新建一个文档。

  2. 使用 git add xxx.xx 命令,把工作区文件的新建/修改添加到暂存区。

    查看 .git/index文件 和 .git/objects 下的文件可以发现都有了一条记录。这说明:git add 是先将工作区的修改做成 git 对象放到版本库,然后再从版本库中拿出来放到暂存区中。
    在这里插入图片描述

    在版本库中只能跟踪和管理文本文件,比如 txt 文件、js 文件、php 文件、java 文件等,所有的程序代码都可以的。但是像视频、图片等这些二进制文件,虽然能由 git 管理,但是只能记录大小,无法跟踪具体修改了什么。

  3. 使用 git commit -m "xxxxx" 命令,将暂存区的内容提交到本地仓库中。

    -m 后面输入的是本次提交的说明。

查看状态:

git status命令展示的是工作区和暂存区的状态。

  1. git init 初始化之后,git status 查看一下状态,终端显示如下信息:
    On branch master // 当前为 master 分支
    
    No commits yet // 本地仓库还没有任何提交
    
    nothing to commit (create/copy files and use "git add" to track) // 暂存区没有什么可提交的
    
  2. 新建 index.txt 文件,然后 git status 查看一下状态,终端显示如下信息:
    On branch master  // 当前为 master 分支
    
    No commits yet // 本地仓库还没有任何提交
    
    Untracked files: // 工作区中还没有被跟踪的文件,也就是还没有 add 的文件,add 之后将会进入暂存区
      (use "git add <file>..." to include in what will be committed)
            index.txt
    
    nothing added to commit but untracked files present (use "git add" to track) // 暂存区没有任何提交,但是工作区存在没有被跟踪的文件
    
  3. git add index.txt 将 index.txt add 到暂存区,然后 git status 查看一下状态,终端显示如下信息:
    On branch master  // 当前为 master 分支
    
    No commits yet // 本地仓库还没有任何提交
    
    Changes to be committed: // 暂存区将要被提交的修改,也就是已经从工作区 add 到暂存区中的文件,commit 之后将进入本地仓库
      (use "git rm --cached <file>..." to unstage)  // 使用 ”git rm --cached <file>“ 将从暂存区删除并取消跟踪文件,恢复到 add 之前的状态
            new file:   index.txt
    
  4. git commit index.txt -m 'first commt: index.txt'index.txt 提交到本地仓库,然后 git status 查看一下状态,终端显示如下信息:
    On branch master // 当前为 master 分支
    nothing to commit, working tree clean  // 暂存区没有什么可提交的,工作区的树也是干净的
    
  5. 修改 index.txt 文件的内容,然后 git status 查看一下状态,终端显示如下信息:
    On branch master // 当前为 master 分支
    Changes not staged for commit: // 工作区有还没暂存的修改
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory) // 可以使用  "git restore <file>..." 丢弃在工作区的修改
            modified:   index.txt
    
    no changes added to commit (use "git add" and/or "git commit -a") // 暂存区没有被添加的修改,也就是这个文件在工作区、暂存区都存在,在工作区进行了一些新的修改,但是这部分修改还没 add 到暂存区
    
版本的前进与后退:
  1. 在上面 git status 查看状态的操作的基础上,将 index.txt 修改的内容也提交到本地仓库。
  2. 执行 git log 查看一下历史记录, 终端显示如下信息:

    版本回退后,git log 看不到版本回退之后的提交记录,git relog 可以看到所有的版本提交记录。

    commit 7d32b404e1c71fd4ed66a4e22d70b265bee9d307 (HEAD -> master) // 7d32b404e1c71fd4ed66a4e22d70b265bee9d307 哈希值为当次提交的索引
    Author: test <test@163.com>
    Date:   Thu Sep 30 16:22:22 2021 +0800
    
        second commit:idex.txt
    
    commit bbeac607be274343dc74099887b9cee40e50d3a3
    Author: test <test@163.com>
    Date:   Thu Sep 30 11:13:15 2021 +0800
    BAN
        first commit:index.txt
    
    
    // 或者使用 git log --pretty=oneline,来让每一条日志只显示一行,更加简洁
    7d32b404e1c71fd4ed66a4e22d70b265bee9d307 (HEAD -> master) second commit:idex.txt
    bbeac607be274343dc74099887b9cee40e50d3a3 first commit:index.txt
    
    // 或者使用 git log --oneline,不仅可以让每一条日志只显示一行,而且缩短了哈希值,更加简洁
    7d32b40 (HEAD -> master) second commit:idex.txt
    bbeac60 first commit:index.txt
    
    // 或者使用 git reflog
    7d32b40 (HEAD -> master) HEAD@{0}: commit: second commit:idex.txt
    bbeac60 HEAD@{1}: commit (initial): first commit:index.txt  //  HEAD@{1} 表示移动到当前版本需要1步
    
  3. Git 在管理历史记录的时候,有一个指针,指针的名字就叫 HEAD,版本的前进或后退就是在移动 HEAD。

    git reset 命令的三个参数:

    1. --soft:仅仅在本地库移动 HEAD 指针。
    2. --mixed:不仅在本地库移动 HEAD 指针;而且会重置暂存区。
    3. --hard:不仅在本地库移动 HEAD 指针;而且会重置暂存区,还会重置工作区。
    // 1. 基于索引去操作(推荐):git reset --hard bbeac60
    HEAD is now at bbeac60 first commit:index.txt
    // 此时,再 git reflog 查看一下历史记录:
    bbeac60 (HEAD -> master) HEAD@{0}: reset: moving to bbeac60
    7d32b40 HEAD@{1}: commit: second commit:idex.txt
    bbeac60 (HEAD -> master) HEAD@{2}: commit (initial): first commit:index.txt
    
    // 2. 使用 ^ 符号:git reset --hard HEAD^(需要后退几步就写几个 ^ 符号。只能后退不能前进)
    // 3. 使用 ~ 符号:git reset --hard HEAD~1(需要后退几步就写几。只能后退不能前进)
    
比较文件:

git diff 【文件名】:比较的是此文件工作区和暂存区的区别。不带文件名比较的是所有文件。
git diff 【本地仓库中的某个历史版本】 【文件名】:比较的是此文件工作区与本地仓库中某个历史版本的区别。不带文件名比较的是所有文件。

  1. 新建 add.txt 文件并输入一些内容,执行 git add add.txt
  2. 修改 add.txt 文件的内容,然后执行 git diff index.txt, 终端显示如下信息:

    Git 是以行为单位来管理文件的。

    diff --git a/add.txt b/add.txt
    index a8500fc..b544c22 100644
    --- a/add.txt
    +++ b/add.txt
    @@ -1,3 +1,3 @@
     qqq
    -www // 减号代表删除的行
    +wwwwww // 加号代表增加的行
     eee
    
本地储藏:

git stash:会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前的工作目录。

想删掉文件又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交,这时就可以考虑 git stash

  1. 实际应用中推荐给每个 stash 加一个 message,用于记录版本,使用 git stash save "xxx" 取代 git stash 命令。
  2. 可以通过 git stash pop 命令恢复之前储藏的工作目录。

分支:

在版本控制过程中,使用多条线同时推进多个任务,这就是分支。

使用分支的好处:

  1. 可以同时并行推进多个功能的开发,提供开发效率。
  2. 各个分支之间互不影响,即使某个分支开发失败,也不会其他任何分支有影响。

请添加图片描述

Git 分支管理的本质就是创建和移动指针,创建分支其实就是创建一个新的指针,切换分支其实就是移动指针。

SVN 中创建分支是将目录和文件全部都复制一套出来。

版本库初始化之后,默认会有一条 master 主分支,HEAD 指向 master 分支;如果新建一个 testing 分支,其实就是新建一个指针指向 f30ad 这个版本。
请添加图片描述

查看分支:

使用 git branch 查看分支。

* master // 前面的 * 号表示当前正在这个分支上
创建分支:

使用 git branch hot_fix 创建 hot_fix 分支,然后使用 git branch 查看一下分支。

  hot_fix
* master // 前面的 * 号表示当前正在这个分支上
切换分支:

使用 git checkout hot_fix 切换到 hot_fix 分支上,然后使用 git branch 查看一下分支。

* hot_fix
  master
  1. 如果在 master 分支上修改了 index.txt 文件的内容,但是只在工作区做了修改,并没有 add 到暂存区和提交到本地仓库中,那么如果切换到 hot_fix 分支,index.txt 修改的内容也将被带过去。

修改的内容在哪个分支上提交,将会归属于哪个分支,另一个分支就不会再显示这部分内容了。

  1. 如果在 master 分支上修改了 index.txt 文件的内容,但是只在工作区做了修改和 add 到了暂存区,并没有提交到本地仓库,那么如果想要切换到 hot_fix 分支将会被 Git 阻止。
创建+切换分支:

可以使用 git checkout -b 【分支名】 直接创建并且切换分支。

删除分支:

首先当前所在的分支不能是想要删除的分支,然后使用 git branch -d 【分支名】 即可删除。

合并分支:
  1. 当前正在 hot_fix 分支上,修改 index.txt 文件的内容并提交到本地仓库。
  2. 使用 git checkout master 切换到 master 分支上,然后使用 git merge hot_fix 将 hot_fix 合并到 master 分支上。
    Updating 373446c..b4f6025
    Fast-forward  // 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单地将指针向前推进,这就叫做快进(fast-forward)
     index.txt | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
解决冲突:

如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,那么对这两个分支进行合并时就会产生冲突。

  1. 当前在 master 分支上,对 index.txt 文件的第三行进行修改并提交到本地仓库。
  2. 使用 git checkout hot_fix 切换到 hot_fix 分支上,也对 index.txt 文件的第三行进行修改并提交到本次仓库。
  3. 此时使用 git merge master 将 master 分支合并到 hot_fix 分支上,会出现冲突,终端中显示如下:
    Auto-merging index.txt
    CONFLICT (content): Merge conflict in index.txt
    Automatic merge failed; fix conflicts and then commit the result.
    
    以 VSCode 为例,在 index.txt 文件中显示如下:
    在这里插入图片描述
    删除特殊符号、留下想要的内容来解决冲突。
  4. 此时使用 git status 来查看一下状态:
    On branch hot_fix
    You have unmerged paths.
      (fix conflicts and run "git commit")
      (use "git merge --abort" to abort the merge)
    
    Unmerged paths:
      (use "git add <file>..." to mark resolution) // 使用 git add 来标记冲突的解决
            both modified:   index.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
  5. 使用 git add index.txt 来标记冲突的解决,再次使用 git status 来查看一下状态:
    On branch hot_fix
    All conflicts fixed but you are still merging.
      (use "git commit" to conclude merge) // 使用 git commit 来结束合并
    
    Changes to be committed:
            modified:   index.txt
    
  6. 使用 git commit -m 'resolve conflict 来结束合并并提交。

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

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

相关文章

每天一个面试题之==和equals的区别是什么?

&#xff1d;&#xff1d;和equals的区别是什么&#xff1f; ""是一个关系运算符&#xff0c;关系运算符可以用来进行数据和数据之间的比较&#xff0c;而在java中数据类型大致可以分为两大类分别是基本数据类型和引用数据类型。 基本数据类型包含 byte&#xff0c…

React学习笔记八-受控与非受控组件

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第八篇&#xff0c;主要介绍非受控组件与受控组件。 目录 1.非受控组件 1.1表单提交案例 1.2案例的总结 2.受控组件 2.1受控组件案例 2.1受控案例总结 1.非受控组件 1.1表单提…

基于LLMs的多模态大模型(Flamingo, BLIP-2,KOSMOS-1,ScienceQA)

前一篇博客已经整理了不训练视觉模型的文章们&#xff1a; 基于LLMs的多模态大模型&#xff08;Visual ChatGPT&#xff0c;PICa&#xff0c;MM-REACT&#xff0c;MAGIC&#xff09; 本篇文章将介绍一些需要训练视觉编码器来适配多模态大模型的工作们&#xff0c;这也是目前最…

QT桌面项目(状态栏和导航栏设置)

文章目录 前言一、状态栏二、导航栏三、同时添加状态栏和导航栏总结 前言 为了和我们这个项目做的更加真实&#xff0c;这里为我们的项目添加上状态栏和导航栏让他变成更加接近手机的桌面效果。 一、状态栏 这个状态栏就是显示时间和wifi状态&#xff0c;电池电量的&#xf…

9秒被骗132万元,AI换脸骗术,如何防范?

5月22日&#xff0c;安徽安庆的何先生接到熟人视频电话&#xff0c;让他帮忙转一笔账&#xff0c;但在9秒之后&#xff0c;对方却以“在开会”为由&#xff0c;迅速挂断了电话&#xff0c;还称“微信和电话不能说&#xff0c;加一下QQ”。“因为打了视频电话&#xff0c;又是熟…

数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)

目录 邻接矩阵 图节点的结构 创建并初始化 插入边 完整的图的建立 邻接表 图节点的结构 创建并初始化 插入边 完整的图的建立 邻接矩阵 图节点的结构 #include <stdio.h> #include <stdlib.h>#define MaxVertexNum 100 // 最大顶点数typedef int Wei…

Maven介绍与安装和配置

目录 Maven 简介 约定优于配置 Maven 特点 Maven 安装与配置 Maven 下载 配置 Maven 环境变量 Maven 简介 Maven 是一款基于 Java 平台的项目管理和整合工具&#xff0c;它将项目的开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;。开发人员只需要做一…

C语言结构体

C语言结构体 前言1. 结构体的声明1.1 结构体的基础知识1.2 结构体声明1.3 结构体成员的类型1.4 结构体变量的定义和初始化 2. 结构体成员的访问2.1 结构体变量访问成员2.2 结构体指针访问指针变量的成员 3. 结构体传参4. 结尾 前言 C语言结构体是一种自定义数据类型&#xff0…

vite-plugin-pwa配置详解

vite-plugin-pwa配置详解 前提&#xff1a;前端域名和后端服务域名相同时&#xff0c;用window.open新开页面下载或者导出文件&#xff0c;项目中导出和下载功能失效&#xff0c;原因是&#xff0c;域名相同走缓存 实现service worker离线缓存以前需要自己编写sw.js文件内容&…

基于SpringBoot+Vue的闲一品交易平台设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

MT4电脑版交易软件使用技巧有哪些?

MT4交易软件作为连接券商平台与投资者之间的纽带&#xff0c;不仅是外汇金融机构的首选交易平台&#xff0c;也因其显著的优势成为了外汇投资者进行网上交易的重要平台。而MT4交易软件又分为电脑版和手机版&#xff0c;因为大多数投资者进行外汇投资时使用的是MT4电脑版软件&am…

Gradio的web界面演示与交互机器学习模型,接口自动刷新或连续刷新数据流《5》

通过在接口中设置liveTrue&#xff0c;可以使接口自动刷新。现在&#xff0c;一旦用户输入发生变化&#xff0c;界面就会重新计算。依然使用计算器的示例&#xff1a; 实时接口 import gradio as grdef calculator(num1, operation, num2):if operation "add":ret…

浏览器原理+跨域+解决方案

原网址&#xff1a;浏览器部分笔记_浏览器不同窗口cookie共享吗_JackieChan_的博客-CSDN博客 一、浏览器存储对象 1.cookie cookie是一种纯文本文件&#xff0c;大小只有4kb&#xff0c;每次发送非跨域html请求时都会自动携带。特性如下&#xff1a; cookie一旦创建&#xff…

华为开源自研AI框架昇思MindSpore应用案例:Pix2Pix实现图像转换

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 在实际应用场景中&#xff0c;由于训练数据集不足&#xff0c;所以很少有人会从头开始训练整个网络。普遍的做法是&#xff0c;在一个非常大的基础数据集上训练得到一个预训练模型&#xff0c;然后使用该模…

Java程序设计入门教程--主函数

情形 在Java中&#xff0c;主函数就是主方法&#xff0c;即main()方法。它是Java应用程序的入口方法&#xff0c;也就是说&#xff0c;程序在运行的时候&#xff0c;第一个执行的方法就是main()方法&#xff0c;这个方法和其他的方法有很大的不同&#xff0c;比如方法的名字必…

Python100天:01.初识python

❝ 本教程计划通过100天的时间&#xff0c;每天分享一篇关于python的知识点&#xff0c;与大家一起学习python这门编程语言。 ❞ Python 对初学者来说是一门很棒的语言&#xff1a; 容易学 有一个积极的支持社区 在网络开发、游戏、数据科学方面提供多种机会。 Python的应用领域…

PMP课堂模拟题目及解析(第13期)

121. 项目经理、团队成员以及若干干系人共同参与一次风险研讨会。已经根据风险管理计划生成并提供一份风险报告。若要为各个项目风险进行优先级排序&#xff0c;现在必须执行哪一项分析&#xff1f; A. 定量风险分析 B. 根本原因分析 C. 偏差分析 D. 定性风险分析 122. …

Yarn资源调度详解

第1章 Yarn资源调度器 思考&#xff1a; 1&#xff09;如何管理集群资源&#xff1f; 2&#xff09;如何给任务合理分配资源&#xff1f; Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapRe…

什么是产品操作手册?企业该怎样制作产品操作手册页面?

产品操作手册是一种用于指导用户如何正确使用和维护产品的文档。它通常包括产品的基本信息、操作步骤、安全警告、故障排除、维护方法等内容。产品操作手册对于企业来说非常重要&#xff0c;它不仅可以提高用户的使用体验&#xff0c;还可以为企业节省售后服务成本。本文将介绍…

cython编译加密python源码

场景 python的解释特性是将py编译为独有的二进制编码pyc 文件&#xff0c;然后对pyc中的指令进行解释执行&#xff0c;但是 pyc的反编译却非常简单&#xff0c;可直接反编译为源码&#xff0c;当需要将产品发布到外部环境的时候&#xff0c;源码的保护尤为重要。 一、Cpython介…