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

漫游git rebase + 浅谈git checkout和git branch -f的分支命令

今天学了两个命令非常有意思:一个是git checkout,一个是git branch -f。我们可以认为在提交树上,任何一个节点代表着一次提交。并且,git commit将会在 H E A D HEAD HEAD指针指向的节点上进行进一步提交。将每一个分支名视为标记当前分支最新情况的节点名字。首先,先明确以下基本概念

  1. git checkout
    我们可以认为git checkout 是在变动 H E A D HEAD HEAD指针,比如git checkout main是把 H E A D HEAD HEAD指针变到 m a i n main main指向的节点上面。如果单独使用git checkout [log-hash],我们甚至可以在 l o g log log树上面随意切换 H E A D HEAD HEAD,而git commit就是在 H E A D HEAD HEAD的基础上进行提交的。
    验证上述理论:
  • git checkout [log-hash]

  • git checkout main

  • git commit 提交

  • git checkout HEAD^ 有几个^就是向上移动几级

    • git checkout main~3main的基础上向上移动3级
  1. git branch -f [branchName] [log hash] 移动分支标记节点

明确了上述概念,可以进行学习 git rebase了。这个命令常常会令人十分迷惑,在八股文中会拿这个命令和 git merge进行比较。最后得出的结论就是 git rebase一般用在本地分支整理,不会用在远程上。 git merge一般用在合并远程分支和本地分支的差异。
那么先给出 git rebase的定义,然后再进行验证。假设你现在在main分支上,那么git rebase master就是要将当前面分支变基到 master分支上。步骤可以分成以下三个:

  1. 先找到两个分支标记节点的最近公共父节点 A A A
  2. main A A A路径上的节点与master A A A路径上的节点进行去重。
  3. 将去重后的节点复制到 master节点下(注意是复制,原来的节点并未删除)。如果 master节点已经有子节点了,那么这些节点作为新建路径复制到 master节点下面。

验证:

  1. 初阶-- 将 m a i n main main变基到 y h yh yh

    执行命令:
git checkout main
git rebase yh

得到下面的树:

最近公共父节点为 c 4 ′ c4' c4 m a i n main main到父节点的路径是 c 11 c11 c11 c 10 c10 c10,直接复制到 y h yh yh下面变成 c 11 ‘ c11‘ c11‘ c 10 ’ c10’ c10’,这时 y h yh yh是没有子节点的。 c 11 c11 c11 c 10 c10 c10还是在的,截屏的时候没截下来,蚌。

  1. 进阶–从 z t zt zt y h yh yh变基

    这时的 y h yh yh是有子节点的,所以会新建路径。将 c 12 c12 c12~ c 14 c14 c14会一起复制到 y h yh yh下面

  2. 高阶–从 z t zt zt b u g F i x bugFix bugFix变基,路径上的 c 12 c12 c12是重复的,所以会去重。

  3. 综合–验证去重的正确性,在 z t zt zt的上面 c 1 3 ′ ′ c13'' c13′′位置新开个分支 m q mq mq

m a i n main main变基到 m q mq mq上,路径上的 c 4 ′ c4' c4 c 7 c7 c7 c 8 c8 c8都是重复的。放个结果,验证成功!

我还录了个视频,但是没录好,还是放上来,大家看一下吧~

附练习网站链接:https://learngitbranching.js.org/

谢谢您看到这里!您的点赞和收藏是我创作的不竭动力~感谢您的支持

http://www.xdnf.cn/news/738.html

相关文章:

  • Linux内核哈希表学习笔记
  • Vue3 + TypeScript + Pinia 搭建一套企业级的开发脚手架
  • 数字化时代下的工业物联网智能体开发平台策略
  • Vue3中provide和inject数据修改规则
  • 代码随想录训练营第36天 ||1049. 最后一块石头的重量 II 494. 目标和 474. 一和零
  • C++——智能指针
  • 防抖与节流的理解与应用
  • 【C++】win 10 / win 11:Dev-C++ 下载与安装
  • 数据结构实验7.1:二叉树的遍历
  • C语言strlen和sizeof区分
  • Cadence学习笔记之---库元件制作、元件放置
  • TDengine 性能监控与调优实战指南(二)
  • 指针(2)
  • Linux 网络基础(二) (传输协议层:UDP、TCP)
  • cloudstudio学习笔记之openwebui
  • 嵌入式面试题解析:二维数组,内容与总线,存储格式
  • iwebsec靶场 文件包含关卡通关笔记11-ssh日志文件包含
  • Boost.Asio 确实属于 异步非阻塞模型
  • 多模态大语言模型arxiv论文略读(三十一)
  • 高并发场景下重试策略的演进设计
  • 【Linux】Rhcsa复习4
  • 亚马印象建材:推出“200×1200和300×1800数码釉木纹砖”新品
  • 树莓派超全系列教程文档--(36)树莓派条件过滤器设置
  • 奇异递归模板设计模式-CRTP
  • 32-工艺品商城小程序
  • 深入浅出讲解UDP检验中如何计算检验和
  • 标准的JNI (Java Native Interface) 加载函数 JNI_OnLoad
  • 4.凸包-Graham Scan
  • Spring Boot 版本与对应 JDK 版本兼容性
  • SpringCloud小白入门+项目搭建