Learn Git Branching 记录

news2024/12/26 9:19:35

Learning Git Branching 可以说是目前为止最好的教程了,地址

在这里插入图片描述
点击右下角问号显示常用命令

1.提交

在这里插入图片描述

git commit

提交内容,并把这些修改保存成了一个提交记录 C3,C3 的父节点是 C2

修改提交信息

在这里插入图片描述

git commit --amend

每次 git commit 后都会产生一条提交记录,使用 git commit --amend 会把当前的修改追加到最新的提交里,而不会产生新的提交记录
例如,这里提交了 C2,追加了修改到 C2,形成 C2’,但是没有产生新的提交记录,C2 和 C2’ 的提交注释一样,但 hash 值不一样

2.创建,切换分支

在这里插入图片描述

git branch newImage

新创建的分支 newImage 指向的是提交记录 C1

在这里插入图片描述

git checkout newImage
git commit

切换到 newImage 分支,提交C2,*表示当前分支
注意:在 Git 2.23 版本中,引入了一个名为 git switch 的新命令,最终会取代 git checkout,因为 checkout 作为单个命令有点超载(它承载了很多独立的功能)

git checkout -b bugFix 

创建一个新的分支bugFix,同时切换到这个分支,可以通过 git checkout -b 来实现

3.合并 merge

在这里插入图片描述

git merge bugFix

把 bugFix 分支合并到当前的 main 分支
在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”,main 现在指向了一个拥有两个父节点的提交记录 C4

在这里插入图片描述

git checkout bugFix
git merge main

再把 main 分支合并到 bugFix,因为 main 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 main 所指向的那个提交记录

4.合并 rebase

第二种合并分支的方法是 git rebase。rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去
在这里插入图片描述

git rebase main

C3’ 是 C3 的副本,复制后两个分支是并行开发的

在这里插入图片描述

git rebase bugFix

切换到了 main 上。把它 rebase 到 bugFix 分支上,由于 bugFix 继承自 main,所以 Git 只是简单的把 main 分支的引用向前移动了一下而已

5.分离 HEAD

HEAD 是一个对当前所在分支的符号引用,分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名
在这里插入图片描述

git checkout C1 //这里的C1表示提交记录的哈希值

在命令执行之前的状态:HEAD -> main -> C1
HEAD 指向 main, main 指向 C1
执行后变成了:HEAD -> C1

6.相对引用

通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用
使用 ^ 向上移动 1 个提交记录
使用 ~ 向上移动多个提交记录,如 ~3

在这里插入图片描述

git checkout main^

在这里插入图片描述

git checkout HEAD~4

强制修改分支位置,可以直接使用 -f 选项让分支指向另一个提交
在这里插入图片描述

git branch -f main HEAD~3

上面的命令会将 main 分支强制指向 HEAD 的第 3 级父提交

一个更复杂的例子
在这里插入图片描述

git branch -f main C6
git checkout HEAD^
git branch -f bugFix HEAD^

7.撤销变更

撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。这里主要关注的是后者
在这里插入图片描述

git reset HEAD~1

git reset 通过把分支记录回退几个提交记录来实现撤销改动,在reset后,C2 所做的变更还在,但是处于未加入暂存区状态,reset 主要用于自己管理的分支

虽然在本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的!
为了撤销更改并分享给别人,我们需要使用 git revert
在这里插入图片描述

git revert HEAD

新提交记录 C2’ 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2’ 的状态与 C1 是相同的

8.复制提交记录到当前分支(遴选)

在这里插入图片描述

git cherry-pick C2 C4

复制 C2 和 C4 并提交到当前 main 分支

9.交互式的 rebase

如果你想从一系列的提交记录中找到想要的记录,可以利用交互式的 rebase,它指的是用带参数 --interactive 的 rebase 命令, 简写为 -i
如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,所谓的 UI 窗口一般会在文本编辑器(如 Vim)中打开一个文件。 课程里使用一个对话框来模拟这些操作

当 rebase UI界面打开时, 你能做3件事:
调整提交记录的顺序(通过鼠标拖放来完成)
删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
合并提交,它允许你把多个提交记录合并成一个

在这里插入图片描述
在这里插入图片描述

git rebase -i HEAD~4

这里打开 UI 界面对 HEAD 上面4个提交进行修改,删除 C3 这个提交,修改 C4,C5 的顺序

10.标签

分支很容易被改变,大部分分支还只是临时的,并且还一直在变。tag 可以(在某种程度上 —— 因为标签可以被删除后重新在另外一个位置创建同名的标签)永久地将某个特定的提交命名为里程碑,然后就可以像分支一样引用了
在这里插入图片描述

git tag V1 C1

建立一个标签V1,指向提交记录 C1,如果你不指定提交记录,Git 会用 HEAD 所指向的位置

最近的标签

由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来描述离你最近的锚点(也就是标签),它就是 git describe
git describe 的​​语法是:

git describe <ref>

可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会使用你目前所在的位置(HEAD)。
它输出的结果是这样的:

<tag>_<numCommits>_g<hash>

tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位
当 ref 提交记录上有某个标签时,则只输出标签名称

在这里插入图片描述

git describe main
v1_2_gC2 //输出
git describe side
v2_1_gC4 //输出

11.选择父提交记录

操作符 ^ 与 ~ 符一样,后面也可以跟一个数字num
一个合并提交有两个父提交,num指代某个父提交,默认选择合并提交的“第一个”父提交
在这里插入图片描述

git checkout main^

默认会回到第一个父提交记录,在示例图中,第一个父提交记录是指合并提交记录正上方的那个提交记录

在这里插入图片描述

git checkout main^2

回到了另外一个父提交上

这些操作符还支持链式操作
在这里插入图片描述

git checkout HEAD~^2~2

12.远程仓库

git clone 地址

在本地创建一个远程仓库的拷贝

在这里插入图片描述
o/main 表示远程分支,其中o表示origin,远程分支有一个特别的属性,在你切换到远程分支时,自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果
当我们从远程仓库获取数据时, 远程分支也会更新以反映最新的远程仓库

fetch

在这里插入图片描述

git fetch

C2,C3 被下载到了本地仓库,git fetch 完成了仅有的但是很重要的两步:

  1. 从远程仓库下载本地仓库中缺失的提交记录
  2. 更新远程分支指针(如 o/main)

git fetch 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件,可以将 git fetch 的理解为单纯的下载操作

pull

当远程分支中有新的提交时,你可以像合并本地分支那样来合并远程分支。也就是说就是你可以执行以下命令:

git cherry-pick o/main
git rebase o/main
git merge o/main

由于先抓取更新再合并到本地分支这个流程很常用,因此 Git 提供了一个专门的命令来完成这两个操作

git pull

在这里插入图片描述

git fetch
git merge o/merge

用 fetch 下载了 C3,然后 C2 和 C3 合并成 C4,现在我们的 main 分支包含了远程仓库中的更新
而 git pull 就是 git fetch 和 git merge 的简写,使用 git pull 可以代替上面两条命令,类似的 git pull --rebase 就是 fetch 和 rebase 的简写

push

在这里插入图片描述

git push

git push 将你的变更上传到远程仓库,远程仓库接收了 C2,远程仓库中的 main 分支也被更新到指向 C2 了,我们的远程分支 (o/main) 也同样被更新了,所有的分支都同步了
注意 —— git push 不带任何参数时的行为与 Git 的一个名为 push.default 的配置有关。它的默认值取决于你正使用的 Git 的版本

在这里插入图片描述
这种情况执行 git push 会失败,因为你最新提交的 C3 基于远程分支中的 C1。而远程仓库中该分支已经更新到 C2 了,所以 Git 拒绝了你的推送请求,所以实际开发中必须先 git pull 更到最新才能提交

在这里插入图片描述

git fetch
git rebase o/main
git push

用 git fetch 更新了本地仓库中的远程分支,然后用 rebase 将我们的工作移动到最新的提交记录下,最后再用 git push 推送到远程仓库

git pull --rebase
git push

也可以使用 git pull --rebase 简化命令
在这里插入图片描述

git fetch
git merge o/main
git push

用 git fetch 更新了本地仓库中的远程分支,然后合并了新变更到我们的本地分支(为了包含远程仓库的变更),最后我们用 git push 把工作推送到远程仓库

git pull
git push

使用 git pull 简化命令

13.远程服务器拒绝!(Remote Rejected)

如果你是在一个大的合作团队中工作,很可能是main被锁定了,不能直接提交到main,需要一些Pull Request流程来合并修改。如果你直接提交(commit)到本地main,然后试图推送(push)修改,你将会收到这样类似的信息:
! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)

远程服务器拒绝直接推送(push)提交到main, 因为策略配置要求 pull requests 来提交更新
你应该按照流程,新建一个分支,推送(push)这个分支并申请pull request

在这里插入图片描述

git reset --hard o/main
git checkout -b feature C2
git push Origin feature

先 reset 保证main分支和远程服务器保持一致,这里使用 --hard 硬重置,可以尽情省略掉那个选项以避免麻烦!但是要记录 Git 中默认的是 --mixed

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

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

相关文章

波奇学Linux:指令,指令行解释器和Linux的权限

​ 目录 ​指令和命令行解释器 什么是指令&#xff1f; 什么是命令行解释器&#xff1f; 指令和命令行解释器的作用 Linux的权限 Linux的身份 Linux的权限 权限和身份有关&#xff1a;拥有者&#xff0c;所属组&#xff08;group&#xff09;&#xff0c;other。 权限…

互联网的出现为创业者提供了一个新的平台,使得创业门槛大大降低,同时也为更多的人提供了机会。然而,在互联网创业的道路上,成功者和失败者之间的差距可能会更加明显。

创意 创业的第一步是找到一个好的创意。这个创意应该是有市场需求的&#xff0c;且你有能力实现它。当然&#xff0c;这个创意不必是全新的&#xff0c;但它必须要有你的创新点。你需要考虑你的目标客户、他们的需求、你的产品或服务如何满足这些需求、竞争情况等因素。因此&a…

物联网技术下的智能照明转型

安科瑞虞佳豪 市场发展瞬息万变&#xff0c;智能照明经过了多年的演变&#xff0c;多次完成了迭代升级&#xff0c;如今逐步向着健康照明、全屋智能照明时代演进。 行业发展&#xff1a;物联网催动智能照明转型 随着万物互联的时代到来&#xff0c;5G和物联网技术的深度结合…

Apache Kafka - 重识消费者

文章目录 概述Kafka消费者的工作原理Kafka消费者的配置Kafka消费者的实现高级API低级API 导图总结 概述 Kafka是一个分布式的消息队列系统&#xff0c;它的出现解决了传统消息队列系统的吞吐量瓶颈问题。 Kafka的高吞吐量、低延迟和可扩展性使得它成为了很多公司的首选消息队…

C++基础语法——模板

1. 泛型编程 在平常的编写中&#xff0c;对于一个实现固定作用的函数&#xff0c;如交换两变量的值的Swap函数&#xff0c;对于不同类型只能编写相对应的重载函数&#xff0c;即 void Swap(int& left, int& right) {int temp left;left right;right temp; }void S…

二叉树的认识(二)

既然要认识二叉树&#xff0c;自然要知道二叉树的基本操作。首先最基本的是要知道二叉树的遍历&#xff0c;所谓遍历(Traversal)是指沿着某条搜索路线&#xff0c;依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题(比如&#xff1a;打印节点…

postgresql|数据库|postgresql-12的内置插件pg_stat_statements的启用和使用

前言&#xff1a; 插件就是原软件的扩展功能。postgresql有非常多的各种各样的插件&#xff0c;当然了&#xff0c;插件不安装对于我们使用数据库并没有什么太多的影响&#xff0c;可能只是不舒服一些而已&#xff0c;但有一些插件我们如果有安装&#xff0c;那么&#xff0c;对…

chatgpt赋能Python-pythonfrom

PythonFrom是什么&#xff1f; PythonFrom 是一种基于 Python 语言的开源数据采集与清洗框架&#xff0c;它提供了现代化的数据处理流程&#xff0c;非常适合于爬虫、数据挖掘和机器学习等应用场景。 特点 1. 简单易学 PythonFrom 采用了类似于 SQL 的语法结构&#xff0c;…

Spark Json系列UDF 姿势大全

主要基于jsonpath GitHub - yangyongyongyong/sparkThomasUDF at dev 解决的痛点 每次修改都要写udf函数 重复劳动,所以这里把json中常见的修改和读取都封装起来 场景案例 读取value 数组类型结果 读取value string类型结果 jsonArray 新增 元素 jsonObject 新增/更新 kv对 …

Pycharm安装教程,附详细图解

简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外&#xff0c;该IDE提供了一些高级功能&a…

Android RecyclerView实现侧滑删除

距上次写博客有半年多了&#xff0c;回忆起来都觉得不可思议&#xff0c;中间也想憋俩大招&#xff0c;总是被耽误&#xff0c;这俩月忙完之后&#xff0c;终于空下来了&#xff0c;恰好新项目我和UI俩人商量一下&#xff0c;用MD来实现app。中间有个需求是RecyclerView中侧滑显…

node + alipay-sdk 沙箱环境简单测试电脑网站支付

正式上线需要上传营业执照&#xff0c;不知道怎么去申请一个。。。。。 使用沙箱测试&#xff0c;首先前往支付宝开放平台控制台可看到左下方的沙箱测试链接&#xff1a; 然后设置接口加签方式&#xff0c;选择系统默认密钥&#xff1a; 系统默认密钥 -> 公钥模式 -> 查看…

将小米SoundMove 无缝接入 ChatGPT

将小米SoundMove 无缝接入 ChatGPT 本教程内容参考 Github 地址(可选)部署查看小米 SoundMove 信息的环境(可选)查看小米 SoundMove 的信息以容器方式部署程序到小米万兆路由器实际效果有待改善点 本教程内容 1 是记录了将小米 SoundMove 接入 ChatGPT 的操作步骤。 2 是将小米…

Chrome Performance 页面性能分析

Chrome Performance 页面性能分析 背景介绍 性能优化是前端开发一个非常重要的组成部分&#xff0c;如何更好地进行网络传输&#xff0c;如何优化浏览器渲染过程&#xff0c;来定位项目中存在的问题。Chrome DevTools给我们提供了2种常用方式 Audits和Performance&#xff0c…

Flink学习——基本转换算子

目录 一、filter算子 二、map算子 三、聚合算子 1.keyBy——按键分区 2.简单聚合 (1)min&#xff1a;在输入流上&#xff0c;对指定的字段求最小值 (2)minBy&#xff1a;返回包含字段最小值的整条数据 (3)max&#xff1a;在输入流上&#xff0c;对指定的字段求最大值 …

【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】

使用Navicat连接时报1251错误&#xff0c;如下图&#xff1a; 原因 MySQL8.0后的版本加密规则是“caching_sha2_password”&#xff0c;而 MySQL8.0之前的版本加密规则是“mysql_native_password” 解决办法 更改加密规则&#xff0c;将MySQL用户登录密码加密规则还原成“…

Python:常见的面试题和答案

1. 什么是Python&#xff1f; 答&#xff1a;Python是一种高级编程语言&#xff0c;被广泛应用于Web开发、数据分析、人工智能等领域。 2. Python的优点是什么&#xff1f; Python的优点包括&#xff1a; 简单易学&#xff1a;Python语法简单&#xff0c;易于上手&#xff…

chatgpt赋能Python-pythonfly

PythonFly介绍 PythonFly是一个功能丰富的Python Web框架&#xff0c;它提供了快速开发Web应用的工具和方法。PythonFly可以轻易扩展、分布式部署和最小化代码重复。PythonFly利用Python的清晰和简单的语法&#xff0c;让Web应用程序更容易阅读和维护。 PythonFly的特点 快速…

CSS图像填充文字(镂空文字效果 / 文字镂空效果)

先展示一下最终效果&#xff1a; 开始做 1. 搭建基本代码结构 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>CSS图像填充文字&#xff08;镂空文字效果&#xff09;</title></head><body><div cl…

20230520查找中国移动的APP在RK3566下调用UVC摄像头出错

20230520查找中国移动的APP在RK3566下调用UVC摄像头出错 2023/5/20 23:34 SDK&#xff1a;Android12RK3566平台 android12 UVC camera 没插摄像头&#xff0c;但是/dev/video0-13标号被占用&#xff0c;是啥原因导致的 板子上也没有摄像头 【板子没有接CSI/MIPI接口的I2C通道…