git stash命令

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

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

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

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

创建分支

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

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

问题复现

在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
    

    image-20220111085427655

返回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}

image-20220111112433992

疑问

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

image-20220111101136998

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

捋一捋:

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

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

    image-20220111103234405

  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	
    

    image-20220111103614502

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

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

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐