《Git 简易速速上手小册》第2章:理解版本控制(2024 最新版)

在这里插入图片描述

文章目录

  • 2.1 本地仓库与版本历史
    • 2.1.1 基础知识讲解
    • 2.1.2 重点案例:回滚错误提交
    • 2.1.3 拓展案例 1:利用 `git bisect` 查找引入 bug 的提交
    • 2.1.4 拓展案例 2:合并提交历史
  • 2.2 远程仓库的使用
    • 2.2.1 基础知识讲解
    • 2.2.2 重点案例:在 GitHub 上协作
    • 2.2.3 拓展案例 1:处理合并冲突
    • 2.2.4 拓展案例 2:利用 Pull Request 进行代码审查
  • 2.3 版本回退与冲突解决
    • 2.3.1 基础知识讲解
    • 2.3.2 重点案例:修复一个破坏性的提交
    • 2.3.3 拓展案例 1:合并时解决冲突
    • 2.3.4 拓展案例 2:使用 `git rebase` 保持清洁的提交历史

2.1 本地仓库与版本历史

深入 Git 的世界,掌握本地仓库和版本历史的管理是每个开发者的必修课。本地仓库让你的项目历史和所有变更都在你的掌控之中,而版本历史则是你项目的时间线,记录了从初始提交到最新更改的每一个步骤。

2.1.1 基础知识讲解

  • 本地仓库:是你项目的心脏,存储着代码的所有版本。每次执行 git commit 命令,Git 都会将当前暂存区的快照作为一个新的提交保存到仓库中。
  • 版本历史:通过 git log 命令查看,它详细记录了每次提交的作者、日期和提交信息,让你可以追溯每一次更改的来龙去脉。
  • 查看更改git diff 命令允许你查看自上次提交以来你的代码发生了哪些更改,而 git show [commit] 可以查看特定提交的详细更改。

2.1.2 重点案例:回滚错误提交

假设你正在开发一个 Python 应用,你刚刚完成了一个新功能的开发,并且进行了提交。但突然间,你意识到这个提交引入了一个严重的错误。别担心,Git 能够帮你轻松回到错误发生之前。

# 查看提交历史,找到你想回到的那个提交的哈希值
git log
# 假设你想回到的提交哈希值是 abc1234
git checkout abc1234
# 创建一个新的分支来修复这个错误
git checkout -b fix-the-bug

在这个分支上,你可以放心地修复错误,而不会影响主分支。

2.1.3 拓展案例 1:利用 git bisect 查找引入 bug 的提交

当你面对一个神秘的 bug,而且不确定它是在哪个提交中被引入的时候,git bisect 可以成为你的侦探工具。通过在好的(没有 bug)和坏的(有 bug)提交之间进行二分查找,Git 可以帮助你快速定位问题的来源。

git bisect start
git bisect bad                 # 当前版本有 bug
git bisect good abc1234        # abc1234 版本是好的
# Git 会自动检出一半的提交供你测试,直到找到第一个引入 bug 的提交
git bisect reset               # 结束 bisect 会话

2.1.4 拓展案例 2:合并提交历史

如果你的提交历史变得杂乱无章,你可能想要通过合并一些提交来清理它。git rebase 是一个强大的工具,允许你修改、合并或者重新排序提交。

git rebase -i HEAD~5

这个命令会打开一个交互式界面,列出了最近的 5 次提交,你可以选择哪些提交需要被合并(squash)、重写(reword)或者重新排序。

通过这一章,你已经学会了如何有效地管理你的本地仓库和版本历史,以及如何在出现问题时优雅地恢复。记住,每个错误都是一个学习的机会,Git 则是你在这个过程中的最佳伙伴。现在,让我们继续前进,探索更多 Git 的奥秘吧!

在这里插入图片描述


2.2 远程仓库的使用

远程仓库,这个神奇的概念,让我们的代码不再孤单。它允许我们与世界分享我们的成果,同时也能从他人那里获得灵感和帮助。不论是 GitHub、GitLab 还是 Bitbucket,这些平台都成为了我们展示和协作项目的舞台。

2.2.1 基础知识讲解

  • 远程仓库的概念:远程仓库是位于互联网或网络上的仓库,可以通过 URL 访问。它让多个开发者能够共享一个项目并协同工作。
  • 添加远程仓库:使用 git remote add origin [URL] 命令,你可以添加一个新的远程仓库。origin 是远程仓库的默认名字,但你可以根据需要命名为其他。
  • 推送(Push)git push 命令让你能将本地的更改推送到远程仓库。这是分享你的更改给其他人的主要方式。
  • 拉取(Pull)git pull 命令用于从远程仓库获取最新的更改并合并到你的本地仓库。它是获取其他人更改的主要方式。

2.2.2 重点案例:在 GitHub 上协作

假设你正在与你的团队在 GitHub 上协作开发一个 Python 项目。项目的目标是创建一个简单的网页爬虫。

步骤 1:克隆远程仓库

首先,你需要将项目克隆到你的本地机器上:

git clone https://github.com/yourteam/python-web-crawler.git

这会在你的本地创建一个项目的副本,并自动添加远程仓库 origin 指向该 GitHub 仓库。

步骤 2:添加新功能

你决定添加一个新的功能:解析网页的标题。你在本地创建了一个新分支,开发了这个功能,并准备将它推送到 GitHub。

# parse_title.py
import requests
from bs4 import BeautifulSoup

def parse_title(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    return soup.title.text

步骤 3:推送更改

在完成新功能后,你提交了更改,并推送到 GitHub:

git checkout -b feature-parse-title
git add parse_title.py
git commit -m "Add function to parse webpage title"
git push origin feature-parse-title

2.2.3 拓展案例 1:处理合并冲突

在你的团队成员也在同时工作时,他们可能已经修改了项目中的某些文件,并推送了他们的更改到 GitHub。当你尝试合并你的分支到主分支时,可能会遇到合并冲突。

解决冲突需要你手动编辑文件,合并不同的更改,并再次提交:

git fetch origin
git rebase origin/main
# 解决任何冲突
git add .
git rebase --continue
git push origin feature-parse-title -f

2.2.4 拓展案例 2:利用 Pull Request 进行代码审查

GitHub 的 Pull Request(PR)功能是代码审查和项目协作的强大工具。通过创建 PR,你可以请求将你的分支合并到主分支。这个过程允许团队成员审查代码,提出建议,确保代码质量。

在你推送你的分支后,你可以在 GitHub 上对该分支创建一个新的 PR,并等待你的团队审查。

通过这些案例,我们看到了远程仓库如何成为团队协作不可或缺的一部分。无论是推送新的更改,处理合并冲突,还是通过 Pull Request 进行代码审查,远程仓库都让我们的开发流程更加流畅和高效。让我们继续利用这些工具,共同创造更多令人激动的项目吧!

在这里插入图片描述


2.3 版本回退与冲突解决

在软件开发的过程中,回退到之前的版本和解决代码冲突是常有的情况。Git 提供了强大的工具来帮助我们管理这些情况,让我们能够优雅地处理错误和协作中的矛盾。

2.3.1 基础知识讲解

  • 版本回退:如果你发现最近的一次提交有问题,你可以使用 git checkoutgit reset 命令回到之前的某个版本。git checkout [commit_hash] 用于查看历史中的某个版本,而 git reset 用于撤销一系列的提交。
  • 冲突解决:当多人同时修改了同一部分代码并尝试合并时,Git 会提示冲突。解决冲突需要手动编辑冲突的文件,选择要保留的更改,然后再次提交。

2.3.2 重点案例:修复一个破坏性的提交

假设在你的 Python 项目中,你不小心提交了一个包含严重错误的代码,这个错误甚至可能导致应用崩溃。你需要立刻修复这个问题,而不影响项目的其他部分。

步骤 1:定位错误提交

首先,使用 git log 定位到那个有问题的提交。假设提交的哈希是 abc123

步骤 2:回退更改

你决定使用 git revert 来回退这个更改,这将创建一个新的提交,撤销之前的更改,而不丢失之后的工作。

git revert abc123

现在,错误已经被安全地撤销,而且项目的其他部分保持不变。

2.3.3 拓展案例 1:合并时解决冲突

你和你的团队成员都对 utils.py 进行了修改,当你尝试合并他的分支时,遇到了冲突。

步骤 1:开始合并

git merge feature/teammate-branch

步骤 2:解决冲突

Git 会告诉你 utils.py 存在冲突。打开这个文件,你会看到类似下面的标记,显示了冲突的部分:

<<<<<<< HEAD
# 你的更改
=======
# 团队成员的更改
>>>>>>> feature/teammate-branch

手动编辑这个文件,解决冲突,然后保存。

步骤 3:完成合并

git add utils.py
git commit -m "Resolve merge conflict in utils.py"

2.3.4 拓展案例 2:使用 git rebase 保持清洁的提交历史

为了保持项目历史的清晰,你决定在将你的分支合并到 main 分支之前,先将你的分支上的更改进行变基操作,使其基于 main 分支的最新状态。

步骤 1:从 main 分支获取最新的更改

git checkout main
git pull

步骤 2:变基你的分支

git checkout feature/your-branch
git rebase main

如果在变基过程中遇到冲突,解决它们,然后使用 git rebase --continue 继续变基过程,直到完成。这样,你的分支上的更改就会出现在 main 分支更改的顶部,使得合并变得更简单、历史更清晰。

通过掌握版本回退和冲突解决的技巧,你就能更自信地处理项目中的错误和协作问题。记住,Git 提供了强大的工具来帮助我们优雅地管理这些挑战,让我们能够专注于创造伟大的软件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSP-动态规划-最长公共子序列(LCS)

一、动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;主要用于求解可以被分解为相似子问题的复杂问题&#xff0c;特别是在优化问题上表现出色&#xff0c;如最短路径、最大子数组和、编辑距离等。动态规划的核心思想是将原问题分解为较小的子…

Old Money 和 New Money

&#xff08;1&#xff09; 我想借用一下&#xff1a;Old Money 和 New Money这两个词&#xff0c;但不是欧洲那种Old Money 和 New Money的定义。 我定义的Old Money是&#xff1a; 人脉关系、资源 信息差、成本差 我定义的New Money是&#xff1a; 科技是第一生产力 2015年以…

计算机网络——09Web-and-HTTP

Web and HTTP 一些术语 Web页&#xff1a;由一些对象组成对象可以是HTML文件、JPEG图像&#xff0c;JAVA小程序&#xff0c;声音剪辑文件等Web页含有一个基本的HTML文件&#xff0c;该基本HTML文件又包含若干对象的引用&#xff08;链接&#xff09;通过URL对每个对象进行引用…

程序员与电脑:不眠之夜的背后故事

在这个数字化飞速发展的时代&#xff0c;程序员和他们的电脑成了不可分割的伙伴。 如果你有机会深夜走过城市的某个角落&#xff0c;透过窗户瞥见那些亮着的电脑屏幕&#xff0c;你可能会好奇&#xff1a;这些电脑为什么总是开着的&#xff1f; 难道程序员们都有失眠症吗&…

猫头虎分享已解决Bug ‍ || 修改mongodb3.0副本集用户密码遇到 BeanDefinitionParsingException

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Solidworks:从草图到工程图纸,掌握正确的工作流程

1. 草图不及太在意构造线和尺寸标注的美观性&#xff0c;只要确保模型尺寸正确即可 因为草图不是最终输出的&#xff0c;这个阶段的工作重点是建立尺寸正确的实体模型&#xff0c;所以不要在意构造线和尺寸标注是否美观。 2. 工程图纸中标注尽量按照操作提示放置位置 工程图…

《Linux 简易速速上手小册》第10章: 性能监控与优化(2024 最新版)

文章目录 10.1 理解系统负载10.1.1 重点基础知识10.1.2 重点案例&#xff1a;服务器响应变慢10.1.3 拓展案例 1&#xff1a;多核 CPU 系统的负载解读10.1.4 拓展案例 2&#xff1a;分析具体时间段的系统负载 10.2 优化性能10.2.1 重点基础知识10.2.2 重点案例&#xff1a;优化 …

‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

遇到 vue-cli-service 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 的错误时&#xff0c;通常意味着Vue CLI没有被正确安装或配置在项目中。这可能是因为node_modules目录缺失了必要的包&#xff0c;或者局部安装的Vue CLI没有被正确设置到系统的PATH环境…

springsecurity6使用

spring security 中的类 &#xff1a; AuthenticationManager : 实现类&#xff1a;ProviderManager 管理很多的 provider &#xff0c;&#xff0c;&#xff0c; 经常使用的&#xff0c;DaoAuthenticationProvider , 这个要设置一个 UserDetailService , 查找数据库&#xff…

操作系统基础:IO管理概述【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f3c6;&#x1f3c6;本文完整PDF源文件请翻阅至文章底部下载。&#x1f3c6;&#x1f3c6; &#x1f3ae;1 I/O设备的基本概念与分类&#x1f52b;1.1 总览&#x…

538. 把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&#…

屏幕字体种类介绍

[ Script and font support in Windows ] [Windows 中的脚本和字体支持&#xff3d; 在Windows 2000 以前&#xff0c;Windows 的每个主要版本都会添加对新脚本的文本显示支持。本文介绍了每个主要版本中的更改。 Since before Windows 2000, text-display support for new scr…

云原生之基石-Docker Compose

1. 前言 在上一篇文章中介绍了基本的Docker工具&#xff0c;我们对单个应用程序进行单机单进程部署&#xff0c;制作Dockerfile文件&#xff0c;执行docker build来生成docker镜像&#xff0c; 执行docker run来运行一个容器&#xff0c;自己指定需要的参数如-v&#xff0c;但是…

【教3妹学编程-算法题】输入单词需要的最少按键次数 I

3妹&#xff1a;2哥&#xff0c;新年好鸭~ 2哥 : 新年好&#xff0c;3妹这么早啊 3妹&#xff1a;是啊&#xff0c;新年第一天要起早&#xff0c;这样就可以起早一整年 2哥 :得&#xff0c;我还不了解你&#xff0c;每天晒到日上三竿 3妹&#xff1a;嘿嘿嘿嘿&#xff0c;一年是…

作业2.12

1、选择题 1.1、以下程序的输出结果是____A____。 main() { int k11,k22,k33,x15; if(!k1) x--; else if(k2) if(k3) x4; else x3; printf(“x%d\n”,x); } A x4 B x15 C x14 D x3 1.2、有以下程序&#xff0c;while循环执行____A____次。 int main&#x…

STM32自学☞定时器定时中断案例

timer_interrupt.c文件 /* 初始化函数编写步骤&#xff1a; 1.打开时钟 2.选择时基单元的时钟源&#xff08;内部时钟源&#xff09; 3.配置时基单元 4.NVIC配置 5.启动定时器 */ #include "stm32f10x.h" #include "stm32f10x_tim.h" #include …

【Linux】进程信号概念 | 核心转储 | 信号的产生

文章目录 一、信号入门1.1 生活中的信号1.2 进程角度的信号1.3 信号的概念1.4 信号的三种常见处理方式 二、信号的产生2.1 通过终端按键产生信号问题1&#xff1a;OS怎么知道键盘输入了ControlC &#xff1f;问题2&#xff1a;按CtrlC终止进程和按Ctrl\终止进程&#xff0c;有什…

Visual Studio 2010+C#实现信源编码

1. 要求 本文设计了一套界面系统&#xff0c;该系统能够实现以下功能&#xff1a; 克劳夫特不等式的计算&#xff0c;并且能够根据计算结果给出相应的信息。可通过用户输入的初始条件然后给出哈夫曼编码以及LZ编码&#xff0c;结果均通过对话框来显示哈夫曼编码结果包含相应的…

算法沉淀——分治算法(leetcode真题剖析)

算法沉淀——分治算法 快排思想01.颜色分类02.排序数组03.数组中的第K个最大元素04.库存管理 III 归并思想01.排序数组02.交易逆序对的总数03.计算右侧小于当前元素的个数04.翻转对 分治算法是一种解决问题的算法范式&#xff0c;其核心思想是将一个大问题分解成若干个小问题&a…

代码控制邮件服务器发送电子邮件

1、引言 在用户注册的时候我们如果需要让用户接收动态验证码通常有两种方式。一种是给用户发送短信验证码&#xff0c;另一种是发送邮箱验证码。而发送短信验证码的话就必须购买短信流量&#xff0c;这无疑增加了投入的成本&#xff0c;那么此时我们可以使用发送邮箱验证码的形…