可能会遇到使用 git stash
指令情境:
假想今天可能在公司进行手中任务时,突然接收到老板或是合作夥伴的紧急求救,请你立刻放下目前工作,改进行新的棘手任务,那麽目前的任务要怎麽保存进度呢?让你在完成临时任务後可以切换回到当初进行的部份?
先前有提到在合并 merge 或是提交到 GIt 时,有可能会发生冲突的情况,会出现以下讯息提示:
commit your changes or stash them before you can merge.
当遇到以上情形,需要先告一段落,处理其他事情再返回继续开发的时候,我们可以使用两种方式来达到我们的需求。
git add
→ git commit
→ 处理其他事情後回来 → git reset
git stash
暂存档案先将所有的修改保存下来 - git add -all
可以采用先前习惯的方式保存目前的进度。先使用 git add
指令加至暂存区後,後使用 git commit
指令提交,如此一来可以先当作是一个 commit 版本,只是特别注意这是我们进行一半的版本,之後再继续完成这个任务即可。
$ git add -all # 将目前修改内容加至暂存区
$ git commit -m"undone files" #提交到数据库,并注明这是尚未完成的档案
首先这是我目前手中进行的档案内容(已有 git init
建立 Git 版本控制)
将目前进度加至暂存区 git add
使用 git commit
指令将档案提交,并注解这是「未完成的档案」
因为接下来要进行临时任务,先假设那个临时任务是在我的另一个分支上,假使忘记分支有哪些,可以使用 git branch
指令查看现有的分支。
$ git branch # 检视分支
检视分支後,知道另一分支是 a_branch
,之後使用切换分支的指令,将临时任务完成。
a_branch 分支是先前练习 git 时,就有建立好的分支,因此在这里也可以自己新增分支来修改临时任务,或是切换到实际任务的分支上。
确保提交好进度中的档案後,就可以使用切换分支的指令将分支切到我们需要完成的任务分支,等完成後再切回原来的分支,并进行 Reset 即可喔!
Reset 是因为先前的文章有提到过,可以将 HEAD 切换到上一次更新的 Commit 版本,如此一来我们就可以得到先前完成一半的进度,并持续将它完成。
切换到 a_branch 分支 - git checkout
指令
$ git checkout a_branch # 切换到 a_branch 分支
等临时任务完成并提交後,我们可以再次切换回原来的分支,并使用以下指令回到上次提交前的版本。
$ git reset HEAD^
如此一来就可以继续完成上次尚未完成的动作罗!
git stash
暂存档案👉 假设今天不想要为还没完成的档案额外新增一个 Commit ,也不想要使用切换分支再回来 Reset 的动作,那麽在 Git 的指令中, git stash
指令也可以达到同样暂存档案的效果。
讲解 git stash
指令前,先整理关於 git stash 常用到的指令
git stash
暂存档案$ git stash # 暂存档案
只用 git stash
暂存档案指令後,会得到讯息回馈:
👉 Saved working directory and index state WIP on master: 59a05db update index.html
这里的
WIP
意思是:Work In Progress
使用这指令後,回到 index.html 档案会发现内容全部不见了。
这是什麽回事呢?东西去哪里了?
git stash list
查看暂存档案列表在第一部分,我们使用 git stash
指令将档案暂存,那麽档案存到哪里呢?我们可以使用 git stash list
指令查询。
$ git stash list # 查看暂存档案列表
得到的讯息回馈会是:
👉 stash@{0}: WIP on master: 59a05db update index.html
stash@{0}
为 Stash 的代名词,0
代表第一笔资料
WIP
为 Work In Progress,为进行中之意。
暂存列表可以存很多档案,假设我在 a_branch 分支也有想要暂存的档案。
$ 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 档案显示(已删除)
档案去哪里了呢?我们可以使用 git stash list
指令查看。
在 item2 样式设定里,也可以看到他有提示目前有两笔暂存档案。
👉 新增的档案:stash@{0}: WIP on a_branch: 59a05db update index.html
注意:原本为 master 分支时暂存的档案 Stash 代名词是
stash@{0}
,但现在变成stash@{1}
罗!
首先先从 pop
指令开始介绍。
#pop
指令 - 当某个 Stash 档案拿回确定成功套用到分支上後,就会自动从暂存档案列表中删除。
因为我们没有指定 pop
指令要拿回拿一个档案,所以会自动拿回最新一次放进 Stash 里的档案,也就是编号最小的档案。
当我们拿回档案後,因成功套用到 a_branch 分支上,所以 Stash 档案清单里就删除已被拿回的档案,现在我的暂存档案里就只剩下一个档案了。
--
当然我们也可以指定我们要拿回哪个暂存档案,并取回後在暂存档案里清除。
上面这张图我分别在新增 hello2.html 、hello3.html 档案时都各自将档案暂存。
可以观察在每次暂存时,工作目录及档案的变化。
上图是我将 hello2.html 档案暂存後,它显示已删除,其实他只是被隐藏起来,所以在工作目录中看不到 hello2.html 的档案。
上图一样的概念,我将新增的 hello3.html 的档案暂存後,在 git 里他被储存隐藏到暂存档案列表,因此工作目录中也看不到档案。
使用 git stash list
指令查看现在的暂存档案列表
假设我想拿回 hello2.html 这个档案,Stash 的代名词为 stash@{1}
,并且拿回後不再存在档案列表中,那麽可以输入以下指令达成:
$ git stash pop stash@{1}
拿回後,使用 git stash list
指令观察现在暂存档案列表的状况:
上图显示现在剩两个暂存档案,且他们的原本
编号 2
的档案会因为有删除的档案,而顺势变成编号 1
。
#drop
指令 - 可指定移除某个 Stash 档案
👉 如果没有指定移除哪个档案的话,那麽预设就是直接移除编号最小的档案。
$ git stash drop # 移除暂存档案
$ git stash drop [指定档案] # 移除暂存档案中的某个指定档案
#apply
指令 - 当某个 Stash 档案拿回确定成功套用到分支上後,原本暂存的档案依然保留在暂存列表中。
$ git stash apply # 拿回暂存档案,但原本的暂存档案依然保留在暂存列表中
$ git stash apply [指定档案] # 可指定要拿回哪个档案
上图我拿回档案後套用在 a_branch 分支上後,这时候再看一下档案列表:
可以发现档案列表依然还有这个档案。
# 三个指令的关系
💡 pop 指令
可以看作是将 drop 指令
加上 apply 指令
以上三种指令可以针对不同的需求来使用。
git stash clear
一口气移除所有暂存档案$ git stash clear # 清除所有暂存档案
如果有仔细观察的话,会发现在每次使用 git stash
指令时,我都会先确保档案有加至暂存区,这是因为 Untracked 状态
的档案预设是无法被 Stash 的,那这时候除了手动 git add 外,也可以使用 -u
参数,来做 Stash 指令。
假设今天新增了 hello4.html 档案,直接使用 git stash
指令来暂存档案。
No local changes to save
- 目前本地没有什麽档案可以储存。(因为 hello4.html 是未追踪状态,因此无法被暂存)
改加上 -u
参数
$ git stash -u
可以看到成功新增一个暂存档案,且 hello4.html 档案被删除了。
关於暂存档案各种操作就先笔记到这里啦!🙋
<<: Day24 Android - databinding(单向绑定)
经过这几天的介绍,相信大家也越来越了解它里面包含的功能了吧! 多了解一些东西,对之後的开发一定会越来...
在上一篇文章中有提到如何「创建分支」以及「切换分支」的方法,以下图当范例来解释:下图的情况是 mas...
目前为止,我们成功引入了 BootstrapVue 的元件 Navbar,也调整了样式和内容。 突然...
明天就要上班了... 给自己一点安慰 不上白不上, 上了不白上 努力加油, 徵求自我介绍范例:) 今...
Digital India is a campaign launched by the Govern...