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

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记

code review!

文章目录

  • git笔记之撤销、回退、reset方面的笔记
    • 1.git 已经commit了,还没push,如何撤销到初始状态
      • `git reset --soft HEAD~1`
      • `git reset HEAD~1`(等同于 `git reset --mixed HEAD~1`)
      • `git reset --hard HEAD~1`
    • 2.git 已经commit了,还没push,修改最后的commit信息
    • 3.git 已经commit了,也push了,发现远程没合,发现还有没改完,如何操作
      • 3.1. 在本地进行修改
      • 3.2. 添加并提交修改
      • 3.3. 推送到远程仓库
        • --force-with-lease 详解
      • 3.4. 如果有必要,打开一个新的合并请求(Merge Request)或拉取请求(Pull Request)
    • 4.使本地与远程保持一致
      • 重置本地分支到远程分支的状态
      • 更新本地分支列表
      • 对于所有本地分支,跟踪远程分支
    • 5.git stash的作用

1.git 已经commit了,还没push,如何撤销到初始状态

git reset 是 Git 中的一个强大命令,用于撤销本地的提交。git reset 可以通过不同的参数来指定撤销的方式,比如 --soft--mixed(默认),以及 --hard。下面是每个参数的详解以及一个比较表格。

git reset --soft HEAD~1

  • --soft 参数将 HEAD 移动到指定的提交,但不会改变索引(暂存区)和工作目录。换句话说,它撤销了最近的提交,但保留了文件的更改,并且这些更改已经在暂存区准备好了下一个提交。
  • 适用场景:当你想要撤销提交但保留更改并立即进行新的提交时。
  • 将当前分支的HEAD移动到前一个提交(即撤销最后一次提交),但不更改暂存区(index)和工作目录。
  • 撤销后,所有的更改都会被保留在暂存区中,就好像你刚刚执行了git add将它们暂存起来一样
  • 这个命令适合于当你想要修改最后的提交信息或者合并多个提交到一个提交的场景。

git reset HEAD~1(等同于 git reset --mixed HEAD~1

  • --mixed 是默认的重置模式。这个参数会将 HEAD 移动到指定的提交,并且重置索引,但不会触及工作目录的文件。
  • 撤销了最近的提交,并将那次提交的所有更改放回工作目录。
  • 就像你完成了修改但还没有执行 git add 的状态
  • 适用场景:当你想要撤销提交并重新审查或修改更改,但不想完全放弃这些更改时。

git reset --hard HEAD~1

  • --hard 参数将 HEAD、索引和工作目录全都重置到指定的提交。
  • 这意味着所有的更改——包括已经暂存的和未暂存的更改——都会被丢弃。使用这个选项要非常小心,因为它会丢失所有未提交的更改。
  • 适用场景:当你想彻底撤销最近的提交以及所有更改,回到之前的状态时。
  • ⚠️ 警告: 使用 --hard 选项会丢失最后一次提交的所有更改。请确保你不需要这些更改,或者已经对它们做了备份。

下面是一个表格,比较这三种 git reset 命令:

命令HEAD 移动索引(暂存区)影响工作目录影响适用场景
git reset --soft HEAD~1保留更改无影响撤销提交,保留更改,准备新提交
git reset HEAD~1取消暂存更改保留更改撤销提交,重新审查/修改更改
git reset --hard HEAD~1取消暂存更改丢弃更改彻底撤销提交和更改,回到之前的状态

重要提醒: 使用 git reset --hard 时务必要小心,因为一旦执行,未提交的更改将无法恢复。在任何可能会丢失数据的操作之前,建议先做好备份。

2.git 已经commit了,还没push,修改最后的commit信息

如果你已经做了一个commit,但还没有将其push到远程仓库,并且希望修改这次commit的信息,你可以使用git commit --amend命令进行操作。下面是一步一步的指导:

  1. 打开你的命令行工具。

  2. 使用git log查看最近的commit,确保你要修改的是最近一次的commit信息。

  3. 输入以下命令来修改最后一次的commit信息:

git commit --amend
  1. 这将打开你的默认文本编辑器,允许你修改commit信息。在编辑器中修改commit信息,然后保存并关闭编辑器。

  2. 如果你想直接在命令行中修改commit信息,而不是打开文本编辑器,可以使用以下命令(其中new commit message是你的新commit信息):

git commit --amend -m "new commit message"
  1. 完成修改后,你可以使用git log再次检查以确保commit信息已更新。

  2. 现在,你可以像往常一样推送你的commit到远程仓库:

git push origin your-branch-name

请注意,如果你的commit已经被推送到了远程仓库,并且其他人可能已经基于这个commit进行了工作,那么使用--amend操作可能会导致问题。在这种情况下,你应该谨慎使用这个命令,并且可能需要与你的团队协调来决定是否要修改远程仓库中的commit信息。

3.git 已经commit了,也push了,发现远程没合,发现还有没改完,如何操作

如果你已经提交(commit)并推送(push)了代码到远程仓库,并且发现还有未完成的修改需要添加,你可以按照以下步骤操作:

3.1. 在本地进行修改

首先,在你的本地代码库中进行必要的修改。

3.2. 添加并提交修改

修改完成后,将这些更改添加到暂存区并创建一个新的提交:

git add .
git commit -m "说明你的修改"

如果修改较小,你也可以选择将这些修改添加到上一个提交中,使用 --amend 选项:

git add .
git commit --amend --no-edit  # 保持上次提交的信息不变
# 如果你想修改提交信息,可以去掉 --no-edit

3.3. 推送到远程仓库

如果你没有修改上一次的提交(即第2步中没有使用 --amend),你可以正常推送到远程仓库:

git push origin <branch-name>

如果你使用了 --amend 修改了上一个提交,你需要强制推送,因为历史已经改变:

git push origin <branch-name> --force
# 或者使用更安全的 --force-with-lease 选项
git push origin <branch-name> --force-with-lease

注意:强制推送会重写远程仓库的历史。在共享的仓库中进行强制推送可能会给其他协作者带来问题。在强制推送之前,最好跟团队成员沟通一下。

–force-with-lease 详解

--force-with-leasegit push 命令的一个选项,它是 --force 的一个更安全的替代。强制推送(使用 --force)会覆盖远程仓库的分支,而不管其他人是否已经推送了他们的提交。这可能会导致他人的工作丢失,因为你的本地历史会覆盖远程历史。

相比之下,--force-with-lease 提供了一种保护机制,确保你不会意外覆盖其他人的更改。它会在强制推送之前检查远程分支的当前状态,确保远程分支的当前状态与你上次获取时的状态一致。如果有差异,说明可能有其他人已经推送了新的提交,那么 --force-with-lease 会阻止你的推送操作。

这里是如何操作的:

  • 当你执行 git push --force-with-lease 时,Git 会检查远程分支的当前引用是否匹配你本地的引用。
  • 如果它们匹配,说明自从你上次同步以来,没有人更新远程分支,你的强制推送将会执行。
  • 如果它们不匹配,说明有人在你之后推送了他们的更改,你的推送将会被拒绝。这可以防止你不小心覆盖别人的工作。

--force-with-lease 的好处在于,它提供了强制推送的能力,同时减少了意外覆盖同事代码的风险。它是一种更加谨慎的做法,尤其适用于多人协作的项目中。

这个选项还可以接受额外的参数来指定要检查的分支和引用:

git push --force-with-lease=<branch-name>:<expected-value>

这里,<branch-name> 是你想要推送的远程分支名,<expected-value> 是你期望远程分支引用的值。如果远程分支的实际引用与 <expected-value> 不同,Git 将阻止推送。

使用 --force-with-lease 是一个更安全的做法,因为它有助于防止数据丢失。不过,即使是这种安全的强制推送,也应该谨慎使用,并且最好在推送之前与团队成员沟通。

3.4. 如果有必要,打开一个新的合并请求(Merge Request)或拉取请求(Pull Request)

如果初始的合并请求还没有被处理,你可以继续在原来的合并请求中添加信息说明有新的提交添加。如果合并请求已经关闭,或者你需要创建一个新的合并请求,根据你使用的平台(GitHub, GitLab, Bitbucket等)的规则进行操作。

请注意,如果你的仓库设置了分支保护规则,禁止了强制推送,那么你可能需要联系仓库管理员或者使用别的方法(比如创建一个新的提交来修复问题,而不是修改已有提交)。

根据你的具体情况和团队的工作流程,这些步骤可能会有所不同。

4.使本地与远程保持一致

重置本地分支到远程分支的状态

如果你想要放弃本地分支上所有的更改,并使其与远程分支完全一致,可以使用 git reset 命令配合 --hard 选项。这样会使你的本地分支(比如 master)完全回退到远程分支的状态:

git fetch origin
git reset --hard origin/<branch_name>

⚠️ 警告: 使用 --hard 选项会丢失所有未提交的更改和本地提交。在执行这个命令之前,请确保你不需要这些更改,或者已经对它们做了备份。

更新本地分支列表

有时,远程仓库的分支可能会被删除或重命名,你也需要更新你本地的分支列表以反映这些更改:

git fetch --prune

这个命令会从你的本地仓库中删除那些已经在远程仓库中被删除的追踪分支。

对于所有本地分支,跟踪远程分支

如果你有多个分支需要同步,你可以对每个分支重复上述的拉取或推送操作。此外,确保本地分支正确地跟踪对应的远程分支,可以使用:

git branch -u origin/<branch_name>

或者,在推送本地分支时设置上游(远程跟踪)分支:

git push -u origin <branch_name>

通过这些基本操作,你可以保持本地仓库与远程仓库的一致性。记得在执行可能会丢失数据的操作如 git reset --hard 前,总是确保备份你的工作。

5.git stash的作用

git stash 是一个非常有用的 Git 命令,它可以帮助你临时保存你的工作目录中的更改,而不是做一个提交。这在以下情况下非常有用:

  1. 当你正在进行一项工作但需要切换到另一个分支进行另一项工作时,而你的当前更改又不足以做一个完整的提交。
  2. 当你需要快速保存当前的工作状态,以便稍后再回来继续工作。

git stash 通常与几个选项一起使用:

  • git stash save "message":保存当前的工作进度。你可以提供一个消息作为参数,以帮助记住这个stash中保存了什么。
  • git stash list:列出所有的 stash。
  • git stash apply:重新应用最近保存的 stash。你可以指定一个 stash 来应用,如 git stash apply stash@{2}
  • git stash pop:应用最近的或指定的 stash,并从 stash 列表中移除它。
  • git stash drop:删除最近的或指定的 stash。
  • git stash clear:删除所有的 stashes。

当你执行 git stash(等同于 git stash push)时,Git 会执行以下操作:

  1. 将你的暂存区和工作目录中的更改保存起来。
  2. 回复暂存区和工作目录到最近的提交状态(HEAD),这样你就有了一个干净的工作状态。

这使得你可以切换分支并开始不同的工作,或者保持当前分支的一个干净状态。当你准备好继续之前的工作时,你可以用 git stash applygit stash pop 来恢复你之前保存的更改。

请注意,git stash 不会保存未追踪的文件(比如新添加的文件,还没有用 git add 添加到暂存区的文件),除非你使用 git stash -u 或者 git stash --include-untracked。同样,git stash -agit stash --all 会保存所有的更改,包括未追踪的文件和忽略的文件。

在这里插入图片描述

相关文章:

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记 code review! 文章目录 git笔记之撤销、回退、reset方面的笔记1.git 已经commit了&#xff0c;还没push&#xff0c;如何撤销到初始状态git reset --soft HEAD~1git reset HEAD~1&#xff08;等同于 git reset --mixed HEAD~1&#xff0…...

【中间件】docker数据卷

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 1.数据卷&#xff08;容器数据管理&#xff09; 修改nginx的html页面时&#xff0c;需要进入nginx内部。并且因为内部没有编辑器&#xff0c;修改…...

【3D reconstruction 学习笔记 第二部】

三维重建 3D reconstruction 4. 三维重建与极几何三角化&#xff08;线性解法&#xff09;三角化&#xff08;非线性解法&#xff09;多视图几何极几何极几何约束基础矩阵估计 5. 双目立体视觉重建6. 多视图重建7. SFM 系统设计8. SLAM系统设计 4. 三维重建与极几何 三角化&…...

【CSP试题回顾】202109-1-数组推导(优化)

CSP-202109-1-数组推导 解题代码 #include <iostream> #include <vector> #include <algorithm> using namespace std;long long n, sumMax,sumMin;int main() {cin >> n;vector<long long>arr(n);for (size_t i 0; i < n; i){cin >>…...

Redis - 高并发场景下的Redis最佳实践_翻过6座大山

文章目录 概述6座大山之_缓存雪崩 &#xff08;缓存全部失效&#xff09;缓存雪崩的两种常见场景如何应对缓存雪崩&#xff1f; 6座大山之_缓存穿透&#xff08;查询不存在的 key&#xff09;缓存穿透的原因解决方案1. 数据校验2. 缓存空值3. 频控4. 使用布隆过滤器 6座大山之_…...

数字乡村发展策略:科技引领农村实现跨越式发展

随着信息技术的迅猛发展和数字经济的崛起&#xff0c;数字乡村发展策略已经成为引领农村实现跨越式发展的重要手段。科技的力量正在深刻改变着传统农业的生产方式、农村的社会结构以及农民的生活方式&#xff0c;为农村经济发展注入了新的活力和动力。本文将从数字乡村的内涵、…...

TCP重传机制详解——04FACK

文章目录 TCP重传机制详解——04FACK什么是FACKFACK的发展为什么要引入FACK实战抓包讲解开启FACK场景&#xff0c;且达到dup ACK门限值开启FACK场景&#xff0c;未达到dup ACK门限值 为什么要淘汰FACK总结REF TCP重传机制详解——04FACK 什么是FACK FACK的全称是forward ackn…...

安卓Java面试题 206- 210

206. 简述如何统计Activity的工作时间 ?如何统计Activity启动所用的时间? 可以通过分析Log得到(这个就是DDMS的那个Log)。 当我们点击触摸时会了类似以下的Log A: 03-06 03:36:47.865: VERBOSE/InputDevice(2486): ID[0]=0(0) Dn (0=>1) 03-06 03:36:47.865: INFO/Powe…...

huggingface的transformers训练bert

目录 理论 实践 理论 https://arxiv.org/abs/1810.04805 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;由Google在2018年提出。它是基于Transformer模型的预训练方法…...

计算机三级——网络技术(综合题第五题)

第一题 填写路由器RG的路由表项①至④。 目的网络&#xff0f;掩码长度输出端口输出端口172.19.63.192&#xff0f;30S0(直接连接)172.19.63.188&#xff0f;30S1(直接连接) 路由器RG的S0的IP地址是172.19.63.193&#xff0c;路由器RE的S0的IP地址是172.19.63.194。 【解析】…...

C#使用ASP.NET Core Razor Pages构建网站(三)

上一篇文章了解Razor Pages 链接&#xff1a;C#使用ASP.NET Core Razor Pages构建网站&#xff08;二&#xff09; 接下来继续了解ASP.NET Core Razor Pages构建网站的后续内容 一、将Entity Framework Core配置为服务 要在 ASP.NET Core 项目中配置 Entity Framework Core 服…...

R语言迅速计算多基因评分(PRS)

Polygenic Risk Scores in R 最朴素的理解PRS&#xff1a; GWAS分析结果中&#xff0c;有每个SNP的beta值、se值、P值&#xff0c;因为GWAS分析中将SNP变为0-1-2编码&#xff0c;所以这些显著的SNP的beta值&#xff0c;就可以用于预测。 比如&#xff1a;GWAS分析中&#xf…...

蓝桥杯刷题_day3

文章目录 DAY301字串判断闰年Fibonacci数列圆的面积序列求和 DAY3 01字串 【题目描述】 对于长度为5位的一个01串&#xff0c;每一位都可能是0或1&#xff0c;一共有32种可能。它们的前几个是&#xff1a; 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串。…...

Dubbo源码解析-Provider服务暴露Export源码解析

上篇我们介绍了ServiceBean初始化和依赖注入过程&#xff0c;地址如下 Dubbo源码-Provider服务端ServiceBean初始化和属性注入-CSDN博客 本文主要针Dubbo服务端服务Export过程&#xff0c;从dubbo源码角度进行解析。 Dubbo 服务端暴露细节流程比较长&#xff0c;也是面试过程中…...

在微信小程序中或UniApp中自定义tabbar实现毛玻璃高斯模糊效果

backdrop-filter: blur(10px); 这一行代码表示将背景进行模糊处理&#xff0c;模糊程度为10像素。这会导致背景内容在这个元素后面呈现模糊效果。 background-color: rgb(255 255 255 / .32); 这一行代码表示设置元素的背景颜色为白色&#xff08;RGB值为0, 0, 0&#xff09;&a…...

【JavaScript】JavaScript 程序流程控制 ⑥ ( while 循环概念 | while 循环语法结构 )

文章目录 一、while 循环1、while 循环概念2、while 循环语法结构 二、while 循环 - 代码示例1、打印数字2、计算 1 - 10 之和 一、while 循环 1、while 循环概念 在 JavaScript 中 , while 循环 是一种 " 循环控制语句 " , 使用该语句就可以 重复执行一段代码块 , …...

Keil笔记(缘更)

Keil 一、使用Keil时可能会出现的问题1.Project框不见了2.添加文件时找不到3.交换文件位置4.main.c测试报1 warning5.搜索CtrlF 二、模电常识(白话随便版)一、名词解释二、基础门电路 三、STLINK点灯操作1.配置寄存器进行点灯2.使用库函数进行点灯 四.GPIO1.LED闪烁4.按键控制L…...

举4例说明Python如何使用正则表达式分割字符串

在Python中&#xff0c;你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法&#xff0c;但它允许你使用正则表达式作为分隔符。 示例 1: 使用单个字符作为分隔符 假设你有一个由逗号分隔的字符串&#xff0c;你可…...

Java 中的 Math. round(-1. 5) 等于多少?

在 Java 中&#xff0c;Math.round() 方法用于四舍五入一个浮点数。这个方法的工作原理是&#xff0c;它会查看要舍入数值的小数点后第一位。如果这一位是 5 或更大&#xff0c;那么整数部分加 1&#xff1b;如果小于 5&#xff0c;整数部分保持不变。 对于 Math.round(-1.5)&…...

MFC界面美化第三篇----自绘按钮(重绘按钮)

1.前言 最近发现读者对我的mfc美化的专栏比较感兴趣&#xff0c;因此在这里进行续写&#xff0c;这里我会计划写几个连续的篇章&#xff0c;包括对MFC按钮的美化&#xff0c;菜单栏的美化&#xff0c;标题栏的美化&#xff0c;list列表的美化&#xff0c;直到最后形成一个完整…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...