Git 详解:从概念,常用命令,版本回退到工作流

本文将从 Git 的核心概念讲起,详细介绍常用命令、各阶段版本回退、分支控制以及企业内常见的 Git 工作流。

Git 与 GitHub 简介

Git 简介

Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 于 2005 年开发。它与集中式版本控制系统(如 SVN)不同,不需要依赖中央服务器,每个开发者的电脑上都有一个完整的版本库,使得开发者可以在本地独立进行代码的提交、分支创建等操作,大大提高了开发的灵活性和效率。即使在没有网络的情况下,开发者也能正常开展工作,只需在有网络时与远程仓库进行同步即可。

GitHub 简介

GitHub 是一个基于 Git 的代码托管平台,它为开发者提供了远程仓库托管服务,同时还集成了代码评审、issue 跟踪、项目管理等功能,是全球最大的开源社区之一。开发者可以在 GitHub 上创建公共或私有仓库,与其他开发者共享代码、协作开发项目。除了托管代码,GitHub 还为开源项目提供了展示和推广的平台,许多知名的开源项目(如muduo,sylar)都托管在 GitHub 上。

环境搭建:Windows 与 Ubuntu 下的 Git 安装及 SSH 配置

Windows Git 环境搭建(含 SSH 私钥公钥配置)

  1. 下载安装 Git:访问 Git 官方网站(Git),下载适合 Windows 系统的 Git 安装包。运行安装包,按照默认选项一路点击 “Next” 即可完成安装。安装完成后,在开始菜单中找到 “Git Bash”,打开它即表示 Git 安装成功。

  1. 配置 SSH 密钥
ssh-keygen -t rsa -C "your_email@example.com"
#example: ssh-keygen -t rsa -C "12345678@qq.com"
    • 打开 Git Bash,输入以下命令生成 SSH 密钥对,其中 “your_email@example.com” 替换为你的邮箱地址:
    • 一路按回车键,会提示设置密钥的保存路径,默认路径为 “C:/用户/Administrator/.ssh”,可直接按回车键使用默认路径。
    • 接着会提示设置密码,可直接按回车键不设置密码,也可根据需要设置密码。
    • 密钥生成成功后,在 “C:/用户/Administrator/.ssh” 目录下会生成 “id_rsa”(私钥)和 “id_rsa.pub”(公钥)两个文件。
    • 打开 “id_rsa.pub” 文件,复制其中的内容。
    • 登录 GitHub 或其他 Git 托管平台,进入个人设置页面,找到 “SSH and GPG keys” 选项,点击 “New SSH key”,将复制的公钥内容粘贴到 “Key” 输入框中,设置一个标题,然后点击 “Add SSH key” 完成配置。

Ubuntu Git 环境搭建(含 SSH 私钥公钥配置)

  1. 安装 Git:打开终端,输入以下命令安装 Git:
sudo apt update
sudo apt install git

安装完成后,输入 “git --version” 命令,若显示 Git 的版本信息,则表示安装成功。

  1. 配置 SSH 密钥
ssh-keygen -t rsa -C "your_email@example.com"
    • 在终端中输入以下命令生成 SSH 密钥对:
    • 后续步骤与 Windows 系统下相同,设置密钥保存路径和密码(可默认)。
    • 生成的密钥文件位于 “~/.ssh” 目录下,同样复制 “id_rsa.pub” 文件中的内容,添加到 Git 托管平台的 SSH 密钥设置中。

测试连接:

ssh -T git@github.com

核心概念:工作区、暂存区、本地仓库与远程仓库

要熟练使用 Git,首先需要理解它的四个核心概念:工作区、暂存区、本地仓库和远程仓库,以及它们之间的交互关系。

工作区

工作区就是你在电脑上实际操作的项目目录,你对文件的新增、修改、删除等操作都是在工作区进行的。例如,你在项目文件夹中新建了一个index.html文件,或者修改了style.css文件的内容,这些操作都发生在工作区。

暂存区

暂存区也叫索引区,它是一个临时存放文件变更的区域。当你在工作区完成对文件的修改后,需要通过特定的命令(git add <filename>)将这些变更提交到暂存区。暂存区的作用是让你可以选择性地将工作区中的部分变更提交到本地仓库,而不是一次性提交所有变更(想要提交所有变更可以使用:git add .)。你可以把暂存区想象成一个缓冲区,它保存了你下一次要提交到本地仓库的内容。

本地仓库

本地仓库是存储在你自己电脑上的代码仓库,它包含了项目的所有历史版本和元数据。当你将暂存区的变更提交(git commit -m "提交说明")到本地仓库后,这些变更就被永久地记录下来了,你可以随时查看历史提交记录、回滚到之前的版本等。本地仓库是 Git 版本控制的核心,所有的版本管理操作都是基于本地仓库进行的。

远程仓库

远程仓库是托管在网络服务器上的代码仓库,它通常用于团队协作。团队成员可以将自己本地仓库的变更推送到远程仓库(git push),也可以从远程仓库拉取其他成员的变更(git pull),从而实现代码的共享和同步。常见的远程仓库托管平台有 GitHub、GitLab、Gitee、GitCode 等。

四者之间的交互

工作区、暂存区、本地仓库和远程仓库之间的交互是 Git 工作流程的核心。具体来说,交互过程如下:

  1. 在工作区对文件进行修改(新增、编辑、删除等)。
  2. 使用git add命令将工作区中需要提交的变更添加到暂存区,此时暂存区记录了这些变更。
  3. 使用git commit命令将暂存区的变更提交到本地仓库,本地仓库会生成一个新的版本记录。
  4. 使用git push命令将本地仓库的变更推送到远程仓库,让其他团队成员可以获取这些变更。
  5. 当需要获取远程仓库中其他成员的变更时,使用git pull或git fetch命令将远程仓库的变更拉取到本地仓库,然后合并到工作区。

常用 Git 命令及操作流程

掌握常用的 Git 命令是使用 Git 的基础,下面介绍一些最常用的命令及其用法,以及完整的操作流程。

初始化与配置

  • git init:在当前目录初始化一个新的 Git 仓库,会创建一个隐藏的.git目录,用于存储仓库的元数据。
  • git config --global user.name "Your Name":配置全局的用户名,提交代码时会显示该用户名。
  • git config --global user.email "your.email@example.com":配置全局的邮箱地址,提交代码时会关联该邮箱。

仓库克隆与基础查看命令

  • git clone <remote_url>:从远程仓库克隆一个仓库到本地,会在本地创建一个与远程仓库同名的目录,并将仓库内容下载到该目录。克隆完成后,本地会生成一个默认的main分支,对应远程的main分支。
  • git status:查看工作区和暂存区的状态,显示哪些文件被修改、哪些文件未被跟踪等信息。
  • git branch:查看本地所有的分支,当前所在的分支会以*标记。
  • git branch -r:查看远程仓库的所有分支。

工作区与暂存区操作

  • git add <file>:将工作区中指定文件的变更提交到暂存区。例如,git add index.html将index.html文件的变更添加到暂存区。
  • git add .:将当前目录下所有未跟踪和已修改的文件(除了被忽略的文件)添加到暂存区。

暂存区与本地仓库操作

  • git commit -m "commit message":将暂存区的变更提交到本地仓库,并添加提交信息,用于描述本次提交的内容。例如,git commit -m "添加首页轮播图功能"。

本地仓库与远程仓库操作

  • git push:将本地仓库的变更推送到远程仓库。在推送前,需要确保本地仓库与远程仓库已关联,并且当前分支对应远程的相应分支,例如git push origin main将本地main分支的变更推送到远程main分支。
  • git pull origin <branch>:从远程仓库的指定分支拉取变更,并合并到本地仓库的对应分支。它相当于git fetch和git merge两个命令的组合。​
  • git fetch origin <branch>:从远程仓库的指定分支拉取变更,但不会自动合并到本地仓库的分支,需要手动执行git merge命令进行合并。

各个阶段代码回退

在使用 Git 的过程中,难免会出现需要回退代码的情况,不同阶段的回退方式有所不同:

1. 提交暂存区之前(git add 之前)

  • 可以直接在文件中进行修改,丢弃不需要的变更。
  • 也可以使用git checkout -- <filename>命令,用本地仓库中该文件的最新版本覆盖工作区的文件,从而丢弃工作区的修改。

2. 已经提交到暂存区(git add 之后,git commit 之前)

  • 使用git reset HEAD <filename>命令,将暂存区中该文件的变更舍弃,此时可以重新对文件进行修改后再提交到暂存区。

3. 已提交到本地仓库(git commit 之后)

  • 首先使用git log命令查看提交日志,找到想要回退到的提交版本的commit id。
  • 然后使用git reset --hard <commit id>命令,将HEAD指针指向指定的版本。
  • 如果只是想将工作区的某个文件回退到本地仓库中某个版本的代码,可以先通过git reset --hard <commit id>修改本地仓库HEAD指针指向,然后再使用git checkout -- <filename>命令用本地仓库的文件覆盖工作区文件。

4. 已提交到远程仓库

  • 首先使用git reset --hard <commit id>命令,将本地仓库回退到想要的提交版本。
  • 此时执行git status会发现本地仓库分支落后于远程仓库分支版本,直接git push无法成功推送,需要使用git push -f命令强制推送,将远程仓库的分支也回退到相应版本。需要注意的是,强制推送具有一定的风险,可能会覆盖其他开发者的提交,在团队协作中应谨慎使用,最好在推送前与团队成员沟通。

推送代码冲突

在合并分支的过程中,当两个分支对同一个文件的同一部分进行了不同的修改时,就会产生合并冲突。Git 会在冲突的文件中标记出冲突的位置,需要手动解决冲突后再进行提交。解决冲突的步骤如下:​

  1. 执行git merge命令后,如果出现冲突,Git 会提示哪些文件有冲突。​
  2. 打开冲突的文件,会看到类似以下的标记:​
<<<<<<< HEAD​当前分支的内容​=======​要合并的分支的内容​>>>>>>> feature/branch​
  1. 根据实际需求,编辑文件,保留需要的内容,删除冲突标记和不需要的内容。​
  2. 编辑完成后,使用git add <file>命令将解决冲突后的文件添加到暂存区。​
  3. 使用git commit命令提交合并结果。

分支控制

分支是 Git 中非常强大的功能,它允许你在不影响主分支的情况下进行代码的开发和测试。通过分支,多个开发者可以同时在不同的分支上进行工作,然后将各自的成果合并到主分支。

本地分支控制

  • git branch:查看本地所有的分支,当前所在的分支会以*标记。​
  • git branch <branch_name>:创建一个新的本地分支,<branch_name>是分支的名称。例如,git branch feature/login创建一个名为feature/login的分支。​
  • git checkout <branch_name>:切换到指定的本地分支。例如,git checkout feature/login切换到feature/login分支。​
  • git checkout -b <branch_name>:创建并切换到新的本地分支,相当于git branch <branch_name>和git checkout <branch_name>两个命令的组合。​
  • git merge <branch_name>:将指定的本地分支合并到当前所在的分支。例如,当前在main分支,执行git merge feature/login将feature/login分支的变更合并到main分支。​
  • git branch -d <branch_name>:删除指定的本地分支,需要注意的是,不能删除当前所在的分支。如果分支还没有被合并,需要使用git branch -D <branch_name>强制删除。

远程分支相关操作

  • git branch -r:查看远程仓库的所有分支。​
  • git push origin <branch_name>:将本地创建的分支推送到远程仓库,创建对应的远程分支。例如,git push origin feature/payment将本地feature/payment分支推送到远程仓库,创建远程feature/payment分支。​
  • git checkout -b <local_branch> origin/<remote_branch>:从远程分支创建一个本地分支,并切换到该本地分支。例如,git checkout -b feature/search origin/feature/search从远程feature/search分支创建本地feature/search分支。​
  • git push origin --delete <branch_name>:删除远程仓库的指定分支。例如,git push origin --delete feature/old删除远程feature/old分支。​
  • git pull origin <remote_branch>:<local_branch>:将远程指定分支的变更拉取到本地指定分支。如果本地分支不存在,会自动创建。

Git 实际工作流

在实际的开发工作中,为了保证项目的有序进行,通常会遵循一定的工作流规范。

Git Flow 定义了几种不同类型的分支,每种分支都有特定的用途:​

  • main分支:也称为master分支,是存放正式发布版本代码的分支,始终保持稳定可部署的状态。只有在发布新版本时,才会将develop分支的代码合并到main分支。​
  • develop分支:是开发分支,用于集成各个功能分支的代码,包含了下一个版本将要发布的功能。团队成员的功能开发完成后,会将代码合并到develop分支。​
  • feature分支:用于开发新的功能,从develop分支创建,开发完成后合并回develop分支。命名通常以feature/为前缀,例如feature/user-login。​
  • release分支:用于版本发布准备,从develop分支创建。在这个分支上只进行 bug 修复和版本相关的配置修改,不添加新功能。发布完成后,将该分支合并到main分支和develop分支。命名通常以release/为前缀,例如release/v1.0.0。​
  • hotfix分支:用于修复main分支上的紧急 bug,从main分支创建。修复完成后,将该分支合并到main分支和develop分支。命名通常以hotfix/为前缀,例如hotfix/fix-login-error。​

Git Flow 的工作流程​

  1. 从main分支创建develop分支,团队成员基于develop分支进行开发。​
  2. 当需要开发新功能时,从develop分支创建feature分支,开发者在feature分支上进行功能开发。​
  3. 功能开发完成后,通过代码评审,将feature分支合并回develop分支,并删除feature分支。​
  4. 当develop分支积累了足够多的功能,准备发布新版本时,从develop分支创建release分支。​
  5. 在release分支上进行测试和 bug 修复,确保版本的稳定性。​
  6. 版本测试通过后,将release分支合并到main分支和develop分支,并在main分支上打上版本标签(例如v1.0.0),然后删除release分支。​
  7. 如果main分支上的正式版本出现紧急 bug,从main分支创建hotfix分支进行修复。​
  8. 修复完成后,将hotfix分支合并到main分支和develop分支,并在main分支上打上新的版本标签(例如v1.0.1),然后删除hotfix分支。​

通过遵循 Git Flow 工作流,团队可以有条不紊地进行开发、测试和发布,减少代码冲突和版本管理的混乱,提高开发效率和代码质量。

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

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

相关文章

CMSIS(Cortex Microcontroller Software Interface Standard)ARM公司为 Cortex-M 系列处理器

CMSIS&#xff08;Cortex Microcontroller Software Interface Standard&#xff09;是ARM公司为 Cortex-M 系列处理器&#xff08;如 M0/M3/M4/M7/M23/M33 等&#xff09;定义的一套硬件抽象层标准&#xff0c;旨在简化嵌入式开发&#xff0c;提高代码的可移植性和复用性。 核…

[特殊字符] 扫描式处理:Python 自动提取 PDF 中关键词相关表格并导出为 Excel

本文演示如何利用 pdfplumber 批量处理指定文件夹下 PDF 文档&#xff1a;定位关键词&#xff08;如“主要会计数据”&#xff09;出现的页码及下一页&#xff0c;提取其中的表格并保存为独立 Excel 文件。适用于财务报告、审计表格、统计报表等场景。 1️⃣ 第一步&#xff1a…

python3的返回值能返回多个吗?

在Python中&#xff0c;函数可以通过返回一个元组&#xff08;tuple&#xff09; 来间接实现返回多个值的效果。以下是具体说明&#xff1a; 实现方式&#xff1a;直接返回逗号分隔的值 Python会自动将这些值打包成一个元组&#xff1a; def multiple_return():a 1b "he…

UE5 Secondary Materials

首先放入材质A材质B放入Secondary Materials两个效果就能融合到一起了动态设置secondary material

AUTOSAR进阶图解==>AUTOSAR_SWS_FlashTest

AUTOSAR Flash Test模块详解与分析 基于AUTOSAR标准的Flash Test模块架构、功能与应用分析目录 1. Flash Test模块概述 1.1 模块作用与功能1.2 适用范围 2. Flash Test模块架构 2.1 模块位置2.2 组件关系 3. 状态管理 3.1 状态定义3.2 状态转换 4. 后台测试执行流程 4.1 测试间…

msf复现永恒之蓝

永恒之蓝&#xff08;EternalBlue&#xff09;是利用 Windows 系统的 SMB 协议漏洞&#xff08;MS17-010&#xff09;来获取系统最高权限的漏洞&#xff0c;利用 Metasploit 框架&#xff08;MSF&#xff09;复现该漏洞是一个复杂且具有一定风险的操作&#xff0c;必须在合法合…

格密码--LWE,DLWE和ss-LWE

格密码–LWE&#xff0c;DLWE和ss-LWE 0.数学符号数学符号含义备注Zq\mathbb{Z}_qZq​模qqq的整数集合&#xff0c;即{0,1,2,...,q−1}\{0,1,2,...,q-1\}{0,1,2,...,q−1}用于定义LWE、DLWE、ss-LWE等问题中矩阵和向量的元素取值范围&#xff0c;是基础整数环x∈RSx \in_R Sx∈…

【闭包】前端的“保护神”——闭包详解+底层原理

目录 一、闭包是什么&#xff1f;概念 二、闭包为什么存在&#xff1f;作用 1. 创建私有变量 2. 实现数据封装与信息隐藏 3. 模拟私有方法 4. 保存函数执行时的状态 5. 回调函数和事件处理 6. 模块化编程 7. 懒加载与延迟执行 三、闭包怎么用&#xff1f;实践业务场景 …

算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题

牛顿迭代法&#xff08;Newtons Method&#xff09;是一种强大的数值计算方法&#xff0c;由英国数学家艾萨克・牛顿提出。它通过不断迭代逼近方程的根&#xff0c;具有收敛速度快、适用范围广的特点&#xff0c;在科学计算、工程模拟、计算机图形学等领域有着广泛应用。牛顿迭…

小白学Python,操作文件和文件夹

目录 前言 一、操作文件路径 1.获取当前路径 2.创建文件夹 &#xff08;1&#xff09;mkdir()函数 &#xff08;2&#xff09;makedirs() 函数 3.拼接路径 4.跳转路径 5.判断相对路径和绝对路径 6.获取文件路径和文件名 二、操作文件和文件夹 1.查询文件大小 2.删除…

015_引用功能与信息溯源

引用功能与信息溯源 目录 引用功能概述支持的模型引用类型API使用方法引用格式应用场景最佳实践 引用功能概述 什么是引用功能 Claude的引用功能允许在回答基于文档的问题时提供详细的信息来源引用&#xff0c;帮助用户追踪和验证信息的准确性。这个功能特别适用于需要高可…

ROS2中的QoS(Quality of Service)详解

ROS2中的QoS&#xff08;Quality of Service&#xff09;详解1. 主要QoS参数2. 为什么需要设置QoS3. QoS兼容性规则4. 选择QoS策略的建议5. 调试QoS问题的方法6. 踩坑&#xff1a;订阅话题没有输出可能的原因&#xff1a;调试方法QoS是ROS2中用于控制通信质量和行为的机制。它定…

Cursor三大核心AI功能

一&#xff1a;Tab键&#xff1a;智能小助手 1.1 单行/多行代码补全 在代码中写出要实现的功能&#xff0c;第一次按Tab生成代码&#xff0c;第二次按Tab接受代码。1.2 智能代码重写 对已有代码重新编写。 写个注释告诉AI重构方法&#xff0c;然后鼠标点到方法内部&#xff0c;…

cesium添加原生MVT矢量瓦片方案

项目中需要基于cesium接入mvt格式的服务并支持属性拾取查询&#xff0c;通过一系列预研测试&#xff0c;最后选择cesium-mvt-imagery-provider开源插件完成&#xff0c;关键源码信息如下&#xff1a; npm i cesium cesium-mvt-imagery-provider //安装依赖包// 加载图层import…

AI金融风控:识别欺诈,量化风险的新利器

AI金融风控&#xff1a;识别欺诈&#xff0c;量化风险的新利器深度学习算法穿透海量交易数据&#xff0c;92.5%的不良贷款识别率宣告了金融风险防控新时代的来临。深圳桑达银络科技有限公司在2025年6月申请的“基于人工智能的金融交易反欺诈系统”专利&#xff0c;揭示了金融风…

【unitrix】 5.0 第二套类型级二进制数基本结构体(types2.rs)

一、源码 这是一个使用 Rust 类型系统实现类型级(type-level)二进制数的设计。 //! 类型级二进制数表示方案&#xff08;第二套方案&#xff09; //! //! 使用嵌套泛型结构体表示二进制数&#xff0c;支持整数和小数表示。use crate::sealed::Sealed;/// 类型级二进制数结构体 …

DAY01:【ML 第一弹】机器学习概述

一、三大概念 1.1 人工智能&#xff08;AI&#xff09; Artificial Intelligence 人工智能AI is the field that studies the synthesis and analysis of computational agents that act intelligently 1.2 机器学习&#xff08;ML&#xff09; Machine Learning 机器学习Fi…

AGX Xavier 搭建360环视教程【一、先确认方案】

设备默认自带 NVIDIA 硬件编解码能力&#xff08;NVDEC/NVENC&#xff09;&#xff0c;但是需要你在 OpenCV 和 FFmpeg 里正确启用 调通 GStreamer 或 nvmpi&#xff0c;才真正能用起来&#xff01;这里的硬解码是核心&#xff1a;Jetson 平台的硬解码&#xff0c;要么走 GStr…

服务器怎么跑Python项目?

在服务器上运行 Python 项目通常涉及 环境配置、依赖安装、项目部署 和 进程管理。以下是详细步骤&#xff1a;1. 连接服务器确保你能通过 SSH 访问服务器&#xff1a;ssh usernameyour_server_ip&#xff08;如果是本地测试&#xff0c;可跳过这一步&#xff09;2. 安装 Pytho…

【软件设计师】

UML 类图中的关系用例图中的关系 关系例子类图用例图顺序图 概念示例通信图活动图泳道图状态图