7. Git stash命令

前言

该文章只是记录了一些自己的见解,可能并不准确,只是为了学习时的一些记录,不喜勿喷,谢谢

该篇主要介绍命令 git stash 的使用,该命令应用于什么场景呢?如下所述

在我们的企业开发中,存在多个分支,比如有一个线上环境的master,有一个用于研发的dev分支,假设我们有一个需求,正在dev分支中编写代码,当我们写到一半的时候,突然发下线上环境中有一个严重的bug,必须马上解决,此时我们不能立马切回到master分支进行修改,否则,写到一半的代码都会丢失。此时就可以使用 git stash命令来帮忙了。

git stash 命令能将当前工作空间的修改都保存起来,还原到当前分支的最新代码,然后在需要的时候在使用命令将之前保存的修改全部还原回来。

借助一篇博客的更清晰的说明就是:https://blog.csdn.net/stone_yw/article/details/80795669

总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容

下面,我们来演示一下,如何将修改的代码进行保存起来。

1. git stash

[root@huangzb mygit]# git branch
* master
  new_branch
[root@huangzb mygit]#
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout new_branch
Switched to branch 'new_branch'
[root@huangzb mygit]# ll
total 8
-rw-r--r-- 1 root root 24 Mar 27 18:15 a.txt
-rw-r--r-- 1 root root 12 Mar 27 18:15 b.txt
[root@huangzb mygit]#
[root@huangzb mygit]# echo 'hello b' > a.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        a.txt
Please, commit your changes or stash them before you can switch branches.
Aborting
[root@huangzb mygit]#
 

上图中,在新分支中修改了已存在的文件,然后进行切换分支的时候出现了异常,就是存在修改的文件,要么保存要么提交。下面我们来演示 如何保存

也许有些人问两者处于不同分支,为什么不直接提交代码后,再切换分支?

其实可以提交代码后再切换分支 ,但是这里是为了模拟我们的前提,假设现在代码没写完,不能提交的情况

下面我们来使用 git stash 命令来保存操作,如下图:

[root@huangzb mygit]# git stash
Saved working directory and index state WIP on new_branch: 0dae8a5 create b.txt
HEAD is now at 0dae8a5 create b.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git status
# On branch new_branch
nothing to commit, working directory clean
[root@huangzb mygit]# git checkout master
Switched to branch 'master'
[root@huangzb mygit]#
 

从上图可以看到,使用 git stash 命令后先将对文件的修改进行了保存。其实单纯的使用 git stash 来保存操作,使用的默认规则生成的备注,当然我们也可以自己自己指定备注消息,

2. git stash save [message]

使用 git stash save 命令来指定备注进行保存

操作如下:

[root@huangzb mygit]# echo 'hello c' > a.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git stash save '将a.txt 内容覆盖为 hello c'
Saved working directory and index state On new_branch: 将a.txt 内容覆盖为 hello c
HEAD is now at 0dae8a5 create b.txt
[root@huangzb mygit]#
 

那么,我们保存了之后,如何看到记录呢,就可以使用下面的命令了 git stash list

3. git stash list

使用命令 git stash list 来查看

当我们使用 git stash 命令将指定操作保存之后,会形成一条记录,那么我们如果想要查看当前分支中的记录列表,可以使用命令 git stash list 来查看,操作如下图:

[root@huangzb mygit]# git stash list
stash@{0}: On new_branch: 将a.txt 内容覆盖为 hello c
stash@{1}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]#

从上图中可以看出,有两条保存记录,而且展现了不同的消息备注,而且,可以看到 这记录的保存的方式在git中使用了 栈的数据结构,先进后出的方式。最上面的一条记录就是最近的提交。

那么虽然我们可以看到提交的列表,但是,我们如何看到保存的内容呢

可以使用 git stash show 命令来看

4. git stash show

可以使用 git stash show 命令来查看最近的保存的文件的差异情况

操作如下:

[root@huangzb mygit]# git stash show
a.txt | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

从上图来说,只能看到 哪个文件修改了,以及删除了多少行,新增了多少行,看不来什么东西,此时可以添加参数 -p 来看的更加清除,来试试

[root@huangzb mygit]# git stash show -p
diff --git a/a.txt b/a.txt
index 40f4dc0..947f8df 100644
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1 @@
-hello 1
-hello 2
-hello 3
+hello c
 

添加了-p 参数后,可以看到非常清楚。

之前我们保存了操作,之前需要切换分支去做别的事情,现在事情做完了,需要将原有的数据还原,继续工作,此时怎么操作?即如何将保存的数据进行还原

可以使用命令 git stash pop

5. git stash pop

将保存的记录中的最近的一次保存来进行还原,类似于java中栈的 弹栈操作,获取最近的数据,且删除记录

我们来看看效果,操作如下图:

[root@huangzb mygit]# git stash list
stash@{0}: On new_branch: 将a.txt 内容覆盖为 hello c
stash@{1}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]# cat a.txt
hello 1
hello 2
hello 3
[root@huangzb mygit]#
[root@huangzb mygit]# git stash pop
# On branch new_branch
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1c809fc6d4936282af1e4177c3e99dc456b3da75)
[root@huangzb mygit]# cat a.txt
hello c
[root@huangzb mygit]# git stash list
stash@{0}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]#
 

由上图可知,本来list中有两条记录,使用了 pop命令后,发现 文件 a.txt 内容还原到了保存之前的状态,再次使用命令 git stash list 后可以看到只有一条记录了,且删除的是之前最上层的记录,因此总结一下 git stash pop 命令的特点

  1. 还原最近的数据
  2. 删除记录

那么pop命令是还原最近的操作,如果想要还原到list列表的其中的某一个时刻的记录该怎么操作呢,就可以使用命令 git stash apply了。

6. git stash apply [stash名字]

使用命令 apply 还原指定名字的记录,如果不写名字,默认还原list列表的最近一条。但是该命令只还原数据,不清楚记录。

操作如下图:

[root@huangzb mygit]# git stash list
stash@{0}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]#
[root@huangzb mygit]#
[root@huangzb mygit]# git stash apply stash@{0}
error: Your local changes to the following files would be overwritten by merge:
        a.txt
Please, commit your changes or stash them before you can merge.
Aborting
[root@huangzb mygit]#
 

由上图可知,使用命令后发现异常了,是因为之前我们使用命令将最近的操作进行了还原,此时工作空间不是干净的状态,所以不能在还原另一个保存的记录,因此,需要首先将当前的操作进行保存或者丢弃,这里我们先进行保存后在来 还原历史记录,操作如下:

[root@huangzb mygit]# git commit -am 'stash first'
[new_branch a8d8b2a] stash first
1 file changed, 1 insertion(+), 3 deletions(-)
[root@huangzb mygit]#
[root@huangzb mygit]# git status
# On branch new_branch
nothing to commit, working directory clean
[root@huangzb mygit]#
[root@huangzb mygit]# git stash apply stash@{0}
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
[root@huangzb mygit]# cat a.txt
<<<<<<< Updated upstream
hello c
=======
hello b
>>>>>>> Stashed changes
[root@huangzb mygit]#
 

可以看到,我们保存记录后,再还原最初的操作,还原后发现文件冲突了,下面解决冲突即可

[root@huangzb mygit]# echo 'hello aa' > a.txt
[root@huangzb mygit]# git commit -am '解决冲突'
[new_branch c26203d] 解决冲突
1 file changed, 1 insertion(+), 1 deletion(-)
[root@huangzb mygit]# git status
# On branch new_branch
nothing to commit, working directory clean
[root@huangzb mygit]#
 

这里我就简单粗暴的解决下冲突就行了。重点是我们再来看看 list中是否还有记录

[root@huangzb mygit]# git stash list
stash@{0}: WIP on new_branch: 0dae8a5 create b.txt
[root@huangzb mygit]#

我们发现,即使使用命令 apply 还原了操作后,任然还有记录,所以可以总结出 apply和pop操作的不同点:

  1. pop命令是只能还原最近的一次记录,不能指定记录名还原,而apply可以指定记录名来还原
  2. pop命令还原操作后,同时会删除记录,而apply只是还原数据,记录不会删除

此时,现在list中的记录对于我们来说没有什么大的必要了,如果我们想要删除掉,该怎么办呢?

可以使用命令 git stash drop [stash名字] 来删除记录

7. git stash drop [stash名字]

使用drop命令来删除指定消息名称的记录

操作如下:

[root@huangzb mygit]# git stash drop stash@{0}
Dropped stash@{0} (f56c4829229393701a666f0d198f467f592e54a1)
[root@huangzb mygit]#
[root@huangzb mygit]# git stash list
[root@huangzb mygit]#
 

当然,如果在记录很多的情况下,一个一个的删除比较麻烦,可以一次性的删除所有的记录

8. git stash clear

在记录很多的情况下,一个一个的删除比较麻烦,可以一次性的删除所有的记录

由于当前list中没有数据了,所以就不演示了,比较简单

posted @ 2020-04-13 14:55  风中追风_lonely  阅读(338)  评论(0编辑  收藏  举报