git 暂存当前分支修改,切换到别的分支

news2025/1/15 17:19:28

收藏,原文链接Git学习记录-git保留/丢弃当前分支修改并切换至其他分支 - 爱写bug的程序员 - 博客园 (cnblogs.com)

笔者在本地终端进行 git 工作目录的相关处理时,遇到由于某种情况需要使用 git checkout 命令切换到其他分支的情景。此时,若已经对当前分支做了一定的修改,则直接切换分支时 git 会提示错误信息。本文即总结下笔者目前了解和使用的 git 切换到其他分支冲突时的解决方案。

问题

  当本地遇到特殊情况,需要切换到其他分支时,当前分支可能会存在以下两种可能:

  (1) 对当前分支并未进行任何修改,从而可以直接使用 git checkout 命令切换到其他分支。

    git checkout test        //切换到 test 分支

  (2) 若当前的分支已经做了一定的修改,则直接进行分支切换时,git 会产生如下错误信息。这是由于已经对当前分支进行了修改,但尚未保存而导致的。

  error: Your local changes to the following files would be overwritten by checkout : xxxx 

  Please commit your changes or stash them before you switch branches

  下面描述当前分支存在修改时,切换到其他分支的解决方案。具体而言,选择包括简单的丢弃当前分支的修改和保存当前分支信息,待其他分支完成后再进行恢复等,用户可根据不同的需要选用不同的方案。

丢弃本分支的修改

  下面的方法直接将当前分支相对上一次提交时的修改丢弃,从而可以从当前分支切换至其他分支,主要适合于对当前分支的改动较少,且不存在丢弃修改产生的问题的情况。用户可以使用不同的命令实现丢弃本地分支的修改。

  通过 git checkout -f 命令强制切换分支

  当用户对当前分支的修改不是特别重要或觉得没有保留的必要时,可以使用 git checkout 命令强制切换到其他分支。再切换回该分支时,会直接退回到该分支上一次提交时的数据版本。

    git checkout -f test        //强制切换至 test 分支,丢弃当前分支的修改

  通过 git reset --hard 回退至某次提交时的数据

  如果只需要保持当前分支上一次提交时的数据,而不需要目前添加的任何修改,可以使用 git log 查看当前分支的提交记录。再通过 git reset --hard 命令将当前分支回退到前一次提交时的数据,此时当前分支针对上一次提交的修改均被抹除,注意 git reset --hard 在运行时不会有提示,所以使用前请保证新增的修改是可丢弃的。

  通过 git log 查看当前分支的提交记录。

    git log        //当前分支的提交记录,信息包括提交对应的 哈希值 作者 邮箱 日期 描述 等

  通过 git reset --hard 命令回退到某一次提交的版本,上述命令只需要使用特定提交的哈希值的开始若干位作为参数,即可退回该提交时的数据。

    git reset --hard a13f52f3        //当前分支数据重置到哈希值开始部分为 a13f52f3 的提交的数据,git reset --hard 参数为某次提交时的哈希值的开始部分

  当重置完成后,当前分支的数据即为被 git 记录的未经修改的数据,此时可以直接通过 git checkout 命令切换到其他分支,而不会再产生报错。

  

  通过 git checkout -- 命令忽略文件的修改

  当使用 git status 查看当前分支的文件状态时,对于不同的文件状态,git status 会提示该状态下的文件可以使用的对应 git 命令,如下图所示。

  

  可以看到,对于处于 Changes to be commited 状态的文件( 该状态的文件在使用 git commit 命令时即被提交 ),可以通过 git reset HEAD 命令将文件从 Changes to be commited 状态退出。

    git reset HEAD test.txt        //将 test.txt 从 Changes to be committed 状态退出

  对于 Changes not staged for commit 状态的文件,表示这些文件虽然被修改,但并没有被加入 Changes to be commited 状态,即使用 git commit 命令提交时,这些修改不会被记录。针对这类文件可以有两种选择。可以使用 git add 命令将这些修改放入 Changes to be committd 状态,或者通过 git checkout -- 命令忽略该文件的修改,使其回退到上一次提交时的状态。( git 中不同文件的状态可以参见笔者的另一篇笔记git 学习记录—— git 中的仓库、文件状态、修改和提交操作等 )

    git add test.txt                //将 test.txt 文件加入 Changes to be committed 状态,在使用 git commit 命令时上述修改即被提交
    git checkout -- test.txt        //丢弃对 test.txt 的修改,其内容回退到上一次提交时的状态

  无法直接切换其他分支的原因即是存在未被保存的修改。此时若想要丢弃当前分支的修改,直接使用 git checkout -- 命令将文件修改丢弃即可。该方法主要适用于产生的改动比较少且相对不重要的情况。

    git checkout -- test.txt        //丢掉 test.txt 文件新增的修改 

保留当前分支的修改

  另外一种进行切换的选择是先将当前分支的修改保存,再切换到其他分支,这样在其他分支的任务完成后,重新切换至当前分支时,可以继续当前分支的工作。

  直接提交当前分支  

  最简单粗暴的方法即通过 git commit 命令将当前分支的修改进行提交。首先通过 git status 命令查看当前分支各个文件的状态,git status 命令还会显示不同文件状态下 git 可执行的命令,用户可以直接参考。

    git status              //当前分支各文件的状态

  通过 git add 命令将修改后的文件转化为 staged 状态,即文件的修改将处于 Changes to be committed 状态,再通过 git commit 命令将本分支的修改提交。

    git add test.txt        //将此时的 test.txt 文件添加至 Changes to be committed 状态

  在所需的修改均加入 Changes to be committed 状态后,可以通过 git commit 命令将本分支的修改提交。不需要的修改通过上文提到的 git checkout -- 命令重置即可。

    git commit -m "description for this commit"    //提交本次修改

  将当前分支修改暂存

  在任务推进过程中,可能遇到需要切换到其他分支进行处理的情况。但是对应的,对于当前分支的修改可能并不足以达到需要进行一次提交的程度,此时更合适的方案是将本分支修改暂存,然后切换到其他分支进行工作,待其他分支的任务完成后,再切换回本分支,并将暂存的方案恢复,进而继续本分支的修改。

  git 中提供 git stash 命令来完成上述功能,也就是上文提到的错误提示中 "Please commit your changes or stash them before you switch branches" 中所提到的 stash 修改的方案。

  暂存修改

  通过 git stash 命令将当前分支的修改暂存。经过 git stash 命令暂存修改的数据后,再使用 git status 命令可以看到文件的状态均处于未修改的状态( 而不再是修改未提交状态 )。

    git stash              //暂存本分支的修改

   如笔者通过 git stash 命令,会显示对应的 "Saved working directory and index state WIP on master :xxxxxxx" 信息。用户可以多次使用 git stash 命令,暂存的状态会以栈的形式存放。

  查看暂存信息

  可以通过命令 git stash list 查看已经暂存的数据。 可以看到暂存的数据通过 stash@{n} 的形式索引已经存储的修改数据。

    git stash list        //显示所有 stash 的数据

  恢复修改

  当在其他分支的任务完成切换回当前分支后,可以使用 git stash apply 命令恢复之前被暂存的数据。

    git stash apply                //恢复最近一次暂存的修改
    git stash apply stash@{2}      //恢复索引 stash@{2} 对应的暂存的修改,索引可以通过 git stash list 进行查看

  这里需要注意的是,通过 git stash apply 命令只会将暂存的数据恢复至 "Changes not staged for committed" 状态,即使之前修改状态中已经有文件处于 staged 状态( Changes to be committed ).为了 git 能够将文件尽可能恢复至暂存之前的状态,可以加入 --index 参数。

    git stash apply --index        //在恢复暂存数据时尽量恢复至原状态( 已经 staged 状态的文件仍恢复为 staged 状态 )

  删除修改

  可以通过 git stash pop 或者 drop 命令删除对应的缓存数据。

    git stash drop stash@{1}        //删除 stash@{1} 分支对应的缓存数据
    git stash pop                   //将最近一次暂存数据恢复并从栈中删除

  git stash 将用户做过的修改存放在本次 git stash 产生的暂存数据中,并将已经修改的文件恢复至未修改状态。当用户恢复暂存数据时,则将上述修改应用到当前分支上。

  在本文的情景中,即将当前分支的修改通过 git stash 保存,此时当前分支恢复至未被修改之前的状态,而修改被 git stash 以栈的方式保存,可通过索引的方式访问。用户此时可以没有错误的切换至其他分支( 文件均处于未修改状态 ),待其他分支的任务完成后,再切换回本分支。此时通过 git stash apply 将被暂存的修改应用到当前分支,则当前分支的数据即被恢复至离开当前分支前的状态。

  从原理也可以看出,git stash apply 实际是可以应用到任意分支的,此时执行的操作是将 git stash 保存的修改合并到 git stash apply 时用户所在的分支和文件,当合并存在问题时,git 会产生报错。

 

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

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

相关文章

3 - 线程池 Java内置的线程池 - ExecutorService

1、ExecutorService的介绍 ExecutorService 接口继承了Executor 接口,是Executor 的子接口。 Executors类 提供工厂方法用来创建不同类型的线程池。Executors是工具类,他提供对ThreadPoolExecutor的封装,会产生几种线程池供大家使用。 关于…

derby 转 mysql

背景 nacos使用standalone方式启动,数据存储到内置的derby数据库中,现在要更改为集群启动,原数据要转成mysql。 执行过程 1.nacos内置的derby数据打包后放到本地 tar -cvf data.tar nacos/data/derby-data 2.通过idea添加Apache Derby&a…

【区块链】Ankr被黑引发的思考

机会 三明治交易、夹子机器人、抢跑、抢新、抢购、秒杀,相信这些词你都听说过了,区块链上的各种套利操作,基本上都有一个大前提,就是监听链上最新的未打包交易,才能在第一时间抢占先机。 前段时间Ankr被黑&#xff0…

进阶 - Git的自定义

Git的自定义 忽略特殊文件 有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不…

大学生网页制作期末作业——html+css+javascript+jquery旅游官网6页 html大学生网站开发实践作业 web网页设计实例作业

👨‍🎓静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计👩‍🎓,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

java alibaba fastjson自定义序列化反序列化(教你解决问题思路)

大家版本不一样方式可能不一样,我不管你的fastjson版本是哪个,按照我这个思路去弄就行 写一个JSONObject类,导入fastjson的JSONObject,然后CTRL鼠标左键点进去看JSONObject源码,然后点击IDEA的左上角select opened fil…

掘金量化如何精准选股?

说起掘金量化如何精准选股的这个问题,相信大家也很期待,就比如说我们在量化投资中,一方面对股票的涨跌是需要灵活的去判断,才能知晓这其中有哪些是我们应该选择的股票,但是要自己去观察,也是很麻烦&#xf…

【Python项目】毕业设计必备,Python基于面向对象+tkinter打造学生信息管理系统 | 附源码

前言 halo,包子们上午好 很多学计算机的小伙伴应该都知道,毕业设计是一个头疼的东西 今天的话小编这边给大家准备好了一个Python基于面向对象tkinter打造学生信息管理系统 这不是毕业设计必备项目 说实话操作起来还是有那么一点点的难度的,但…

Spring Boot源码学习:自动配置与自定义注解详解

入门 RestContrller :此注解标记的类下的 所有 方法均会返回一个 domain 对象以代替视图Controller、ResponseBody 的缩写使用 Jackson2 以及 MappingJackson2HttpMessageConverter 类自动转换对象为 JSONSpringBootApplication:快捷注释,包含以下内容C…

“新十条”来了,精准防控是为了“行稳致远”

文|螳螂观察 作者|松雅湖、小江 形势正在快速变化,朝越来越好的方向。 12月7日,国务院联防联控机制发布防疫“新十条”措施,指向精准,要求明确,既要疫情防控精准化、科学化,也要防疫成果“行稳致远”&am…

sentence Bert解读及代码示例

0-前序 Bert已经是相当6了,但在STS(语义文本相似性)任务中,需要将两个句子都输入到网络中,也就是说要过模型,这样计算量就大了。如下是文本相似性,并不是语义。 from transformers import Ber…

RabbitMQ、RocketMQ、Kafka 三大组件详细教程,一文带你学完全部知识

RabbitMQ RabbitMQ各组件的功能 Broker :一个RabbitMQ实例就是一个BrokerVirtual Host :虚拟主机。相当于MySQL的DataBase,一个Broker上可以存在多个vhost,vhost之间相互隔离。每个vhost都拥有自己的队列、交换机、绑定和权限机…

项目执行管理的8个步骤

常言道:说起来容易,做起来难。在项目执行过程中,许多事情可能会出错。这就是为什么执行过程中的监控和跟踪很重要。 项目执行,如同项目管理一样,被分解成若干步骤,以确保你不会忽视任何关键的东西。八个项…

如何查看Chrome浏览器的页面缓存内容【详细教程】

如何查看浏览器页面缓存内容——代码&控制台知识调用前言引入控制台输入代码查看在控制台application查看知识调用 文章可能需要用到的知识🔥🔥🔥浏览器缓存有哪些(通用缓存有哪些) 前言引入 浏览器有多种缓存&a…

C++/Qt编程规范

文章目录一、头文件规范二、变量命名三、信号和槽四、注释一、头文件规范 在编码中对头文件的引用,建议按照以下顺序进行: 1)类定义头文件 2)其他库头文件 a)Qt模块头文件 b)XTAL平台框架模块头文件 c)第三方库头文件 d)自定义公共库头文件 二、变量命…

Linux7层负载均衡-Haproxy

Linux7层负载均衡 概述: 是一款高性能的负载均衡软件。 因为其专注于负载均衡这一些事情, 因此与nginx比起来在负载均衡这件事情上做更好,更专业。 特点: •支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能…

【KNN分类】基于模拟退火优化KNN、蝗虫算法优化KNN实现数据分类附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

web课程设计网页制作:基于html实现传统文化壁画手工艺带psd设计图(15页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【Day3】每日学Java--》详解java中的static成员

大家好,我是良辰丫,今天我和大家分享的是java中的static成员,static说难不难,说简单也不简单,主要是细节,很多情况下,你使用了static,却不知道为什么会报错,嘿嘿嘿&#…