【Git核心操作实战】从初始化到冲突解决与回滚(附完整演示)

文章目录

  • 目录
    • 引言
    • 环境准备
    • 一、仓库初始化与首次提交
      • 1.1 初始化 Git 仓库
      • 1.2 创建 .gitignore 文件
      • 1.3 首次提交
      • 技术解析
    • 二、分支创建与多轮小步提交
      • 2.1 切出 feature 分支
      • 2.2 2-3 次小步提交
        • 第一次提交:新增功能基础文件
        • 第二次提交:实现核心逻辑
        • 第三次提交:修复参数校验问题
      • 技术解析
    • 三、分支合并(merge 选型及理由)
      • 3.1 合并到 main 分支
      • 3.2 选型理由(merge vs rebase)
    • 四、制造并解决合并冲突
      • 4.1 制造冲突
        • 步骤1:feature 分支修改目标行
        • 步骤2:main 分支修改同一行
        • 步骤3:触发合并冲突
      • 4.2 解决冲突
        • 步骤1:查看冲突文件
        • 步骤2:手动解决冲突
        • 步骤3:完成合并提交
      • 技术解析
    • 五、版本回滚(git revert 演示)
      • 5.1 查看提交历史
      • 5.2 执行 git revert
      • 5.3 补充:cherry-pick 迁移修复提交
      • 技术解析
    • 六、GitHub 平台适配说明
    • 总结
      • 核心要点回顾

目录

引言

若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的动力!有问题请私信或联系邮箱:funian.gm@gmail.com

Git 作为分布式版本控制系统,是开发者日常协作、代码版本管理的核心工具。本文将通过空目录实操的方式,按步骤演示 Git 最核心的基础操作(初始化、分支管理、提交、合并、冲突解决、版本回滚),并结合技术解析说明背后的设计逻辑,帮助新手快速掌握 Git 核心用法。

环境准备

本次演示基于 Linux/macOS 终端(Windows 可使用 Git Bash),先创建空目录作为演示仓库:

# 创建并进入空目录mkdirgit-demo&&cdgit-demo

一、仓库初始化与首次提交

1.1 初始化 Git 仓库

git init是创建 Git 仓库的第一步,会在当前目录生成隐藏的.git文件夹(仓库核心配置/版本记录都存于此):

# 初始化仓库gitinit# 验证:查看.git目录(Linux/macOS)ls-la|grep.git

输出示例:drwxr-xr-x 9 user staff 288 Jan 9 10:00 .git,说明初始化成功。

1.2 创建 .gitignore 文件

.gitignore用于指定 Git 需忽略的文件/目录(如日志、缓存、IDE 配置等),避免无关文件提交到仓库。
创建并编辑.gitignore

# 创建.gitignore文件touch.gitignore# 编辑内容(示例:忽略常见无用文件)cat>.gitignore<<EOF # 日志文件 *.log # 缓存目录 node_modules/ # IDE配置(VSCode) .vscode/ # 系统临时文件 .DS_Store EOF

1.3 首次提交

提交是 Git 保存版本的核心操作,需遵循清晰的提交信息规范(推荐 Conventional Commits 规范:类型+描述):

# 将.gitignore加入暂存区gitadd.gitignore# 首次提交(提交信息清晰描述操作)gitcommit -m"feat: 初始化仓库,添加.gitignore忽略规则"

提交成功后,可通过git log查看提交记录:

gitlog --oneline# 输出示例:f876541 (HEAD -> main) feat: 初始化仓库,添加.gitignore忽略规则

技术解析

  • git init:初始化本地仓库,生成.git目录(包含 objects、refs、config 等核心文件);
  • .gitignore规则:支持通配符(*)、目录(/)、注释(#),优先级为「本地.gitignore > 全局.gitignore > .git/info/exclude」;
  • 提交信息规范:类型(可选作用域): 描述(如 feat/fix/docs/style/refactor/test/chore),便于追溯和自动化生成 CHANGELOG。

二、分支创建与多轮小步提交

2.1 切出 feature 分支

Git 分支是「轻量级指针」,feature/<topic>是行业通用的功能分支命名规范(<topic>为功能主题),用于隔离功能开发:

# 从main分支创建并切换到feature/user-login分支(推荐新命令git switch)gitswitch -c feature/user-login# 等价于旧命令:git checkout -b feature/user-login# 验证分支状态gitbranch# 输出示例:* feature/user-login# main

2.2 2-3 次小步提交

「小步提交」是 Git 最佳实践:每次提交只完成一个小功能/修复,便于追溯、回滚和代码评审。

第一次提交:新增功能基础文件
# 创建用户登录功能文件touchuser.js# 写入基础代码echo"// 用户登录模块">user.js# 暂存+提交gitadduser.jsgitcommit -m"feat: 新增用户登录模块基础文件"
第二次提交:实现核心逻辑
# 修改user.js,添加登录函数cat>>user.js<<EOF // 登录函数 function login(username, password) { return { code: 200, msg: "登录成功" }; } EOF# 提交gitcommit -am"feat: 实现用户登录核心函数"# -am 等价于:git add + git commit(仅适用于已追踪文件)
第三次提交:修复参数校验问题
# 修改user.js,补充参数校验sed-i'''3i\ if (!username || !password) return { code: 400, msg: "参数不能为空" };\ 'user.js# 提交gitcommit -am"fix: 补充登录参数非空校验"

技术解析

  • 分支本质:refs/heads/目录下的文本文件,存储对应提交的哈希值;
  • 小步提交优势:
    1. 单个提交逻辑清晰,便于 Code Review;
    2. 回滚时仅影响局部功能,风险可控;
    3. 多人协作时减少冲突概率。

三、分支合并(merge 选型及理由)

3.1 合并到 main 分支

合并分支有两种核心方式:mergerebase,本次选择merge(更适合新手+保留分支历史):

# 切换回main分支gitswitch main# 合并feature/user-login到maingitmerge feature/user-login --no-ff# --no-ff:强制创建合并提交(保留分支历史,便于追溯)

合并成功后,git log --graph --oneline可查看分支合并图谱:

* a1b2c3d (HEAD -> main) Merge branch 'feature/user-login' |\ | * e4f5g6h (feature/user-login) fix: 补充登录参数非空校验 | * i7j8k9l feat: 实现用户登录核心函数 | * m0n1o2p feat: 新增用户登录模块基础文件 |/ * f876541 feat: 初始化仓库,添加.gitignore忽略规则

3.2 选型理由(merge vs rebase)

操作特点适用场景
merge保留分支历史,生成合并提交,无代码篡改团队协作、公共分支(main/develop)
rebase线性历史,无合并提交,重写提交哈希个人开发分支、功能分支合入前整理

本次选 merge 的核心原因

  1. 新手易理解:合并记录清晰,可通过git log直观看到功能分支的所有提交;
  2. 无风险:rebase会改写提交历史,若分支已推送到远程,可能导致协作冲突,merge更安全;
  3. 可追溯:保留「功能开发-合并」的完整上下文,便于后续问题定位。

四、制造并解决合并冲突

4.1 制造冲突

冲突产生的核心原因:同一文件的同一行被不同分支修改

步骤1:feature 分支修改目标行
# 切回feature分支,修改user.js第5行(登录提示)gitswitch feature/user-login# 修改登录提示文案sed-i'''s/msg: "登录成功"/msg: "登录成功,欢迎回来"/'user.js# 提交修改gitcommit -am"feat: 优化登录成功提示文案"
步骤2:main 分支修改同一行
# 切回main分支,修改同一行(不同文案)gitswitch mainsed-i'''s/msg: "登录成功"/msg: "登录成功,您的账号安全有效"/'user.js# 提交修改gitcommit -am"feat: 调整登录成功提示语"
步骤3:触发合并冲突
# 合并feature分支到main,触发冲突gitmerge feature/user-login

终端会提示冲突:

Auto-merging user.js CONFLICT (content): Merge conflict in user.js Automatic merge failed; fix conflicts and then commit the result.

4.2 解决冲突

步骤1:查看冲突文件
gitstatus# 输出示例:# both modified: user.js
步骤2:手动解决冲突

打开user.js,冲突区域会被标记:

// 用户登录模块// 登录函数functionlogin(username,password){if(!username||!password)return{code:400,msg:"参数不能为空"};return{code:200,msg:"登录成功"};<<<<<<<HEADreturn{code:200,msg:"登录成功,您的账号安全有效"};=======return{code:200,msg:"登录成功,欢迎回来"};>>>>>>>feature/user-login}
  • <<<<<<< HEAD:main 分支的代码;
  • =======:冲突分割线;
  • >>>>>>> feature/user-login:feature 分支的代码。

手动修改为最终想要的内容(比如合并两者的优点):

// 用户登录模块// 登录函数functionlogin(username,password){if(!username||!password)return{code:400,msg:"参数不能为空"};return{code:200,msg:"登录成功,欢迎回来!您的账号安全有效"};}
步骤3:完成合并提交
# 标记冲突文件已解决gitadduser.js# 完成合并提交gitcommit -m"fix: 解决user.js登录提示文案合并冲突"

技术解析

  • 冲突本质:Git 无法自动判断同一行代码的优先级,需人工介入;
  • 冲突解决核心:保留正确代码,删除冲突标记(<<<<<<</=======/>>>>>>>);
  • 避免冲突:频繁拉取远程分支、小步提交、按模块分工开发。

五、版本回滚(git revert 演示)

Git 回滚有两种核心方式:git revert(安全,推荐)和git reset(危险,不建议公共分支使用)。

5.1 查看提交历史

gitlog --oneline# 输出示例(假设需回滚“调整登录提示语”的提交):# 9876543 (HEAD -> main) fix: 解决user.js登录提示文案合并冲突# 8765432 feat: 调整登录成功提示语# 7654321 Merge branch 'feature/user-login'# ...

5.2 执行 git revert

git revert会创建一个反向提交,撤销指定提交的修改,且保留原提交历史(无数据丢失):

# 回滚“调整登录成功提示语”的提交(哈希为8765432)gitrevert8765432

若有冲突,按第四步的方法解决后执行git commit即可。

5.3 补充:cherry-pick 迁移修复提交

git cherry-pick用于「挑选单个提交」迁移到其他分支(比如将 feature 分支的修复提交迁移到 main):

# 查看feature分支的修复提交哈希gitlog feature/user-login --oneline# 输出示例:e4f5g6h fix: 补充登录参数非空校验# 切回main分支,迁移该提交gitswitch maingitcherry-pick e4f5g6h

技术解析

回滚方式原理适用场景风险
git revert创建反向提交,撤销修改公共分支(main/develop)
git reset移动HEAD指针,删除提交本地私有分支、未推送提交高(数据丢失)
git cherry-pick复制单个提交到当前分支跨分支迁移修复/小功能提交低(仅复制提交)

六、GitHub 平台适配说明

以上操作均为本地操作,若需推送到 GitHub,补充以下步骤:

# 1. 在GitHub创建空仓库,复制仓库地址# 2. 添加远程仓库gitremoteaddorigin https://github.com/你的用户名/git-demo.git# 3. 推送到GitHub(-u 绑定本地main到远程origin/main)gitpush -u origin main# 4. 推送feature分支到远程gitpush origin feature/user-login

总结

核心要点回顾

  1. 仓库初始化git init生成.git目录,.gitignore 规范忽略文件,首次提交需清晰描述;
  2. 分支管理feature/<topic>命名规范,小步提交便于追溯,合并优先选merge(保留历史);
  3. 冲突解决:冲突源于同一行多分支修改,手动删除冲突标记并保留正确代码,git add标记解决;
  4. 版本回滚:公共分支用git revert(安全),私有分支可试用git reset,跨分支迁移提交用git cherry-pick

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

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

相关文章

Teams Webhook 传递长文本的技巧与示例

引言 在团队协作工具中,Microsoft Teams和Slack是两个非常流行的选择。它们都支持通过Webhook发送消息,但有时你会发现Teams在处理长文本消息时会遇到一些限制。本文将详细介绍如何使用Teams Webhook传递多行文本,并确保URL链接可以点击,内容完整显示,就像用户直接输入一…

Apache Paimon多模态数据湖实践:从结构化到非结构化的技术演进

在近期的 Streaming Lakehouse Meetup Online EP.2&#xff5c;Paimon StarRocks 共话实时湖仓 直播中&#xff0c;Apache Paimon PMC 成员/阿里云数据湖资深工程师叶俊豪带来了关于 Paimon 多模态数据湖的深度技术分享。随着大模型训练对数据规模与多样性的要求不断提升&…

利用多进程提升图表模拟程序的性能

引言 在实时数据处理和图表模拟的领域,程序的响应速度和效率至关重要。特别是当我们处理大量数据并需要实时更新图表时,如何高效地利用系统资源就成为了一个关键问题。今天我们来探讨如何通过多进程来优化一个图表模拟程序的性能。 问题描述 我们有一款图表模拟程序,用于…

基于Java+SpringBoot+SSM儿童医院挂号管理系统(源码+LW+调试文档+讲解等)/儿童医院预约系统/儿童医院就诊管理系统/医院挂号管理系统/儿童医院挂号平台/儿童医院在线挂号

博主介绍 &#x1f497;博主介绍&#xff1a;✌全栈领域优质创作者&#xff0c;专注于Java、小程序、Python技术领域和计算机毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2025-2026年最新1000个热门Java毕业设计选题…

网上租赁系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着互联网技术的快速发展&#xff0c;传统租赁行业正逐步向数字化转型。网上租赁系统作为一种高效、便捷的商业模式&#xff0c;能够有效解决传统租赁过程中信息不对称、管理效率低下等问题。该系统通过整合线上资源&#xff0c;为用户提供租赁物品的浏览、下单、支付及管…

总结了 12 个嵌入式项目

前两天有一个读者问我&#xff0c;如果要做嵌入式项目&#xff0c;哪些项目会比较合适&#xff0c;这里总结了 12 个比较有代表性的项目&#xff0c;使用的cpu 也是主流的&#xff0c;推荐给大家&#xff0c;希望对大家学习有所帮助。1. Avem&#xff1a;轻量级无人机飞控项目项…

使用aop切面springmvc后抛出异常一直捕捉不到异常(抛出异常UndeclaredThrowableException类)

WebLogControllerAop这是一个切面处理类&#xff0c;使用的Around处理切面&#xff0c;有异常必须抛出&#xff0c;不然全局异常捕捉不到的 package cn.geg.lifecycle.config;import cn.geg.lifecycle.util.WebLogUtils; import cn.hutool.core.collection.CollUtil; import cn…

在Azure中实现跨订阅的AMPLS自动链接策略

在Azure环境中,管理和自动化资源链接是提升运维效率和确保安全性的关键。特别是在处理不同订阅的资源时,如何高效地实现跨订阅的自动链接是一个常见的挑战。本文将通过一个实际的案例,详细介绍如何利用Azure Policy实现Application Insights与AMPLS(Azure Monitor Private …

Java Web Web足球青训俱乐部管理后台系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 足球青训俱乐部管理后台系统的开发旨在解决传统足球青训俱乐部在管理学员信息、课程安排、教练分配等方面效率低下的问题。随着足球运动的普及和青训体系的完善&#xff0c;俱乐部需要一套高效、智能化的管理系统来优化运营流程。传统的人工记录和Excel表格管理方式容易导…

Flask应用中的实例路径问题探讨

引言 在Flask应用程序开发中,实例路径(instance path)是一个经常被忽视但又非常关键的概念。特别是在部署和管理数据库时,如果不正确处理实例路径,可能会导致一系列难以诊断的问题。本文将通过一个真实的案例,详细探讨Flask实例路径的设置和其在生产环境中的影响。 实例…

上班是一场冷静的交易

将上班视作一场冷静的交易&#xff0c;这并非 cynicism&#xff0c;而是一种珍贵的清醒。它像一副坚固的甲胄&#xff0c;保护我们在职业的疆场上不被无谓的情绪流矢所伤&#xff0c;不被暧昧的期望绑架。我们付出标定好的时间、技能与专注&#xff0c;换取等值的报酬、经验与履…

【2025最新】基于SpringBoot+Vue的师生健康信息管理系统管理系统源码+MyBatis+MySQL

摘要 在当今信息化时代&#xff0c;校园健康管理已成为教育机构重点关注的方向之一。传统的师生健康信息管理多依赖纸质记录或分散的电子表格&#xff0c;存在数据冗余、更新滞后、查询效率低下等问题。随着互联网技术的快速发展&#xff0c;构建一个高效、安全、便捷的师生健康…

实时语音识别回声消除技巧

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 实时语音识别回声消除的实战技巧&#xff1a;突破传统局限目录实时语音识别回声消除的实战技巧&#xff1a;突破传统局限 引言&#xff1a;回声消除——语音识别的隐形守护者 现在时&am…

《斯图尔特微积分(下册)》什么时候出?带答案吗???

《斯图尔特微积分》上册中文版9月出版后&#xff0c;读者评价“讲解语言生动&#xff0c;带入生活实际&#xff0c;能够了解数学公式或定理在其他学科的应用。”“良好的阅读体验&#xff0c;美观的版面和由浅入深的内容。”评论和后台常有人私信下册什么时候出&#xff1f;答案…

解决Unity中按钮点击索引问题

在使用Unity开发游戏或应用时,经常会遇到需要为多个按钮动态添加点击事件并传递索引参数的情况。然而,这种操作在C#中可能会导致一些意想不到的问题。本文将通过一个实际例子,解释这些问题及其解决方案。 问题描述 假设我们有一个ScrollView组件,其内容包含多个Button对象…

python开发中虚拟环境配置

在Python开发中&#xff0c;虚拟环境是项目隔离的最佳实践。以下是详细的使用指南&#xff1a; 1. 为什么需要虚拟环境&#xff1f; 依赖隔离&#xff1a;不同项目可以使用不同版本的包避免冲突&#xff1a;防止系统Python环境被污染便于部署&#xff1a;可以精确导出项目依赖团…

【毕业设计】SpringBoot+Vue+MySQL 社区医院信息平台平台源码+数据库+论文+部署文档

摘要 随着信息技术的快速发展&#xff0c;传统社区医院管理模式逐渐暴露出效率低下、信息孤岛等问题。社区医院作为基层医疗服务的重要载体&#xff0c;亟需通过信息化手段优化业务流程&#xff0c;提升服务质量。当前&#xff0c;社区医院在患者档案管理、药品库存监控、预约挂…

Day32 >> 56、合并区间 + 738、单调递增的数字

代码随想录-贪心算法Part5 56、合并区间 class Solution {public int[][] merge(int[][] intervals) {List<int[]> result new LinkedList<>();Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));int start intervals[0][0];int end interva…

驾驶认知的本质:人类模式 vs 端到端自动驾驶

在讨论自动驾驶系统时&#xff0c;一个常见的误解是把“开车能力”等同于“驾驶智能”。事实上&#xff0c;人类驾驶与端到端自动驾驶之间的核心差异&#xff0c;并不在于动作精度或感知能力&#xff0c;而在于认知结构与任务管理模式。一、人类驾驶&#xff1a;动态任务管理的…

操作mysql常用python脚本,强到爆炸

1.导出数据库指定表的所有字段(含有字段注释)和数据导出结果如下#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ MySQL数据导出工具 - 修复元组索引问题 """import pandas as pd import pymysql import openpyxl from openpyxl.utils impo…