Git--使用教程

Git的框架讲解

Git 是一个分布式版本控制系统,其架构设计旨在高效地管理代码版本,支持分布式协作,并确保数据的完整性和安全性。

Git 的核心组件:

  1. 工作区(Working Directory): 工作区是你在本地计算机上实际操作的目录,包含了项目的所有文件。 在工作区中,你可以编辑、删除或添加文件。
  2. 暂存区(Staging Area): 暂存区是一个中间区域,用于暂时保存你对文件所做的修改,等待提交到本地仓库。 当使用 git add 命令时,修改的文件会被添加到暂存区。
  3. 本地仓库(Local Repository): 本地仓库是一个隐藏的 .git 目录,存储了项目的版本历史和配置信息。 在本地仓库中,Git 会记录每次提交的快照,以及分支、标签等信息。
  4. 远程仓库(Remote Repository): 远程仓库是托管在服务器上的 Git 仓库,用于团队协作和代码共享。 常见的远程仓库托管服务包括 GitHub、GitLab 和 Bitbucket 等。

Git 的工作流程:

  1. 克隆仓库:git clone 命令从远程仓库复制一份完整的项目到本地,包括所有的版本历史。
  2. 在工作区修改文件: 本地工作区中编辑、添加或删除文件。
  3. 将修改添加到暂存区:git add 命令将修改的文件添加到暂存区,准备提交。
  4. 提交到本地仓库:git commit 命令将暂存区的修改提交到本地仓库,形成一个新的版本快照。
  5. 推送到远程仓库:git push 命令将本地仓库的提交推送到远程仓库,供团队成员共享。
  6. 拉取远程仓库的修改:git pull 命令从远程仓库拉取最新的修改,并与本地仓库合并。

Git 的数据存储结构:

  • 对象(Objects):
    • Git 使用对象来存储数据,主要包括:
      • 提交对象(Commit): 目录项目的历史版本信息。
      • 树对象(Tree): 展示目录结构。
      • 文件对象(Blob): 展示文件内容。
      • 标签对象(Tag): 用于标记特定的提交点。
  • 有向无环图(DAG): Git 使用有向无环图来表示提交历史,每个提交对象指向其父提交对象,形成一个有向无环图结构。
  • 分支(Branches): 分支是指向提交对象的指针,允许在不同的开发线中并行工作。 默认的主分支通常命名为 mastermain

Git 的优势:

  • 分布式架构:
    • 每个开发者的本地仓库都是完整的版本库,支持离线工作和分布式协作。
  • 高效的分支和合并:
    • Git 的分支操作非常轻量级,创建和切换分支速度快,合并操作也非常高效。
  • 数据完整性:
    • Git 使用 SHA-1 哈希算法来标识对象,确保数据的完整性和一致性。
  • 灵活的工作流:
    • Git 支持多种工作流,如集中式工作流、功能分支工作流、GitFlow 工作流等,满足不同团队的需求。

过以上架构设计,Git 实现了高效、灵活且安全的版本控制,广泛应用于软件开发和协作中。


Git的使用

一、基础配置

1. 首次使用 Git 的配置
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global core.editor "vim"  # 设置默认编辑器
git config --global credential.helper store #保存
git config --list  # 查看所有配置
2. 生成 SSH 密钥(用于远程仓库认证)
ssh-keygen -t ed25519 -C "your_email@example.com"  # 生成密钥
cat ~/.ssh/id_ed25519.pub  # 复制公钥到 GitHub/GitLab

详情可以查看这篇博文:git --SSH配置(免秘钥登录)


二、本地仓库操作

本地仓库由工作区,暂存区,本地仓库三个部分组成
在这里插入图片描述

1. 创建仓库
git init              # 初始化新仓库
git clone <url>       # 克隆远程仓库(自动创建 origin 远程)
2. 文件状态管理
查看状态
git status            # 查看工作区/暂存区状态
比较差异
git diff                             #1.查看更新的详细信息命令#2.比较工作区和暂存区的差异
git diff HEAD                        #比较工作区和版本库之间的差异
git diff cached                      #比较暂存区和版本库之间的差异
git diff  ID1 ID2                    #比较两个特定版本之间的差异
git diff HEAD~3 HEAD file3.txt       #查看指定文件的差异内容
添加文件到暂存区
git add <file>        # 添加单个文件到暂存区
git add .             # 添加所有修改到暂存区
删除文件
rm <file>                #删除工作区文件 
git add <file>           #将删除后的工作区与暂存区同步git rm <file>            #删除暂存和工作区文件
git rm --cached <file>   #将版本库中的文件删除
git reset <file>         # 从暂存区移除文件(保留工作区修改)
git restore <file>       # 丢弃工作区修改(Git 2.23+)
git checkout             #撤销工作区的修改

在这里插入图片描述

忽略文件 (对已经添加到版本库中的文件没用) .gitignore
(1)忽略某些文件类型

如果你想忽略某些特定类型的文件,比如编译生成的二进制文件或者日志文件,可以使用通配符 *

示例:
  • 忽略所有 .log 文件:
    *.log
    
  • 忽略所有 .class 文件(Java 编译生成的文件):
    *.class
    
  • 忽略所有 .o.a 文件(C/C++ 编译生成的文件):
    *.o
    *.a
    
(2) 忽略目录

你可以通过指定目录名来忽略整个目录。

示例:
  • 忽略 build/ 目录(常见于构建后的产物):

    build/
    
  • 忽略 install/ 目录(通常用于存放编译生成的可执行的文件):

    install/
    
(3) 忽略特定文件

你可以通过指定文件的相对路径来忽略特定的文件。

示例:
  • 忽略 secret.txt 文件:

    secret.txt
    
  • 忽略 config/config.json 文件:

    config/config.json
    
(4) 忽略 IDE 和编辑器配置文件

很多 IDE 和编辑器(如 VSCode、IntelliJ、Sublime Text)会生成一些配置文件,这些文件通常不需要提交到 Git 仓库中。

示例:
  • 忽略 VSCode 配置文件:
    .vscode/
    
3. 提交更改到版本库
git commit -m "提交描述"          # 提交暂存区内容
git commit -am "提交描述"         # 自动添加修改文件并提交(不包含新文件)
git commit --amend               # 修改最近一次提交(可修改描述或追加文件)

三、分支管理

1. 基础分支操作
git branch              # 查看本地分支
git branch <分支名>      # 创建新分支
git switch <分支名>      #切换分支
git checkout <分支名>    # 切换分支,恢复文件(当分支名与文件名相同时存在歧义)
git checkout -b <分支名> # 创建并切换分支(常用)
git branch -d <分支名>   # 删除已合并的分支
git branch -D <分支名>   # 强制删除未合并分支
git branch -m <name>    #修改当前分支名
2. 合并与冲突解决
  • 假设想要合并A分支和B分支,要切换到一个分支,此处举例切换到A,然后用git merge B来把B合并到A分支中
  • 如果分支中对同一处代码进行了修改,git不知道应该以谁为准的时候就会出现冲突。这时候要手动解决冲突。
git merge <分支名>       # 合并指定分支到当前分支
git merge --abort       # 终止合并(冲突时)
git rebase <分支名>      # 变基操作(线性历史)
git rebase --abort      # 终止变基

解决合并冲突流程

  1. 用编辑器打开冲突文件(搜索 <<<<<<<
  2. 手动修改保留需要的代码
  3. 删除冲突标记
  4. 执行 git add <冲突文件>
  5. 完成合并:git commit

四、远程仓库操作

1. 关联远程仓库
git remote add origin <url>     # 添加远程仓库(命名为 origin)
git remote -v                   # 查看远程仓库地址
git remote remove origin        # 删除远程仓库
2. 推送与拉取

注意,当本地仓库分支名与远程仓库分支名相同时,才会更新到远程仓库的同名分支下,如果不同名,会自动创建新的分支来提交。

git push -u <远程仓库名> <本地仓库分支名>         # 首次推送并设置上游分支
git push                        # 当本地仓库关联多个仓库的时候,要加上推送到的仓库名
git pull                        # 拉取并合并(= git fetch + git merge)
git fetch                       # 仅获取远程更新(不自动合并)
git push -u origin main       #-u 选项的作用是将指定的分支与远程仓库中的某个分支进行关联#-f强制推送
3. 远程分支管理
git push origin --delete <分支名>  # 删除远程分支
git checkout -b <本地分支> origin/<远程分支>  # 基于远程分支创建本地分支

五、撤销与历史修改

1. 撤销工作区修改
git checkout HEAD -- <file>   # 用最新提交覆盖工作区文件
git restore --staged <file>   # 取消暂存(Git 2.23+)
2. 重置提交历史
git reset --soft HEAD~1   # 撤销提交但保留修改在暂存区、工作区
git reset --mixed HEAD~1  # 撤销提交并取消暂存(默认),工作区保留
git reset --hard HEAD~1   # 彻底丢弃最近一次提交的所有修改(工作区暂存区全部丢弃)

在这里插入图片描述

3. 回滚提交
git revert <commit-hash>  # 创建反向提交来撤销指定提交

六、标签管理

git tag                     # 查看所有标签
git tag v1.0.0              # 创建轻量标签
git tag -a v1.0.0 -m "描述"  # 创建附注标签
git push origin --tags      # 推送所有标签到远程
git checkout v1.0.0         # 切换到标签版本

七、高级功能

1. 储藏(Stash)临时修改
git stash              # 储藏当前工作区修改
git stash list         # 查看储藏列表
git stash apply        # 恢复最新储藏(保留储藏记录)
git stash pop          # 恢复并删除最新储藏
git stash drop stash@{0} # 删除指定储藏
2. 查看历史
git log --oneline      # 简洁历史记录
git log -p             # 显示具体修改内容
git log --graph        # 图形化分支历史
git blame <file>       # 查看文件每行修改者
3. 子模块(Submodule)
git submodule add <url> <path>  # 添加子模块
git submodule update --init     # 初始化子模块

八、常用工作流示例

1. 日常开发流程
git checkout -b feature/new-login  # 创建特性分支
# 修改代码...
git add .
git commit -m "实现登录功能"
git push origin feature/new-login
# 在 Git 平台创建 Pull Request
2. 紧急修复线上 Bug
git checkout main
git pull
git checkout -b hotfix/header-bug
# 修复代码...
git commit -m "修复页头布局问题"
git checkout main
git merge hotfix/header-bug
git push

注意事项

  1. 慎用 --force:强制推送可能覆盖他人工作
  2. 重要操作前备份:复杂操作前先 git stash 或创建临时分支
  3. 保持提交原子性:每个提交只做一件事,描述清晰
  4. 定期清理分支:删除已合并的废弃分支

遇到问题时,多用 git status 查看状态,善用 git reflog 找回误删内容。


我误以为命运掌握在别人手里,而没有意识到我可以为自己的人生执笔。 —塞巴斯蒂安·巴里

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

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

相关文章

Deepseek 接入Word处理对话框(隐藏密钥)

硅基流动邀请码&#xff1a;1zNe93Cp 邀请链接&#xff1a;网页链接 亲测deepseek接入word&#xff0c;自由调用对话&#xff0c;看截图有兴趣的复用代码&#xff08;当然也可以自己向deepseek提问&#xff0c;帮助你完成接入&#xff0c;但是提问逻辑不一样给出的答案是千差万…

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…

流浪地球发动机启动问题解析与实现

目录 引言问题分析 2.1 发动机启动状态管理 2.2 手动启动与关联启动逻辑 2.3 最晚启动发动机的确定Python 实现 3.1 代码实现 3.2 <

DeepSeek 的含金量还在上升

大家好啊&#xff0c;我是董董灿。 最近 DeepSeek 越来越火了。 网上有很多针对 DeepSeek 的推理测评&#xff0c;除此之外&#xff0c;也有很多人从技术的角度来探讨 DeepSeek 带给行业的影响。 比如今天就看到了一篇文章&#xff0c;探讨 DeepSeek 在使用 GPU 进行模型训练…

tcp/ip网络协议,tcp/ip网络协议栈

TCP/IP网络协议和TCP/IP网络协议栈是互联网通信的基石&#xff0c;它们定义了电子设备如何连入因特网以及数据如何在它们之间传输的标准。以下是对TCP/IP网络协议和TCP/IP网络协议栈的详细解释&#xff1a; 一、TCP/IP网络协议 TCP/IP&#xff08;Transmission Control Proto…

深入剖析 Bitmap 数据结构:原理、应用与优化策略

深入理解 Bitmap 数据结构 一、引言 在计算机科学领域&#xff0c;数据的高效存储和快速处理一直是核心问题。随着数据量的不断增长&#xff0c;如何用最少的空间和最快的速度来表示和操作数据变得至关重要。Bitmap&#xff08;位图&#xff09;作为一种简洁而强大的数据结构…

解锁C#数据校验:从基础到实战的进阶之路

一、引言&#xff1a;数据校验为何如此重要&#xff1f; 在软件开发的广袤领域中&#xff0c;数据校验宛如一座坚固的堡垒&#xff0c;守护着系统的稳定与安全。它是确保数据质量的关键防线&#xff0c;能有效避免错误数据的流入&#xff0c;进而提升系统的整体性能和可靠性。…

【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图详解)

【后端开发】系统设计101——通信协议&#xff0c;数据库与缓存&#xff0c;架构模式&#xff0c;微服务架构&#xff0c;支付系统&#xff08;36张图&#xff09; 文章目录 1、通信协议通信协议REST API 对比 GraphQL&#xff08;前端-web服务&#xff09;grpc如何工作&#x…

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下&#xff0c;我们来学习下图的中篇&#xff01;&#xff01;&#xff01; 一、图的遍历 图的遍历指的是遍历图中的顶点&#xff0c;主要有 广度优先遍历 …

双系统共用一个蓝牙鼠标

前言 由于蓝牙鼠标每次只能配置一个系统&#xff0c;每次切换系统后都需要重新配对&#xff0c;很麻烦&#xff0c;双系统共用一个鼠标原理就是通过windows注册表中找到鼠标每次生成的mac地址以及配置&#xff0c;将其转移到linux上。 解决 1. 首先进入linux系统 进行蓝牙鼠…

DeepSeek 发布多模态 Janus-Pro

DeepSeek在接连发布大语言模型V3&#xff0c;推理模型R1之后&#xff0c;DeepSeek随后又发布两款多模态框架&#xff1a;Janus-Pro 与 JanusFlow &#xff0c;引领多模态模型新时代&#xff01; 而且依然是保持了一贯的风格&#xff0c;保持了完全开源&#xff0c;今天我们来看…

【QT笔记】使用QScrollArea实现多行文本样式显示

目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够&#xff0c;无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域&#xff0c;允许用户滚动查看比当前可视区域更大的内容…

达梦数据库从单主模式转换为主备模式

目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建备库数据库配置备库配置文件dm.ini 文件复制主库的 …

使用C#开发一款通用数据库管理工具

由于经常使用各种数据库&#xff0c;笔者自己动手丰衣足食&#xff0c;使用C#开发了一款通用数据库管理工具&#xff0c;支持Mysql、Oracle、Sqlite、SQL Server等数据库的表、视图、存储过程、函数管理功能&#xff0c;并支持导入导出、数据字典生成、拖拽式跨机器跨库数据一键…

vue2-给data动态添加属性

vue2-给data动态添加属性 1. 问题的来源 在VUe2中&#xff08;VUE3中使用了proxy&#xff0c;及时动态添加也能实现响应式&#xff09;&#xff0c;如果我们动态给data添加一个属性&#xff0c;会发现视图没有同步更新举个例子我们通过v-for遍历data中的一个属性list&#xf…

Github 2025-01-31Java开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10C项目1Kotlin项目1Bazel:快速、可扩展的多语言构建系统 创建周期:3564 天开发语言:Java协议类型:Apache License 2.0Star数量:2…

w193基于Spring Boot的秒杀系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

DeepSeek各版本说明与优缺点分析

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列&#xff0c;其在不同版本的发布过程中&#xff0c;逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本&#xff0c;从版本的发布时间、特点、优势以及不足之处&#xff0…

JDK17主要特性

JDK 17&#xff0c;也被称为Java 17或Java Platform, Standard Edition 17&#xff0c;是Java编程语言的第十七个主要版本&#xff0c;由Oracle公司在2021年9月发布。Java 17是一个长期支持&#xff08;LTS&#xff0c;Long-Term Support&#xff09;版本&#xff0c;这意味着它…

git 项目的更新

更新项目 当自己的本地项目与 远程的github 的仓库已经建立远程连接时&#xff0c; 则直接按照下面的步骤&#xff0c; 将本地的项目代码更新到远程仓库。 # Stage the resolved file git add README.md <file1> <file2># To stage all changes: git add .# Comm…