草庐IT

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

無昂博奥 2023-10-15 原文

git stash命令

无意间从同事那里听到stash这个命令。于是想到之前遇到的切换分支时遇到的文件状态的问题,所以花了点时间整理了以下笔记,来加深对此命令的认识。

有时,当你在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情。 问题是,你不想仅仅因为过会儿回到这一点而为做了一半的工作创建一次提交。 针对这个问题的答案是 git stash 命令。

贮藏(stash)会处理工作目录的脏的状态——即跟踪文件的修改与暂存的改动——然后将未完成的修改保存到一个栈上, 而你可以在任何时候重新应用这些改动(甚至在不同的分支上)。From Git Book

以前未接触到stash时的做法是使用git add和git commit 来暂存,这样做的弊端是会出现很多多余的commit记录。

创建分支

使用git branch dev来创建dev分支。

如果使用git checkout -b develop表示创建分支并切换到develop分支。

问题复现

在master分支已经做了一些提交,这个时候想要切换到dev分支。

如果修改的文件未提交时,当切换分支的时候会提示以下错误信息

error: Your local changes to the following files would be overwritten by checkout:
	README.md
Please commit your changes or stash them before you switch branches.
Aborting	
英文大意:当切换分支的时候,你当前修改的文件将会被覆盖,所以git需要你先提交你的变动或者在你切换分支之前暂存它们。

根据提示有两种解决方案

  1. 提交当前的变动(此方案会多出来一条提交记录)

    git add .
    git commit -m "切换分支之前暂存变动"
    
  2. 使用stash命令,此操作会将你当前工作区已修改未提交的内容暂存起来。并且以上一次提交的commit 信息作为记录。

    git stash
    

返回master分支

stash list

列出所有的暂存记录。

git stash list

如果在dev上已经解决了问题,这个时候想要回到master,并且想要恢复切换之前的文件状态。可以使用以下两种方式:

stash pop

pop命令会将暂存的文件从存储的栈中取出来,并从栈中删除暂存的记录。

git stash pop

stash apply

apply会从栈中取出暂存的文件状态,但不会删除暂存的记录。

如果不指定暂存,apply会默认从最近的暂存记录。

git stash apply

apply指定取出栈中哪一条记录

git stash apply stash@{1}

stash drop

删除指定的一条暂存记录。

git stash drop  stash@{1}

疑问

使用git branch dev创建分支之后,如果继续在master分支修改README.MD文件。然后使用git checkout dev分支,此时的结果是:

这个时候只是提示README.md被修改了,如果此时在dev分支上继续修改README.md文件,并使用git commit 提交修改。然后再切换到master分支,会发现master当前的工作区并不是恢复到切换dev分支之前的状态(修改了README.md的状态),而是恢复到了master分支最近一次提交的状态。

捋一捋:

  1. 创建dev分支,并且继续在master分支修改文件,然后切换到dev分支,此时文件的状态是已修改状态,当前HEAD指针指向dev分支

  2. 在dev分支上提交已修改的文件,此时的HEAD指针

  3. 然后继续修改文件,此时如果再没有暂存的情况下想要切换到master分支就会出现以下异常:

    error: Your local changes to the following files would be overwritten by checkout:
    	README.md
    Please commit your changes or stash them before you switch branches.
    Aborting	
    

所以总结下来,如果分支和主分支不在同一个commit时。来回切换分支时才会提示stash。如果在同一个commit时修改文件,切换分支后,已修改的文件会继续存留在分支。

不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。

没有解决不了的问题,只是我们暂时还没有找到好的解决问题的方法。

有关error: Your local changes to the following files would be overwritten by checkout:的更多相关文章

  1. ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error? - 2

    我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby​​常量:Content2而不是content2。Aconstantnamestart

  2. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  3. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  4. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  5. ruby-on-rails - 冒号(:) gives load error in locale YAML file - 2

    我在en:语言环境中有一个字符串display_device:toplay:getplayer冒号给我的错误是cannotloadtranslationsfromC:/DocumentsandSettings/rajg/discoveryaws/branches/internationalization/config/locales/en.yml,expectedittoreturnahash,butdoesnot我怎样才能让它工作? 最佳答案 如果你用这样的引号将它括起来,你可以在你的字符串中转义冒号(和其他“重要”字符):dis

  6. ruby - gem install pg error : couldn't understand kern. osversion `14.0.0' on Yosemite w/Ruby 2.1.5 - 2

    我使用RVM安装Ruby-2.1.5并再次运行bundle。现在pggem不会安装,我得到这个错误:geminstallpg-v'0.17.1'----with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_configBuildingnativeextensionswith:'--with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_config'Thiscouldtakeawhile...ERROR:Error

  7. ruby-on-rails - 32651 :ERROR comparison of Float with Float failed ruby - 2

    我是Rails的新手,我遇到了一个错误,但我似乎找不到问题所在。这是日志:[32651:ERROR]2012-10-0913:46:52::comparisonofFloatwithFloatfailed[32651:ERROR]2012-10-0913:46:52::/home/sunny/backend/lib/analytics/lifetime.rb:45:in`each'/home/sunny/backend/lib/analytics/lifetime.rb:45:in`max'/home/sunny/backend/lib/analytics/lifetime.rb:45

  8. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  9. 【RuntimeError: CUDA error: device-side assert triggered】问题与解决 - 2

    RuntimeError:CUDAerror:device-sideasserttriggered问题描述解决思路发现问题:总结问题描述当我在调试模型的时候,出现了如下的问题/opt/conda/conda-bld/pytorch_1656352465323/work/aten/src/ATen/native/cuda/IndexKernel.cu:91:operator():block:[5,0,0],thread:[63,0,0]Assertion`index>=-sizes[i]&&index通过提示信息可以知道是个数组越界的问题。但是如图一中第二行话所说这个问题可能并不出在提示的代码段

  10. ruby-on-rails - Rails 新手 : Recommendations for error handling in controller - 2

    抱歉,如果问题很明显,我才刚刚开始使用Rails。我现在在几个Controller方法中有以下代码:respond_todo|format|if@project.saveformat.html{redirect_to(edit_project_url(@project),:notice=>'#{user.name}addedto#{role}.')}format.jselseformat.html{render:action=>"edit"}format.js#...endend那么问题来了,对于所有方法中的错误,最好的方法是什么?是否建议我使用save!并在rescue_action

随机推荐