Day25|【Git】git stash 暂存档案

可能会遇到使用 git stash 指令情境:

  • 假想今天可能在公司进行手中任务时,突然接收到老板或是合作夥伴的紧急求救,请你立刻放下目前工作,改进行新的棘手任务,那麽目前的任务要怎麽保存进度呢?让你在完成临时任务後可以切换回到当初进行的部份?

  • 先前有提到在合并 merge 或是提交到 GIt 时,有可能会发生冲突的情况,会出现以下讯息提示:

    commit your changes or stash them before you can merge.

当遇到以上情形,需要先告一段落,处理其他事情再返回继续开发的时候,我们可以使用两种方式来达到我们的需求。

  1. git addgit commit → 处理其他事情後回来 → git reset
  2. git stash 暂存档案

方法一 |提交一个 commit 版本,处理完後再回来

先将所有的修改保存下来 - git add -all
可以采用先前习惯的方式保存目前的进度。先使用 git add 指令加至暂存区後,後使用 git commit 指令提交,如此一来可以先当作是一个 commit 版本,只是特别注意这是我们进行一半的版本,之後再继续完成这个任务即可。

$ git add -all # 将目前修改内容加至暂存区
$ git commit -m"undone files" #提交到数据库,并注明这是尚未完成的档案

首先这是我目前手中进行的档案内容(已有 git init 建立 Git 版本控制)

https://ithelp.ithome.com.tw/upload/images/20211005/20141010xyWA0lmUzo.png

https://ithelp.ithome.com.tw/upload/images/20211005/201410104ednTBrMlH.png

将目前进度加至暂存区 git add

https://ithelp.ithome.com.tw/upload/images/20211005/201410103bm34cs7w6.png

使用 git commit 指令将档案提交,并注解这是「未完成的档案」

https://ithelp.ithome.com.tw/upload/images/20211005/20141010dzDLntQJW0.png

因为接下来要进行临时任务,先假设那个临时任务是在我的另一个分支上,假使忘记分支有哪些,可以使用 git branch 指令查看现有的分支。

$ git branch # 检视分支

检视分支後,知道另一分支是 a_branch ,之後使用切换分支的指令,将临时任务完成。

a_branch 分支是先前练习 git 时,就有建立好的分支,因此在这里也可以自己新增分支来修改临时任务,或是切换到实际任务的分支上。

https://ithelp.ithome.com.tw/upload/images/20211008/20141010xxh7x08RZU.png

https://ithelp.ithome.com.tw/upload/images/20211005/20141010EtauRxV4ZI.png

确保提交好进度中的档案後,就可以使用切换分支的指令将分支切到我们需要完成的任务分支,等完成後再切回原来的分支,并进行 Reset 即可喔!

Reset 是因为先前的文章有提到过,可以将 HEAD 切换到上一次更新的 Commit 版本,如此一来我们就可以得到先前完成一半的进度,并持续将它完成。

切换到 a_branch 分支 - git checkout 指令

$ git checkout a_branch # 切换到 a_branch 分支

https://ithelp.ithome.com.tw/upload/images/20211005/20141010WGIM7jVVYo.png

等临时任务完成并提交後,我们可以再次切换回原来的分支,并使用以下指令回到上次提交前的版本。

$ git reset HEAD^ 

https://ithelp.ithome.com.tw/upload/images/20211005/20141010RQwx25WUBy.png

如此一来就可以继续完成上次尚未完成的动作罗!


方法二| git stash 暂存档案

👉 假设今天不想要为还没完成的档案额外新增一个 Commit ,也不想要使用切换分支再回来 Reset 的动作,那麽在 Git 的指令中, git stash 指令也可以达到同样暂存档案的效果。

讲解 git stash 指令前,先整理关於 git stash 常用到的指令

  • git stash - 暂存目前档案
  • git stash list - 查看暂存的档案列表
  • git stash pop - 叫回暂存的档案,并从 stash list 中移除
  • git stash drop - 清除暂存档案(最新的暂存档案)
  • git stash apply - 将某个暂存档案套用在目前分支,原本的 Stash 依然保留着
  • git stash clear - 清除全部暂存

#1 - git stash 暂存档案

$ git stash # 暂存档案

https://ithelp.ithome.com.tw/upload/images/20211005/2014101077Oh04Y6pW.png

只用 git stash 暂存档案指令後,会得到讯息回馈:

👉 Saved working directory and index state WIP on master: 59a05db update index.html

这里的 WIP 意思是:Work In Progress

使用这指令後,回到 index.html 档案会发现内容全部不见了。

https://ithelp.ithome.com.tw/upload/images/20211005/20141010snnrapzdJb.png

这是什麽回事呢?东西去哪里了?

#2 - git stash list 查看暂存档案列表

在第一部分,我们使用 git stash 指令将档案暂存,那麽档案存到哪里呢?我们可以使用 git stash list 指令查询。

$ git stash list # 查看暂存档案列表

https://ithelp.ithome.com.tw/upload/images/20211005/20141010UZlOUnlZQm.png

得到的讯息回馈会是:

https://ithelp.ithome.com.tw/upload/images/20211005/20141010PULRoYBaI0.png

👉 stash@{0}: WIP on master: 59a05db update index.html

stash@{0} 为 Stash 的代名词,0 代表第一笔资料
WIP 为 Work In Progress,为进行中之意。

暂存列表可以存很多档案,假设我在 a_branch 分支也有想要暂存的档案。

https://ithelp.ithome.com.tw/upload/images/20211005/20141010Q0CBzPVj2e.png

$ git checkout a_branch # 切换到 a_branch 分支
$ git stash # 暂存档案
$ touch hello.html # 新增 hello.html 档案
$ git add . # 将所有档案加至暂存区
$ git stash # 暂存档案

这里第一次 git stash 指令的讯息回馈是:No local changes to save

是因为我都已经提交完成,没有什麽改变的档案需要暂存。因此我新增一个 hello.html 档案,并在里面加入内容,之後加至暂存区,再使用 git stash 指令将档案暂存。

这时候也可以看到刚刚新增的 hello.html 档案显示(已删除

https://ithelp.ithome.com.tw/upload/images/20211008/201410102GCUALj8Bv.png

档案去哪里了呢?我们可以使用 git stash list 指令查看。

https://ithelp.ithome.com.tw/upload/images/20211008/201410108IDLU4Lw5d.png

在 item2 样式设定里,也可以看到他有提示目前有两笔暂存档案。

https://ithelp.ithome.com.tw/upload/images/20211008/201410108oi0pCxUdc.png

👉 新增的档案:stash@{0}: WIP on a_branch: 59a05db update index.html

注意:原本为 master 分支时暂存的档案 Stash 代名词是 stash@{0} ,但现在变成 stash@{1} 罗!

#3 拿回 Stash 中的暂存档案

  1. git stash pop - 叫回暂存的档案,并从 stash list 中移除
  2. git stash drop - 清除暂存档案
  3. git stash apply - 将某个暂存档案套用在目前分支,原本的 Stash 依然保留着

首先先从 pop 指令开始介绍。

#pop 指令 - 当某个 Stash 档案拿回确定成功套用到分支上後,就会自动从暂存档案列表中删除。

https://ithelp.ithome.com.tw/upload/images/20211008/20141010ahkqqgUhzB.png

因为我们没有指定 pop 指令要拿回拿一个档案,所以会自动拿回最新一次放进 Stash 里的档案,也就是编号最小的档案。

当我们拿回档案後,因成功套用到 a_branch 分支上,所以 Stash 档案清单里就删除已被拿回的档案,现在我的暂存档案里就只剩下一个档案了。

https://ithelp.ithome.com.tw/upload/images/20211008/20141010p6mwSSlcTM.png

--

当然我们也可以指定我们要拿回哪个暂存档案,并取回後在暂存档案里清除。

https://ithelp.ithome.com.tw/upload/images/20211008/20141010wpEKpH9yOP.png

上面这张图我分别在新增 hello2.html 、hello3.html 档案时都各自将档案暂存。

可以观察在每次暂存时,工作目录及档案的变化。

https://ithelp.ithome.com.tw/upload/images/20211008/201410109QwpPYPfgP.png

上图是我将 hello2.html 档案暂存後,它显示已删除,其实他只是被隐藏起来,所以在工作目录中看不到 hello2.html 的档案。

https://ithelp.ithome.com.tw/upload/images/20211008/201410106uCGVhv9Z8.png

上图一样的概念,我将新增的 hello3.html 的档案暂存後,在 git 里他被储存隐藏到暂存档案列表,因此工作目录中也看不到档案。

使用 git stash list 指令查看现在的暂存档案列表

https://ithelp.ithome.com.tw/upload/images/20211008/20141010mzChnKYIjP.png

假设我想拿回 hello2.html 这个档案,Stash 的代名词为 stash@{1} ,并且拿回後不再存在档案列表中,那麽可以输入以下指令达成:

$ git stash pop stash@{1}

https://ithelp.ithome.com.tw/upload/images/20211008/20141010YaHkIavtTv.png

拿回後,使用 git stash list 指令观察现在暂存档案列表的状况:

https://ithelp.ithome.com.tw/upload/images/20211008/201410108BZWCLDoGO.png

上图显示现在剩两个暂存档案,且他们的原本编号 2 的档案会因为有删除的档案,而顺势变成编号 1

#drop 指令 - 可指定移除某个 Stash 档案

👉 如果没有指定移除哪个档案的话,那麽预设就是直接移除编号最小的档案。

$ git stash drop # 移除暂存档案
$ git stash drop [指定档案] # 移除暂存档案中的某个指定档案

https://ithelp.ithome.com.tw/upload/images/20211008/20141010pKG8WBw5Nb.png

#apply 指令 - 当某个 Stash 档案拿回确定成功套用到分支上後,原本暂存的档案依然保留在暂存列表中

$ git stash apply # 拿回暂存档案,但原本的暂存档案依然保留在暂存列表中
$ git stash apply [指定档案] # 可指定要拿回哪个档案

https://ithelp.ithome.com.tw/upload/images/20211008/20141010yqrjwJXzzb.png

上图我拿回档案後套用在 a_branch 分支上後,这时候再看一下档案列表:

https://ithelp.ithome.com.tw/upload/images/20211008/20141010CRQlBcws98.png

可以发现档案列表依然还有这个档案。

三个指令的关系

💡 pop 指令可以看作是将 drop 指令 加上 apply 指令

以上三种指令可以针对不同的需求来使用。

#4 - git stash clear 一口气移除所有暂存档案

$ git stash clear # 清除所有暂存档案

如果有仔细观察的话,会发现在每次使用 git stash 指令时,我都会先确保档案有加至暂存区,这是因为 Untracked 状态的档案预设是无法被 Stash 的,那这时候除了手动 git add 外,也可以使用 -u 参数,来做 Stash 指令。

假设今天新增了 hello4.html 档案,直接使用 git stash 指令来暂存档案。

https://ithelp.ithome.com.tw/upload/images/20211008/20141010hRwkf87uaa.png

https://ithelp.ithome.com.tw/upload/images/20211008/201410103Kf1hrq0Xe.png

No local changes to save - 目前本地没有什麽档案可以储存。(因为 hello4.html 是未追踪状态,因此无法被暂存)

改加上 -u 参数

$ git stash -u

https://ithelp.ithome.com.tw/upload/images/20211008/20141010m6pieUi7vt.png

https://ithelp.ithome.com.tw/upload/images/20211008/201410107MhK22S5Ev.png

可以看到成功新增一个暂存档案,且 hello4.html 档案被删除了。


关於暂存档案各种操作就先笔记到这里啦!🙋


<<:  Day24 Android - databinding(单向绑定)

>>:  DAY25神经网路(续三)

Day22 探讨Templates

经过这几天的介绍,相信大家也越来越了解它里面包含的功能了吧! 多了解一些东西,对之後的开发一定会越来...

【Day15】Git 版本控制 - 合并分支(git merge)

在上一篇文章中有提到如何「创建分支」以及「切换分支」的方法,以下图当范例来解释:下图的情况是 mas...

Day 09:遍历资料好便利-v-for

目前为止,我们成功引入了 BootstrapVue 的元件 Navbar,也调整了样式和内容。 突然...

第5砍 - 挺身而出

明天就要上班了... 给自己一点安慰 不上白不上, 上了不白上 努力加油, 徵求自我介绍范例:) 今...

Digital India With CSC Login

Digital India is a campaign launched by the Govern...