GIT指令 - git stash

本文介绍了GitStash功能,用于在开发过程中临时保存工作进度,解决在不同分支间切换时不想提交但又不想丢失更改的问题。详细讲解了gitstash、save、list、apply、pop、drop和clear等关键命令及其用法。

命令解释

保存当前工作进度,将工作区和暂存区恢复到修改之前。

使用场景

当在A分支上进行开发,有点事情需要切到B分支上进行开发,但是A分支的代码开发一半,又不想提交,直接切换又会报错,可以使用该指令。

git stash 相关指令

git stash:暂存当前分支的工作进度,并将分支状态恢复到本次修改之前;
git stash save “备注的内容”:暂存当前分支的工作进度,并添加备注,将分支状态恢复到本次修改之前;
git stash list:展示暂存的stash版本列表;
git stash apply:恢复到最后一次暂存的stash版本代码;
git stash pop:恢复到最后一次暂存的stash版本代码,并删除改stash记录;
git stash drop:删除最后一次暂存的stash版本;
git stash clear:删除所有暂存的stash版本;
git stash apply stash@{0}:恢复到指定的暂存stash版本代码,先使用git stash list指令展示列表,stash@{0}为显示的版本。

<think> 我们参考了用户提供的三个引用,并针对用户的问题“git stash -u和git stash pop的详细介绍及使用示例”进行回答。 引用[1]提到用户在使用git stashgit stash pop时遇到的一些误操作情况。 引用[2]详细说明了git stash apply --index的作用,以及如何恢复暂存区状态。 引用[3]则提到了使用git stash save -a(也就是git stash -a)时的一个问题,即恢复未跟踪文件时可能出现的冲突。 用户的问题集中在git stash -u和git stash pop上,因此我们将重点介绍这两个命令。 1. git stash -u (或者 --include-untracked) 作用:将工作区中的修改(包括已跟踪文件的修改和未跟踪的文件)暂存起来,让工作区恢复到当前分支最近一次提交的状态。 注意:默认情况下,git stash只存储已跟踪文件的修改,不存储未跟踪的文件。而使用-u选项会将未跟踪的文件也一起存储。但是,它不会存储被忽略的文件(即.gitignore中指定的文件)。如果需要存储被忽略的文件,可以使用-a(--all)选项,但这通常不推荐,因为可能会包含一些不需要的文件(如编译产物)。 2. git stash pop 作用:将最近一次存储的修改恢复到当前工作区。这个操作会从stash栈中删除对应的存储。 注意:如果恢复过程中有冲突,则需要手动解决冲突,然后可以继续操作。另外,如果在恢复之前有未提交的修改(无论是已跟踪还是未跟踪),pop操作可能会失败,因为pop操作会尝试应用存储的修改,而如果当前工作区不干净,可能会造成混乱。 使用示例: 假设我们当前在分支A上工作,并且有一些修改(包括已跟踪文件的修改和未跟踪的文件)。此时我们需要切换到其他分支修复问题,但不想提交当前修改。 步骤1:使用git stash -u暂存当前工作区 $ git stash -u 此时,工作区会变得干净(恢复到最近一次提交的状态),我们可以安全地切换到其他分支。 步骤2:在其他分支(比如B分支)完成工作后,切换回A分支,然后恢复暂存的修改 $ git checkout A $ git stash pop 但是,如果我们在暂存之后又在当前分支做了一些修改,那么pop操作可能会遇到冲突。此时需要手动解决冲突。 另外,关于引用[2]中提到的--index选项:如果我们暂存前已经将某些修改用git add加入到暂存区(即这些修改在暂存时处于暂存状态),那么在使用git stash pop(或者git stash apply)时,默认情况下不会恢复这些文件的暂存状态(即所有修改都会变成未暂存状态)。如果我们希望恢复暂存状态,可以使用: $ git stash pop --index 但注意,如果我们在pop之前当前工作区已经有了一些暂存区的修改,那么使用--index可能会造成冲突,需要谨慎。 注意事项: - 多次stash会形成一个栈,最近的一次存储为stash@{0}。pop默认弹出stash@{0},也可以指定其他存储,如git stash pop stash@{1}。 - 使用git stash pop时,如果恢复成功且没有冲突,则对应的存储会被删除。如果不想删除,可以使用git stash apply,这样存储不会从栈中移除。 - 在恢复存储时,如果当前工作区有未提交的修改(包括未跟踪的文件),pop操作可能会失败。此时可以先提交或暂存当前修改,或者使用git stash apply,然后再手动合并。 - 对于未跟踪的文件,在恢复时如果工作区已经存在同名的未跟踪文件,那么pop操作会失败(如引用[3]中的问题)。因此,在pop之前最好确保工作区是干净的(没有未跟踪的文件与存储中的文件冲突)。 示例问题场景: 场景1:暂存后立即pop $ git stash -u # 暂存当前所有修改(包括未跟踪文件) $ git stash pop # 恢复最近一次暂存,并删除该存储 场景2:恢复特定的存储 首先使用git stash list查看所有存储: $ git stash list stash@{0}: On master: WIP on master: ... stash@{1}: On master: ... 然后恢复指定的存储(比如stash@{1}): $ git stash pop stash@{1} 场景3:恢复暂存区状态 如果我们暂存前有文件已经git add,那么恢复时想要保持暂存状态: $ git stash pop --index 但是,如果我们在暂存之后,在同一个文件上做了修改,那么恢复时可能会冲突,需要手动解决。 总结: git stash -u是一个非常有用的命令,可以让我们暂存包括未跟踪文件在内的所有修改,以便切换分支。而git stash pop则是将暂存的修改恢复。使用时需要注意工作区的状态,避免冲突。在需要恢复暂存区状态时,记得使用--index选项。 相关问题: §§相关问题§§ 1. 如何查看当前所有的stash记录? 2. 使用git stash pop时出现冲突怎么办? 3. 除了pop,还有哪些恢复stash的方式? 4. 如何删除不需要的stash记录? 5. git stash -u和git stash -a有什么区别? </think> ### Git Stash -u 和 Git Stash Pop 详解 #### 1. **`git stash -u`** - **作用**:暂存工作区的**跟踪文件修改**和**未跟踪文件**(Untracked Files) - **与默认命令区别**: - 默认 `git stash` 只保存已跟踪文件的修改 - `-u`(`--include-untracked`)额外保存未添加到版本库的新文件 - **使用场景**: - 需要切换分支但不想提交未跟踪文件 - 临时保存未完成的修改(包括新增文件) - **示例**: ```bash # 创建新文件(未跟踪) touch new_file.txt # 修改已跟踪文件 echo "change" >> README.md # 暂存所有修改(含未跟踪文件) git stash -u # 工作区将完全干净(包括 new_file.txt 被暂存) ``` #### 2. **`git stash pop`** - **作用**: - 恢复**最近一次**暂存的修改(`stash@{0}`) - **删除**对应的 stash 记录 - **关键特性**: - 恢复内容包含工作目录修改和暂存区状态 - 若冲突会标记冲突文件(不会删除 stash 记录) - **注意事项**: - 恢复时若存在**同名未跟踪文件**会导致失败(报错 `already exists, no checkout`)[^3] - 恢复后原暂存区状态会丢失(需用 `--index` 保留) - **示例**: ```bash # 恢复最近一次暂存 git stash pop # 恢复后查看状态(恢复的文件处于未暂存状态) git status ``` --- ### ⚠️ 重要注意事项 1. **暂存区状态恢复** 若 `stash` 前执行过 `git add`,恢复时需添加 `--index` 保留暂存状态: ```bash git stash pop --index # 恢复文件原始暂存状态[^2] ``` 2. **未跟踪文件冲突** 若工作区存在与 stash 中**同名未跟踪文件**,`pop` 会失败。解决方案: ```bash # 先删除冲突的未跟踪文件 rm conflict_file.txt git stash pop ``` 3. **多次暂存操作的风险** 连续执行 `git stash` 会创建多条记录(`stash@{0}`, `stash@{1}`)。误操作后建议: ```bash git stash list # 查看所有暂存记录 git stash pop stash@{1} # 恢复指定记录 ``` --- ### 完整工作流示例 ```bash # 1. 修改文件+新增未跟踪文件 echo "修改" >> existing_file.txt touch new_file.txt # 2. 暂存所有内容(含未跟踪文件) git stash -u # 3. 切换到其他分支修复问题 git checkout fix-branch # ...修复代码... git commit -a -m "Fixed bug" git checkout main # 4. 恢复暂存内容(保留原始暂存状态) git stash pop --index # 5. 验证恢复结果 git status # 查看暂存区和工作区 ``` ### 补充命令 | 命令 | 作用 | |------|------| | `git stash list` | 查看所有暂存记录 | | `git stash drop stash@{n}` | 删除指定暂存 | | `git stash apply` | 恢复但不删除记录 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值