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

news/2024/5/19 4:17:17/文章来源:https://blog.csdn.net/weixin_43297891/article/details/137023203

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 会保存所有的更改,包括未追踪的文件和忽略的文件。

在这里插入图片描述

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

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

相关文章

探索BPMN:业务流程模型与表示法

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【论文速读】| 对大语言模型解决攻击性安全挑战的实证评估

本次分享论文为&#xff1a;An Empirical Evaluation of LLMs for Solving Offensive Security Challenges 基本信息 原文作者&#xff1a;Minghao Shao, Boyuan Chen, Sofija Jancheska, Brendan Dolan-Gavitt, Siddharth Garg, Ramesh Karri, Muhammad Shafique 作者单位&a…

MATLAB机器学习工具箱——傻瓜式操作

一、使用回归学习器预测北京二手房房价 软件&#xff1a;MATLAB R2023 a 数据&#xff1a; 第一步&#xff1a;导入原始数据和待预测数据 第二步 &#xff1a;打开工具箱中的回归学习器导入学习数据 1.新建会话 2.寻找导入learning data 3.自动锁定前7列为自变量&#xff…

【计算机考研】408到底有多难?

你真以为大家是学不会408吗&#xff1f; 不是&#xff01;单纯是因为时间不够&#xff01;&#xff01;&#xff01; 再准确一些就是不会分配时间 408的知识其实并不难&#xff0c;要说想上130那确实有难度&#xff0c;但是100在时间充裕的情况下还是可以做到的 我本人是双…

数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;数据分析系统化教学&#xff0c;零基础到进阶实战 景天的主页&#xff1a;景天科技苑 文章目录 Streamlit什么是streamli…

[Linux_IMX6ULL驱动开发]-基础驱动

驱动的含义 如何理解嵌入式的驱动呢&#xff0c;我个人认为&#xff0c;驱动就是嵌入式上层应用操控底层硬件的桥梁。因为上层应用是在用户态&#xff0c;是无法直接操控底层的硬件的。我们需要利用系统调用&#xff08;open、read、write等&#xff09;&#xff0c;进入内核态…

RuleApp资源社区,知识付费社区,可对接typecho的小程序APP

强大的文章/社区/自媒体客户端&#xff0c;支持打包为安卓&#xff0c;苹果&#xff0c;小程序。包括文章模块&#xff0c;用户模块&#xff0c;支付模块&#xff0c;聊天模块&#xff0c;商城模块等基础功能&#xff0c;包含VIP会员&#xff0c;付费阅读等收费体系&#xff0c…

C程序编译、链接与项目构建

C程序编译、链接与项目构建 摘要C编译环境静、动态库介绍gcc与g和程序编译、链接Visual Studio创建和链接库动态库的显示调用Windows下显示动态库的加载/查找方式 Make介绍安装使用 CMake介绍安装使用构建方式内部构建外部构建构建使用静/动态库常用[系统]变量常用指令CMake模块…

PostgreSQL关系型数据库介绍与部署

使用背景 在过去的几年中&#xff0c;PostgreSQL的使用量逐渐增加&#xff0c;而Oracle和MySQL的使用量则有所下降。这主要是由于以下几个原因&#xff1a;开源和免费、功能丰富、可扩展性强、安全性高、跨平台支持好、社区活跃、成熟稳定。这些因素使得PostgreSQL成为了许多开…

2024/3/23打卡数组分割(第14届蓝桥杯)——二项式+快速幂

题目 思路 分析该题&#xff0c;要将集合 划分成两个子集 &#xff0c;且两个子集的和都是偶数。 可知&#xff1a;偶数 偶数 偶数&#xff1b;偶数 奇数 奇数&#xff1b;奇数 奇数 偶数&#xff1b; 分析可得&#xff1a;如果该集合的和为奇数&#xff0c;就不能分…

八、C#计数排序算法

简介 计数排序是一种非比较性的排序算法&#xff0c;适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数&#xff0c;然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。 创建一个长度为max-min1的数组count…

IP如何异地共享文件?

【天联】 组网由于操作简单、跨平台应用、无网络要求、独创的安全加速方案等原因&#xff0c;被几十万用户广泛应用&#xff0c;解决了各行业客户的远程连接需求。采用穿透技术&#xff0c;简单易用&#xff0c;不需要在硬件设备中端口映射即可实现远程访问。 异地共享文件 在…

Calico配置路由反射器 (RR) 模式

RR介绍 在 Calico 网络中&#xff0c;默认使用 Node-to-Node Mesh 全互联模式&#xff0c;即集群中的每个节点之间都会相互建立 BGP 连接&#xff0c;用于路由交换。然而&#xff0c;随着集群规模的扩大&#xff0c;全互联模式会导致连接数成倍增加&#xff0c;产生性能问题。为…

Linux 注入依赖环境

文章目录 配置依赖程序安装 JDK安装 Tomcat安装 mysql 配置依赖程序 下面配置依赖程序都以CentOS为例。 安装 JDK 可以直接使用 yum(CentOS) 直接进行安装。 先搜索&#xff0c;确定软件包的完整名称。 yum list | grep jdk再进行安装 进行安装的时候一定要先确保处在“管理…

前端学习--品优购项目

文章目录 前端学习--品优购项目1.案例铺垫文件建立与命名必备文件网站favicon图标网站TDK三大标签SEO优化常用命名 2.LOGO SEO优化3.实际代码4.申请免费域名 前端学习–品优购项目 1.案例铺垫 文件建立与命名 一个项目中为了方便实用和查找内容会有多个文件夹&#xff0c;比如…

idea插件开发案例:将批量插入方法转换成分批批量插入

代码: idea-plugin-demo 1.背景 excel导入时都会使用批量插入或者批量更新到数据库&#xff0c;这在mysql下没有问题。 但因为公司国产化需求&#xff0c;换成达梦数据库就不行了&#xff0c;报sql超长。 一开始想写mybatis拦截器处理&#xff0c;又怕出现bug&#xff0c;这个问…

MySQL为什么会选错索引

在平时不知道一有没有遇到过这种情况&#xff0c;我明明创建了索引&#xff0c;但是MySQL为何不用索引呢&#xff1f;为何要进行全索引扫描呢&#xff1f; 一、对索引进行函数操作 假设现在维护了一个交易系统&#xff0c;其中交易记录表 tradelog 包含交易流水号(tradeid)、交…

Ubuntu 中如何选择Java版本

如何在 Ubuntu 上安装多个版本的 Java 首先&#xff0c;我们得检查一下你的系统里是否已经装了 Java。这个很简单&#xff0c;只需运行下面这条命令&#xff1a; 在 Linux 上安装 Java 的实战示例update-java-alternatives --list 输出结果&#xff1a; 检查是否安装了 Java…

存储的过程

一、存储过程 1.1 概述 存储过程可以轻松而高效的去完成这个需求&#xff0c;有点类似shell脚本里的函数 1.2 特点 存储过程在数据库中创建并保存&#xff0c;它不仅仅是 SQL 语句的集合&#xff0c;还可以加入一些特殊的控制结构&#xff0c;也可以控制数据的访问方式。存储过…

lora-scripts 训练IP形象

CodeWithGPU | 能复现才是好算法CodeWithGPU | GitHub AI算法复现社区&#xff0c;能复现才是好算法https://www.codewithgpu.com/i/Akegarasu/lora-scripts/lora-trainstable-diffusion打造自己的lora模型&#xff08;使用lora-scripts&#xff09;-CSDN博客文章浏览阅读1.1k次…