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

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.lryc.cn/news/583327.html

相关文章:

  • sqlplus表结构查询
  • 3.常⽤控件
  • 跨平台ROS2视觉数据流:服务器运行IsaacSim+Foxglove本地可视化全攻略
  • 【动手学深度学习】4.9. 环境和分布偏移
  • MyBatis之数据操作增删改查基础全解
  • tinyxml2 开源库与 VS2010 结合使用
  • MySQL8.0基于GTID的组复制分布式集群的环境部署
  • 如何通过配置gitee实现Claude Code的版本管理
  • SpringBoot校园疫情防控系统源码
  • Flink1.20.1集成Paimon遇到的问题
  • stm32Cubmax的配置
  • 微信小程序91~100
  • Pycharm 报错 Environment location directory is not empty 如何解决
  • 基于Spring Boot+Vue的巴彦淖尔旅游网站(AI问答、腾讯地图API、WebSocket及时通讯、支付宝沙盒支付)
  • Ragas的Prompt Object
  • NHibernate案例
  • SAP ERP与Oracle EBS对比,两个ERP系统有什么区别?
  • aichat-core简化 LLM 与 MCP 集成的前端核心库(TypeScript)
  • C#项目 在Vue/React前端项目中 使用使用wkeWebBrowser引用并且内部使用iframe网页外链 页面部分白屏
  • Spring IoC 如何实现条件化装配 Bean?
  • HUAWEI HiCar6.0的新变化
  • 一条Redis命令是如何执行的?
  • C++随机打乱函数:简化源码与原理深度剖析
  • 从零开始学前端html篇2
  • 微信小程序控制空调之微信小程序篇
  • 双esp8266-01s间TCP通讯
  • 图像硬解码和软解码
  • RAM带宽计算及分析
  • 区块链系统开发技术应用构建可信数字生态链
  • 以太坊智能合约核心技术解析与应用实践