网易首页 > 网易号 > 正文 申请入驻

git stash 命令实用指南 | Linux 中国

0
分享至

导读:学习如何使用 git stash 命令,以及何时应该使用它。                           

本文字数:5935,阅读时长大约: 7分钟

https://linux.cn/article-13293-1.html
作者:Ramakrishna Pattnaik
译者:Xingyu.Wang


学习如何使用 git stash 命令,以及何时应该使用它。

版本控制是软件开发人员日常生活中不可分割的一部分。很难想象有哪个团队在开发软件时不使用版本控制工具。同样也很难想象有哪个开发者没有使用过(或没有听说过)Git。在 2018 年 Stackoverflow 开发者调查中,74298 名参与者中有 87.2% 的人 使用 Git 进行版本控制。

Linus Torvalds 在 2005 年创建了 Git 用于开发 Linux 内核。本文将介绍 git stash 命令,并探讨一些有用的暂存变更的选项。本文假定你对 Git 概念 有基本的了解,并对工作树、暂存区和相关命令有良好的理解。

为什么 git stash 很重要?

首先要明白为什么在 Git 中暂存变更很重要。假设 Git 没有暂存变更的命令。当你正在一个有两个分支(A 和 B)的仓库上工作时,这两个分支已经分叉了一段时间,并且有不同的头。当你正在处理 A 分支的一些文件时,你的团队要求你修复 B 分支的一个错误。你迅速将你的修改保存到 A 分支(但没有提交),并尝试用 git checkout B 来签出 B 分支。Git 会立即中止了这个操作,并抛出错误:“你对以下文件的本地修改会被该签出覆盖……请在切换分支之前提交你的修改或将它们暂存起来。”

在这种情况下,有几种方法可以启用分支切换:

◈ 在分支 A 中创建一个提交,提交并推送你的修改,以修复 B 中的错误,然后再次签出 A,并运行 git reset HEAD^ 来恢复你的修改。

◈ 手动保留不被 Git 跟踪的文件中的改动。

第二种方法是个馊主意。第一种方法虽然看起来很传统,但却不太灵活,因为保存未完成工作的修改会被当作一个检查点,而不是一个仍在进行中的补丁。这正是设计 git stash 的场景。

git stash 将未提交的改动保存在本地,让你可以进行修改、切换分支以及其他 Git 操作。然后,当你需要的时候,你可以重新应用这些存储的改动。暂存是本地范围的,不会被 git push 推送到远程。

如何使用 git stash

下面是使用 git stash 时要遵循的顺序:

1. 将修改保存到分支 A。

2. 运行 git stash

3. 签出分支 B。

4. 修正 B 分支的错误。

5. 提交并(可选)推送到远程。

6. 查看分支 A

7. 运行 git stash pop 来取回你的暂存的改动。

git stash 将你对工作目录的修改存储在本地(在你的项目的 .git 目录内,准确的说是 /.git/refs/stash),并允许你在需要时检索这些修改。当你需要在不同的上下文之间切换时,它很方便。它允许你保存以后可能需要的更改,是让你的工作目录干净同时保持更改完整的最快方法。

如何创建一个暂存

暂存你的变化的最简单的命令是 git stash

  1. $ git stash

  2. Saved working directory and index state WIP on master; d7435644 Feat: configure graphql endpoint

默认情况下,git stash 存储(或称之为“暂存”)未提交的更改(已暂存和未暂存的文件),并忽略未跟踪和忽略的文件。通常情况下,你不需要暂存未跟踪和忽略的文件,但有时它们可能会干扰你在代码库中要做的其他事情。

你可以使用附加选项让 git stash 来处理未跟踪和忽略的文件:

git stash -ugit stash --includ-untracked 储存未追踪的文件。

git stash -agit stash --all 储存未跟踪的文件和忽略的文件。

要存储特定的文件,你可以使用 git stash -pgit stash -patch 命令:

  1. $ git stash --patch

  2. diff --git a/.gitignore b/.gitignore

  3. index 32174593..8d81be6e 100644

  4. --- a/.gitignore

  5. +++ b/.gitignore

  6. # dependencies

  7. node_modules/

  8. /.pnp

  9. +f,fmfm

  10. .pnp.js

  11. # testing

  12. (1/1) Stash this hunk [y,n,q,a,d,e,?]?

列出你的暂存

你可以用 git stash list 命令查看你的暂存。暂存是后进先出(LIFO)方式保存的:

  1. $ git stash list

  2. stash@{0}: WIP on master: d7435644 Feat: configure graphql endpoint

默认情况下,暂存会显示在你创建它的分支和提交的顶部,被标记为 WIP。然而,当你有多个暂存时,这种有限的信息量并没有帮助,因为很难记住或单独检查它们的内容。要为暂存添加描述,可以使用命令 git stash save

  1. $ git stash save "remove semi-colon from schema"

  2. Saved working directory and index state On master: remove semi-colon from schema

  3. $ git stash list

  4. stash@{0}: On master: remove semi-colon from schema

  5. stash@{1}: WIP on master: d7435644 Feat: configure graphql endpoint

检索暂存起来的变化

你可以用 git stash applygit stash pop 这两个命令来重新应用暂存的变更。这两个命令都会重新应用最新的暂存(即 stash@{0})中的改动。apply 会重新应用变更;而 pop 则会将暂存的变更重新应用到工作副本中,并从暂存中删除。如果你不需要再次重新应用被暂存的更改,则首选 pop

你可以通过传递标识符作为最后一个参数来选择你想要弹出或应用的储藏:

  1. $ git stash pop stash@{1}

  1. $ git stash apply stash@{1}

清理暂存

删除不再需要的暂存是好的习惯。你必须用以下命令手动完成:

git stash clear 通过删除所有的暂存库来清空该列表。

git stash drop 从暂存列表中删除一个特定的暂存。

检查暂存的差异

命令 git stash show 允许你查看一个暂存的差异:

  1. $ git stash show stash@{1}

  2. console/console-init/ui/.graphqlrc.yml | 4 +-

  3. console/console-init/ui/generated-frontend.ts | 742 +++++++++---------

  4. console/console-init/ui/package.json | 2 +-

要获得更详细的差异,需要传递 --patch-p 标志:

  1. $ git stash show stash@{0} --patch

  2. diff --git a/console/console-init/ui/package.json b/console/console-init/ui/package.json

  3. index 755912b97..5b5af1bd6 100644

  4. --- a/console/console-init/ui/package.json

  5. +++ b/console/console-init/ui/package.json

  6. {

  7. - "name": "my-usepatternfly",

  8. + "name": "my-usepatternfly-2",

  9. "version": "0.1.0",

  10. "private": true,

  11. "proxy": "http://localhost:4000"

  12. diff --git a/console/console-init/ui/src/AppNavHeader.tsx b/console/console-init/ui/src/AppNavHeader.tsx

  13. index a4764d2f3..da72b7e2b 100644

  14. --- a/console/console-init/ui/src/AppNavHeader.tsx

  15. +++ b/console/console-init/ui/src/AppNavHeader.tsx

  16. import { css } from "@patternfly/react-styles";

  17. interface IAppNavHeaderProps extends PageHeaderProps {

  18. - toolbar?: React.ReactNode;

  19. - avatar?: React.ReactNode;

  20. + toolbar?: React.ReactNode;

  21. + avatar?: React.ReactNode;

  22. }

  23. export class AppNavHeader extends React.Component<IAppNavHeaderProps>{

  24. render()

签出到新的分支

你可能会遇到这样的情况:一个分支和你的暂存中的变更有分歧,当你试图重新应用暂存时,会造成冲突。一个简单的解决方法是使用 git stash branch 命令,它将根据创建暂存时的提交创建一个新分支,并将暂存中的修改弹出:

  1. $ git stash branch test_2 stash@{0}

  2. Switched to a new branch 'test_2'

  3. On branch test_2

  4. Changes not staged for commit:

  5. (use "git add ..." to update what will be committed)

  6. (use "git restore ..." to discard changes in working directory)

  7. modified: .graphqlrc.yml

  8. modified: generated-frontend.ts

  9. modified: package.json

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

  11. Dropped stash@{0} (fe4bf8f79175b8fbd3df3c4558249834ecb75cd1)

在不打扰暂存参考日志的情况下进行暂存

在极少数情况下,你可能需要创建一个暂存,同时保持暂存参考日志(reflog)的完整性。这些情况可能出现在你需要一个脚本作为一个实现细节来暂存的时候。这可以通过 git stash create 命令来实现;它创建了一个暂存条目,并返回它的对象名,而不将其推送到暂存参考日志中:

  1. $ git stash create "sample stash"

  2. 63a711cd3c7f8047662007490723e26ae9d4acf9

有时,你可能会决定将通过 git stash create 创建的暂存条目推送到暂存参考日志:

  1. $ git stash store -m "sample stash testing.." "63a711cd3c7f8047662007490723e26ae9d4acf9"

  2. $ git stash list

  3. stash @{0}: sample stash testing..

结论

我希望你觉得这篇文章很有用,并学到了新的东西。如果我遗漏了任何有用的使用暂存的选项,请在评论中告诉我。

via: https://opensource.com/article/21/4/git-stash

作者:Ramakrishna Pattnaik 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

欢迎遵照 CC-BY-NC-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
河南三县(市、区)政府主要领导调整

河南三县(市、区)政府主要领导调整

汲古知新
2026-05-13 10:22:10
坏消息!67岁生娃的田新菊病倒了,6岁小天赐踮脚给73岁妈妈喂奶

坏消息!67岁生娃的田新菊病倒了,6岁小天赐踮脚给73岁妈妈喂奶

未曾青梅
2026-05-11 22:20:21
父亲病危后女子请假陪护屡遭拒,父亲去世当天她因“旷工”被公司辞退,此前公司还向其发送旷工催告函;法院:公司于期限内支付70000元

父亲病危后女子请假陪护屡遭拒,父亲去世当天她因“旷工”被公司辞退,此前公司还向其发送旷工催告函;法院:公司于期限内支付70000元

极目新闻
2026-05-13 07:57:10
网红水果黑幕曝光!全是添加剂泡的,很多人天天买给孩子吃

网红水果黑幕曝光!全是添加剂泡的,很多人天天买给孩子吃

泠泠说史
2026-05-12 19:57:36
5月13日俄乌:乌克兰正向美国传授战争之道

5月13日俄乌:乌克兰正向美国传授战争之道

山河路口
2026-05-13 18:51:46
印尼媒体:一把好牌打成稀巴烂,尤利安托下课,印尼队解散

印尼媒体:一把好牌打成稀巴烂,尤利安托下课,印尼队解散

刘剮说体坛
2026-05-13 14:12:25
刘嘉玲晒法国度假照,依偎梁朝伟身旁,满脸幸福藏不住

刘嘉玲晒法国度假照,依偎梁朝伟身旁,满脸幸福藏不住

人间烟火记事本
2026-05-13 08:37:19
《主角》直到花彩香生娃,才知她为何不跟张光荣离婚,放弃胡三元

《主角》直到花彩香生娃,才知她为何不跟张光荣离婚,放弃胡三元

八斗小先生
2026-05-12 11:34:38
皇马主席放飞自我了!弗洛伦蒂诺:让那个女孩提问,你们其他人都太丑了

皇马主席放飞自我了!弗洛伦蒂诺:让那个女孩提问,你们其他人都太丑了

懂个球
2026-05-13 14:17:43
“4只皮皮虾1035元”当事顾客称被网暴,涉事司机已被开除

“4只皮皮虾1035元”当事顾客称被网暴,涉事司机已被开除

澎湃新闻
2026-05-13 14:56:06
热巴五一裹成“养蜂人”?这波反季穿搭才是顶流的松弛感

热巴五一裹成“养蜂人”?这波反季穿搭才是顶流的松弛感

影视泡泡堂
2026-05-13 21:10:27
水谷隼彻底揭穿张本宇一家在日本受尊重的谎言!

水谷隼彻底揭穿张本宇一家在日本受尊重的谎言!

生活新鲜市
2026-05-13 02:38:57
赵心童、艾伦入选名人堂引质疑,罗伯逊、马叔:入选门槛太低了!

赵心童、艾伦入选名人堂引质疑,罗伯逊、马叔:入选门槛太低了!

余憁搞笑段子
2026-05-13 10:35:20
奉劝大家:这6样东西千万“别用纸巾擦”,一擦就坏,很难修复

奉劝大家:这6样东西千万“别用纸巾擦”,一擦就坏,很难修复

室内设计师有料儿
2026-05-06 12:09:03
国乒美女钱天一:26岁退役,不选编制选安置费,嫁世界冠军很幸福

国乒美女钱天一:26岁退役,不选编制选安置费,嫁世界冠军很幸福

以茶带书
2026-05-08 15:40:11
俄专机提前12小时降落北京:在“空军一号”抵达前,普京要完成战略卡位

俄专机提前12小时降落北京:在“空军一号”抵达前,普京要完成战略卡位

荷兰豆爱健康
2026-05-13 18:43:30
高考落幕少女诞下女婴,父母追问生父身份后,竟对亲生女儿下毒手

高考落幕少女诞下女婴,父母追问生父身份后,竟对亲生女儿下毒手

罪案洞察者
2025-08-14 15:00:53
特朗普访华名单上的黑石帝王施瓦茨曼:他用李世民给自己命名

特朗普访华名单上的黑石帝王施瓦茨曼:他用李世民给自己命名

人间像素
2026-05-13 13:17:48
1500万潮汕人移民东南亚,当年究竟有多惨烈?| 地球知识局

1500万潮汕人移民东南亚,当年究竟有多惨烈?| 地球知识局

地球知识局
2026-05-13 07:30:17
“老鳳詳”所售足金戒指被指“金包银”拒三倍赔偿,店铺已被淘宝关闭

“老鳳詳”所售足金戒指被指“金包银”拒三倍赔偿,店铺已被淘宝关闭

澎湃新闻
2026-05-13 08:18:27
2026-05-13 21:47:00
Linux
Linux
Linux 中国开源社区
8018文章数 73112关注度
往期回顾 全部

科技要闻

腾讯一季度营收1964.6亿元 同比增9%

头条要闻

媒体:黄仁勋绝非"顺路同行" 而是美方刻意纳入的筹码

头条要闻

媒体:黄仁勋绝非"顺路同行" 而是美方刻意纳入的筹码

体育要闻

14年半,74万,何冰娇没选那条更安稳的路

娱乐要闻

白鹿掉20万粉,网友为李晨鸣不平

财经要闻

美国总统特朗普抵达北京

汽车要闻

C级纯电轿跑 吉利银河"TT"申报图来了

态度原创

艺术
旅游
本地
房产
公开课

艺术要闻

乾隆 “翻车” 名画刷屏!

旅游要闻

中国新文创市集集结各地文创,五大演艺专区百场演出好戏不断

本地新闻

用苏绣的方式,打开江西婺源

房产要闻

卷疯了!最低杀到7字头!手握30万,海口楼市横着走!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版