Git 储藏(stash)详解

这篇具有很好参考价值的文章主要介绍了Git 储藏(stash)详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此文在阅读前需要有一定的git命令基础,若基础尚未掌握,建议先阅读这篇文章Git命令播报详版

在平常的工作中,当我们在单独拉取的功能分支中进行开发时,遇到线上出现bug需要进行紧急修复,我们需要切换到主分支,进行代码的修复。但是我们直接在本地切换到主分支,则会提示当前文件的改动会丢失。

那该怎么办呢?合理的方式应该是将功能分支的代码临时存储在某个位置,当我们切回到当前分支,读取该存储,将之前的改动恢复。

在git中,就有git stash这样的命令,完美的解决了这个问题,其将当前未提交的修改(即工作区和暂存区的修改)先暂时储藏起来。

然后我们可以通过git stash list来查看储藏记录。之后通过git stash pop命令将之前最近一次储藏的修改取出来,继续之前的工作,并同时将该储藏从储藏记录列表中删除

单次储藏及应用

我们在当前分支,添加test.md文件。

查看文件状态

git status

输出:
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.md

nothing added to commit but untracked files present (use "git add" to track)

添加test.md到储藏区,使之能被git进行追踪

git add test.md

查看文件状态

git status

输出:
On branch master
Your branch is up to date with 'origin/master'.    

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   test.md

进行储藏

git stash

输出:Saved working directory and index state WIP on master: 709627d Initial commit

查看储藏

git stash list

输出:stash@{0}: WIP on master: 709627d Initial commit

应用最近一次储藏

git stash pop

输出:On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   test.md

Dropped refs/stash@{0} (05edd0c153191fe70ef42b9e4fdf70622d0e6831)

查看储藏

git stash list

输出为空,没有储藏记录

多次储藏及应用

多次储藏会发生什么呢?

修改文件,进行储藏,重复这一步骤,再通过git stash list来查看这两次记录

git stash list

输出:
stash@{0}: WIP on master: 709627d Initial commit
stash@{1}: WIP on master: 709627d Initial commit

从上图结果中,我们发现两次储藏记录的标识信息完全一致,只有其前面的index有别。

git默认按如下规则标识储藏记录(WIP意为work in progess, index用于后面取出所对应储藏的修改)。

stash@{index}: WIP on [分支名]: [最近一次的commitID] [最近一次的提交信息]

由于我们在功能分支下的两次储藏中均未发生提交,所以其提交ID是一致的。

这样明显会带来问题,我们在多个储藏之间,无法明确需要应用哪个,需要标识下储藏记录。

可以通过命令git stash -m [stashMessage]来标记此次储藏,以便后期查看。

通过查看储藏列表的index的可以取出指定储藏中的修改到工作区

取出指定index的储藏的修改到工作区中 git stash apply index

将指定index的储藏从储藏记录列表中删除 git stash drop index

储藏记录多的话,一个个删除太麻烦,可以进行批量删除 git stash clear

修改文件,进行储藏

git stash -m "change1" 

输出:Saved working directory and index state On master: change1

再次修改文件,进行储藏

git stash -m "change2" 

输出:Saved working directory and index state On master: change2

查看储藏

git stash list

输出:
stash@{0}: On master: change2
stash@{1}: On master: change1

应用储藏,提交信息为"change1"

git stash apply 1

输出:
On branch master
Your branch is up to date with 'origin/master'.

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:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

查看储藏

git stash list

输出:
stash@{0}: On master: change2
stash@{1}: On master: change1

删除刚才应用的储藏

git stash drop 1

输出:Dropped refs/stash@{1} (9a6ae2acf53198fce4125161d28045c484f1b20b)

查看储藏

git stash list

输出:stash@{0}: On master: change2

再添加储藏

git stash -m "add新change"  

输出:Saved working directory and index state On master: add新change

查看储藏

git stash list

输出:
stash@{0}: On master: add新change
stash@{1}: On master: change2

删除所有储藏

git stash clear

查看储藏

git stash list

输出为空,代表已经完全清除

当删除index为0项,index为1项中的index会变为0。即index会动态从0开始排序的,可看如下示例。

git stash list

输出:
stash@{0}: On master: change2
stash@{1}: On master: change1

git stash drop 0   
输出:Dropped refs/stash@{0} (fb3d70dea8b439cd09cce774cf622638a341af9c)

git stash list
输出:stash@{0}: On master: change1

对特定范围文件进行储藏

默认情况下,只要在git追踪范围的文件,均可以进行储藏。我们可以进一步区分特定范围的文件进行储藏。

  • git stash [-u|--include-untracked]:对未追踪文件也进行储藏

  • git stash [-S|--staged]: 只对暂存区文件进行储藏

  • git stash [-a|--all]: 对所有文件进行储藏

提前准备好三种git状态不同的文件。新添加的文件(即为未追踪文件),工作区修改的文件,提交到暂存区的文件

git status

输出:
git status
On branch master
Your branch is up to date with 'origin/master'.    

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   README.md 

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:   README.en.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.md

对未追踪文件也进行储藏

git stash -u

输出:Saved working directory and index state WIP on master: 709627d Initial commit

查看文件状态

git status

输出:
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

对刚才储藏进行应用

git stash pop

输出:
On branch master
Your branch is up to date with 'origin/master'.

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:   README.en.md
        modified:   README.md   

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.md

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

将README.md添加到暂存区

git add README.md 

查看文件状态

git status

输出:
On branch master
Your branch is up to date with 'origin/master'.    

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   README.md 

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:   README.en.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.md

只对暂存区文件进行储藏

git stash -S
输出:Saved working directory and index state WIP on master: 709627d Initial commit

查看文件状态

git status

输出:
On branch master
Your branch is up to date with 'origin/master'.

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:   README.en.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.md

no changes added to commit (use "git add" and/or "git commit -a")

重复之前步骤。将储藏进行应用,同时将README.md添加到暂存区

全部文件添加到储藏区

git stash -a
输出:Saved working directory and index state WIP on master: 709627d Initial commit

查看文件状态

git status

输出:
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

若想对stash命令了解更多,可以通过命令git stash --help查阅。文章来源地址https://www.toymoban.com/news/detail-475194.html

到了这里,关于Git 储藏(stash)详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (详解踩坑)GIT版本回滚git stash、git reset、git reset --hard、git revert

    目录 背景 一、(git log、git reflog)查看git提交日志及命令历史 1.1 git log(提交日志)  1.2 git reflog(命令历史) 二、git reset(回退到指定的版本,并且保留更改) 2.1 回退到指定版本 2.2 快捷回退上一版本 三、git reset --hard(回退到指定版本,不保留更改) 四、git revert(回退

    2024年02月12日
    浏览(56)
  • Git(六):基本命令(3):储藏、标签、拉取、子模块

    目录 17、stash 储藏 17.2 描述 17.3 基本用法 18、tag 标签 18.1 描述 18.2 基本用法 19、fetch 获取 19.1 描述 19.2 基本用法 20、pull 整合 20.1 描述 20.2 基本用法 20.3 pull 与 fetch 的区别 21、push 更新推送 21.1 描述 21.2 基本用法 22、remote 管理 22.1 基本用法 23、submodule 管理子模块 23.1 使用场景

    2024年02月02日
    浏览(35)
  • git分布式管理-头歌实验合并远程分支、rebase、储藏

    任务描述 在软件开发中,通常会在版本库中创建多个不同的分支进行开发。例如,最基本的可以有一个测试版分支和一个正式版分支,其中测试版分支用来完成最新功能代码的开发与测试,正式版则用于管理即将发布的版本。 如果某个版本通过了测试,就需要将其推到正式

    2024年03月12日
    浏览(64)
  • Git stash的用法

    当你代码写到一半而需要切换到其他分支时,此时需要提交本地代码才可以进行切换,然而此时会产生一个非常冗余的commit,所以我们可以通过使用 git stash 将代码推入git栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的切换分支,等待忙碌切

    2024年02月04日
    浏览(53)
  • git stash 正确用法

    目录 一、背景 二、使用 2.1 使用之前,先简单了解下 git stash 干了什么:  2.2 git stash 相关命令 2.3 使用流程 1. 执行 `git stash`  2. 查看刚才保存的工作进度 `git stash list` 3. 这时候在看分支已经是干净无修改的(改动都有暂存到 stash) 4. 现在就可以正常切换到目标分支,进行相应

    2024年02月20日
    浏览(75)
  • git stash 用法小结

    有一天你正兴高采烈地coding…,突然现网出现一个bug让你紧急修复,但是你本地已经有了修改,你又不想提交,也总不能全部回退吧,所以你正发愁怎么办的时候恰好看到了这篇文章,它将帮你完美解决此场景的困扰,那么今天的主角就是 git stash ,它会本地保存当前工作目

    2024年02月08日
    浏览(63)
  • Git Stash 贮藏命令

    在使用Git过程中,有时当你在项目的其它分支正在进行开发,并且该分支还尚未开发完成进行提交,这个时候需要你切换分支进行工作,这个时候做到一半的工作既不想全部丢掉又不想到处都是问题的就commit,十分冲突。解决问题的方法就是 git stash 命令 贮藏(stash)会处理

    2024年02月07日
    浏览(47)
  • Git Stash详细讲解

             git stash 这个命令可以将当前的工作状态保存到git栈,在需要的时候再恢复。         当在一个分支的开发工作未完成,却又要切换到另外一个分支进行开发的时候,可以先将自己写好的代码,储存到 git 栈,进行另外一个分支的代码开发。这时候 git stash 命令就

    2024年02月02日
    浏览(41)
  • Git stash命令

    Git stash Git stash用来暂存当前正在进行的工作, 将工作区还没加入索引库的内容压入本地的Git栈中,在需要应用的时候再弹出来。比如想pull 最新代码,又不想加新commit;或者为了修复一个紧急的bug,先stash,使返回到自己上一个commit,改完bug之后再stash pop,继续原来的工作。

    2024年02月13日
    浏览(49)
  • git stash怎么恢复

    首先,使用git status指令查看当前文件状态。 然后,使用git stash指令将本次修改部分缓存到本地。 再次使用git status指令,查看当前文件状态,系统提示没有需要提交的内容。 使用git stash list指令,查看本地当前的缓存列表。 使用指令“git stash apply stash@{id}”,恢复指定id的

    2024年01月22日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包