首页 > 其他分享 >揭秘 Git-stash:掌握暂存技巧,让代码更整洁!

揭秘 Git-stash:掌握暂存技巧,让代码更整洁!

时间:2024-09-26 11:01:43浏览次数:8  
标签:git stash Git branch txt 暂存 bug 分支

stash 可以冻结目前的状态

在 git stash 出现之前

当我们在开发一个新功能的时候,突然来了一个紧急的 bug 要修复,此时我们可以创建一个分支去修复它;但如果,切换会导致冲突的话,就会切换失败。

我们来模拟下(先确保工作区是干净的):

$ git branch bug02

$ echo "test" >> 3-branch/branch.txt

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
test


$ git add .

$ git commit -m "add test to branch.txt"

接下来,我们切换并修改 branch.txt 的最后一行,使得其和 master 分支不一样:

$ git switch bug02
Switched to branch 'bug02'

$ vim 3-branch/branch.txt

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
fuk

接下来我们切换,果然,报错了:

$ git switch master
error: Your local changes to the following files would be overwritten by checkout:
        3-branch/branch.txt
Please commit your changes or stash them before you switch branches.
Aborting

Git 告诉我们可以提交后再切换;但是我们目前仅仅开发到一半,不想提交,怎么办?

Git stash 演示

Git 提供了 stash 功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash
Saved working directory and index state WIP on bug02: a2f5dc9 rm temp.txt

现在,用 git status​​查看工作区,就是干净的(除非有没有被 Git 管理的文件),因此可以放心地切换分支。

$ git status
On branch bug02
nothing to commit, working tree clean

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward

等后续修复完 bug 后,如何恢复现场呢?首先,我们的工作现场是存储在一个栈里的,我们可以查看当前有哪些工作现场:

$ git stash list
stash@{0}: WIP on bug02: a2f5dc9 rm temp.txt

有两种恢复方式:

  1. git stash apply ​恢复,但是恢复后,stash 内容并不删除,你需要用 git stash drop ​来删除;类似读取栈的内容,但不弹出
  2. git stash pop​,恢复的同时把 stash 内容也删了。

我们使用第二种方式,可以看到 Git 会将当前仓库状态显示出来:

$ git stash pop
On branch bug02
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   3-branch/branch.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (a81ac38b932b00c0f934f613f823c33c7e37b10d)

并且文件内容也恢复了:

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
fuk

你可以多次 stash,恢复的时候,先用 git stash list ​查看,然后恢复指定的 stash,用命令:

$ git stash apply stash@{0}

再用 git stash list ​查看,就看不到任何 stash 内容了:

$ git stash list

更多 stash 用法

我们在存储现场的时候,还可以加一些注释,方便我们回忆:git stash save "test"

$ git stash save "temp"
Saved working directory and index state On bug02: temp

peterjxl@peter MINGW64 /d/Projects/LearnGit (bug02)
$ git stash list
stash@{0}: On bug02: temp

更多 stash 的用法,就不一一演示了:

git stash clear​:清除堆栈中的所有内容

git stash show​:查看堆栈中最新保存的 stash 和当前目录的差异。

git stash show stash@{1}​:查看指定的 stash 和当前目录差异。

git stash branch​:从最新的 stash 创建分支。

复制一个提交

现在我们假设这样一个场景:

  1. 我们从 master 分支上,创建了 feature 分支开发一个新功能
  2. 此时突然来了个比较紧急的 bug,是 master 分支上的
  3. 我们从 master 分支上创建一个分支 bug,并修复了该 bug
  4. 继续回到 feature 分支开发

目前有这样一个问题,我们的 feature 分支也是从 master 分支上拉出来的,所以那个 bug 在当前分支也是存在的!那要怎么修复?一个方法是将 bug 再一次在 feature 分支上修复一次,但这样又花了不少时间做重复的事情。

git 专门提供了一个 cherry-pick ​命令,让我们能复制一个特定的提交到当前分支。我们来演示下:

先删除其他分支,并确保当前工作区是干净的

$ git branch
* master

创建 feature 分支和 bug 分支:

$ git branch feature

$ git branch bug

$ git branch
  bug
  feature
* master

切换到 bug 分支上,并修改 branch.txt,添加一个词组 cherry-pick:

$ git switch bug

$ vim 3-branch/branch.txt

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
test cherry-pick


$ git add 3-branch/branch.txt
$ git commit -m "fix bug"
[bug 1794212] fix bug
 1 file changed, 1 insertion(+), 1 deletion(-)

这里记录下 commit id 是 1794212,后续会用到。

然后切换到 master 分支,合并 bug 分支:

$ git switch master
$ git merge --no-ff -m &quot;merged bug fix&quot; bug
Merge made by the 'recursive' strategy.
 3-branch/branch.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

然后切换到 feature 分支,并复制提交:

$ git cherry-pick 1794212
[feature 88085eb] fix bug
 Date: Sat Jan 14 20:06:01 2023 +0800
 1 file changed, 1 insertion(+), 1 deletion(-)

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
test cherry-pick

Git 自动给 feature 分支做了一次提交,注意这次提交的 commit 是 88085eb​,它并不同于 master 的 1794212​,因为这两个 commit 只是改动相同,但确实是两个不同的 commit:

$ git log --oneline
88085eb (HEAD -> feature) fix bug
982423c add test to branch.txt
a2f5dc9 rm temp.txt
b194598 add temp.txt

git cherry-pick​​,我们就不需要在 feature 分支上手动再把修 bug 的过程重复一遍。

(完)

标签:git,stash,Git,branch,txt,暂存,bug,分支
From: https://www.cnblogs.com/PeterJXL/p/18433050

相关文章

  • Git 分支管理全攻略:一篇博客带你玩转代码分支!
    什么是分支?在Git里,分支其实就有点像一个树的枝杈,每个分支上可以有不同的文件的版本,并且不会互相干扰。​分支功能有什么用?在工作中,我们经常是需要和别人一起开发一个项目的,此时可能你开发A功能,别人开发B功能;如果只有一个分支的话,那么所有人都得在这个分支上干活;如果你开发......
  • 关于 GitHub 的奇技淫巧
    介绍下多年来使用GitHub所了解到的技巧‍学会看文档如何学习使用GitHub呢?最好的方式就是:阅读官网文档。官方文档通常比任何教程都全面、权威、准确。网上教程和文章满天飞,但都是建立在官方文档的基础上,一旦官方文档修改了,很难做到实时同步,就可能会让学习者感到困惑。对......
  • 掌握 Git 远程仓库,让团队协作更上一层楼
    介绍下远程仓库的概念、常见的远程仓库以及常见的操作。‍‍什么是远程仓库目前,我们的版本库都是在自己的电脑上,并不方便给别人访问,更别说一起维护一个版本库了;如果我们的电脑关机了(或者坏了),岂不是别人就没法干活了?因此,我们通常需要找一台服务器,存放我们的版本库;然后,其他人就......
  • centos7安装gitlab并汉化
    一、基础环境准备1.安装依赖包[root@gitlab-server~]#yuminstallcurlpolicycoreutilsopenssh-serveropenssh-clientspostfixwgetgitpatch-y[root@gitlab-server~]#systemctlstartpostfix2.配置yum源(由于网络问题,国内用户,建议使用清华大学的镜像源进行安装)[root@g......
  • git修改某些指定提交的履历信息
    一,关于gitrebase-ihead~n的命令,可以修改某个提交的提交履历1,gitlog查看提交log,确认需要修改的commit2,gitrebase-ihead~2(以修改最后的两次提交的履历为例)3,进入gitvim编辑页面,按键盘i进入编辑模式,将需要修改履历的两条提交的“pick”改为“r”(此时不需要改履历信息)4,按......
  • ELK中日志数据采集器Filebeat的安装和使用、Filebeat结合Logstash进行日志处理入Elast
    一、ELK中日志数据采集器Filebeat的安装和使用    Beats是数据采集的得力工具,Beats能够将数据转发至Logstash进行转换和解析。Filebeat是Beats中的一种,Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tailfile),并将它们转发给Elasticsearch或Logstats......
  • 03 git 码云面试题
    1.写出你常用的git命令。2.你们公司是怎么用git做开发的?1.在码云或GitHub等代码托管的网站创建自己仓库,创建完之后码云会给我一个仓库地址,如:https://gitee.com/old_boy_python_stack_21/190326032.git2.自己写代码.....3.将代码提交到远程仓库。-......
  • 工作中使用git的规范流程
    本文介绍企业Git版本控制的逻辑,提高程序代码管理的效率问题:1.开发管理乱2.代码冲突过多3.代码质量过低4.代码管理效率不高..只会用不会管理参考企业Git规范的必要性Git企业级使用规范-操作流程Git企业级使用规范-实际操作1.git管理流程参考2.......
  • Git - 基本操作
    Git基本操作(本地库)很多小伙伴可能都听说过Git,那么Git到底是什么?为什么那么多人都在使用它?Git是一个开源的分布式版本控制系统,用于敏捷、高效地处理任何大中小项目,特别是对于团队协作开发起到了积极有效的推进作用。通俗地讲,Git就像我们玩RPG游戏时的存档系统,它可......
  • 暂存
    最近因为学校的"多校联测"的题库不翼而飞,导致很多我在上面提交过的代码直接消失了,手上侥幸还存有两道题,以防电脑关机丢失,故暂存于此。T1题目大意:求\[\sum_{i=l}^{r}(i-1)\sum_{j=1}^{n}⌈log_{i}j⌉\]\[范围:2\leql,r,n\leq1e18,注:多组测试数据T\leq1e5\]只贴个代码,......