Git

Git 工作区储藏

Posted by 暮夏有五 on 2021-02-01
Estimated Reading Time 4 Minutes
Words 1.3k In Total
Viewed Times

问题场景


现在有一个 master 分支,master 分支中有一个文件叫 01.txt ,该文件中只有一行数据,然后对 01.txt 执行 add 和 commit ,然后再从 master 分支中创建出一个新的分支 fa ,切换到 fa 分支上,然后向 01.txt 中再添加一行数据,添加成功之后,不做任何事情,再切换回 master 分支,此时用 cat 命令查看 01.txt 文件,发现竟然有两行数据,按理说 master 中的 01.txt 只有一行数据,而 fa 中的 01.txt 有两行数据,整个过程如下图:

gif

要搞清楚这个问题,得先明白下面这个问题:

cat 命令和 git 无关,就是用来查看文件的,我为了演示方便使用了 cat 命令,这和直接用记事本打开文件查看效果是一样的。

可能眼尖的小伙伴已经发现端倪了,我们上面这个操作少了两个步骤,那就是 add/commit ,fa 分支中的数据修改之后直接切换回了 master ,而没有 add/commit 。正常情况下(修改数据后 add/commit),如果 master 和 fa 分支中的数据不一致,我们执行了 git checkout - 进行分支的切换,这个时候工作区中的文件内容也是会跟着变化的(大家可以通过 cat 命令或者直接在记事本中打开工作区的文件来查看这种变化),但是如果我在 fa 分支中修改了文件却没有 add/commit 就切换回 master ,此时如果工作区的文件变化了,可能会导致我在 fa 分支中的修改丢失,因此,这个时候工作区的文件就没有变化,即工作区的文件内容还是 fa 分支中修改的内容。

解决这个问题,我们有两种方案,请小伙伴们往下看。

解决方案


方案一

第一种解决方案就是在某一个分支修改文件之后,先 add 并且 commit 之后再去切换分支,这个操作就比较简单了,我这里就不再演示了。

方案二(储藏)

第二种解决方案就是储藏 (Stashing),储藏适用在如下场景中:

当我在一个分支 fa 中修改了文件,但是还没有完全改好,此时我并不想 add/commit ,但是这个时候有一个更急迫的事情在另外一个分支 fb 上需要我去做,我必须要切换分支。

在这样一个场景中,如果我直接切换分支,会出现如下两个问题:

1.从 fa 切换到 fb 之后,工作区的代码还是 fa 的代码,不符合我的工作要求。
2.假设我不在乎问题 1,在 fb 中直接修改工作区的代码,等我在 fb 中修改完后提交后再回到 fa ,会发现我之前的代码丢失了。

为了解决这个问题,Git 给我们提供了储藏 (Stashing)。

现在假设一开始 master 和 fa 分支中的文件内容都是一致的,而且两个分支的工作区都是干净的,即没有东西需要 add/commit ,此时,我在 master 中修改了文件,修改完成之后,执行 git status 命令我们看到 master 中有东西需要 add/commit ,此时我想切换到 fa 分支中去,但是并不想对 master 分支执行 add/commit ,这个时候我们可以执行如下命令,先将当前分支中的文件储藏起来:

1
$ git stash

OK,执行完 git stash 命令之后,再执行 git status ,我们发现此时 master 分支已经是干净的了,此时我们可以愉快的切换到 fa 分支中去了,切换到 fa 分支之后,我们发现 master 中的修改并没有干扰到 fa 分支,当我们完成了 fa 分支中的工作之后,再回到 master 分支,此时执行如下命令可以恢复刚刚储藏的数据:

1
$ git stash apply

上面这个命令执行完之后,master 分支中的工作区中的文件就恢复了,此时执行 git status 就可以看到又有数据需要 add/commit 了。

我们也可将工作区储藏多次,这个时候我们可以执行如下命令来查看储藏:

1
$ git stash list

执行效果如下:

p255

git stash apply 表示恢复最近一次储藏,如果我们想恢复到之前的某一次储藏,可以加上储藏的名字,如下:

1
$ git stash apply stash@{1}

还有一些其他的关于储藏的命令:

恢复储藏并出栈

1
$ git stash pop

执行效果和 git stash apply 一样,不同的是,这里执行完之后,会将栈顶的储藏移除。

删除某一个储藏

1
$ git stash drop stash@{4}

最后一个参数是指储藏的名字。

更多干货请移步:https://antoniopeng.com


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !