git stash 既不影响各分支的代码,又能保存暂时不用的代码

本文详细介绍了Git中stash命令的使用方法,包括如何暂存未提交的修改、查看stash列表、应用stash以及清除所有stash条目等。同时提醒用户在使用stash时应注意避免覆盖已有的stash信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git stash是git一个很有用的命令,它的作用是把当前未提交的修改暂存起来,让仓库还原到最后一次提交的状态。

1/7

git stash 不建议使用

  git stash命令会将仓库中的修改保存,建立一条stash信息,默认的说明信息是最后一次提交的节点号和提交说明。

注意:git stash 在某些情况下会覆盖上一次的git stash。

2/7

git stash save ‘说明信息’ 建议使用

  与1的效果一样,说明信息是指定的内容,更加利于了解stash的内容。

3/7

git stash list

  列出当前仓库下所有的stash条目,每一条stash用stash@{n}标识。

4/7

git stash pop [stash] 不建议使用

    将stash的内容弹出,默认弹出最上面的那条,即stash@{0}。此外还可以在pop后加stash@{n}来指定要弹出的stash条目。

注意:弹出后,该条stash便不存在,建议使用git stash apply stash@{0}

5/7

git stash drop [stash]

  丢弃stash条目,默认丢弃最上面的那条,即stash@{0},此外还可以在drop后加stash@{n}来指定要丢弃的stash条目。

6/7

git stash clear

    清除所有的stash条目。

7/7

git show stash@{n}

  当有多条记录并且过了一段时间忘记stash内容时通过该命令可以查看stash的具体内容
  1. linux配置git
    https://www.cnblogs.com/shaohuixia/p/5503521.html

  2. 生成密钥

ssh-keygen -t rsa -C "w327134@163.com"
cat ~/.ssh/id_rsa.pub

https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7%94%9F%E6%88%90-SSH-%E5%85%AC%E9%92%A5
4. 一键推送到多个库
git remote set-url --add origin 地址
参考链接 https://www.jianshu.com/p/6c3c4ad98918

<think>我们有一个需求:在使用gitstash时,希望排除某个特定文件,只保存其他暂存区中的文件。分析:默认的`gitstash`(包括`gitstash save`和`gitstash push`)会保存工作目录和暂存区的所有修改(但包括未跟踪的文件,除非使用`-u`或`-a`选项)。但是,Git本身并没有提供直接排除某个文件的选项。因此,我们需要采取一些策略来实现这个需求。以下是一种可行的方法:步骤:1.先将我们保存的文件(即要排除的文件)从暂存区中移除(但保留工作目录中的修改)。2.执行`gitstash`保存剩余的暂存区和工作目录的修改。3.将之前排除的文件重新添加到暂存区(如果需要的话,也可以添加,取决于后续操作)。注意:这样操作后,被排除的文件在工作目录中的修改仍然存在,而其他修改则被存入了stash。具体命令:假设我们要排除的文件是`file_to_exclude.txt`。```bash#步骤1:将指定文件从暂存区中移除(但保留工作目录的修改) gitreset --file_to_exclude.txt#步骤2:保存剩余的修改(包括工作目录和暂存区)git stashsave --keep-index"保存除file_to_exclude.txt外的修改" #注意:这里使用--keep-index是为了保留暂存区中剩下的文件(即没有被排除的文件)的暂存状态。#但实际上,在上一步中我们已经将指定文件从暂存区移除了,所以暂存区只剩下我们想要保存的其他文件。#步骤3:此时,被排除的文件(file_to_exclude.txt)的修改仍然在工作目录中,并且没有被暂存。#如果我们希望将它恢复到之前的状态(即重新放入暂存区),可以执行: gitadd file_to_exclude.txt#但注意:步骤3是可选的。如果我们希望这个文件继续留在工作目录且暂存,就需要执行这一步。```解释: -第一步:`git reset-- file_to_exclude.txt`将指定文件从暂存区移除,但工作目录的修改仍然保留。这样,这个文件就变成了未暂存的状态。-第二步:使用`gitstash save--keep-index`,它会将工作目录和暂存区的修改保存起来,但会保留暂存区的内容(即除了被排除文件外,其他已经暂存的文件仍然在暂存区)。但是,这里我们第二步保存的是移除指定文件后的暂存区状态,所以被排除文件在暂存区,也会被保存stash中(因为stash保存的是暂存区和工作目录的修改,但工作目录的修改我们并想全部保存?)。然而,这里有一个问题:我们第二步保存的是工作目录的所有修改(包括被排除文件)?对,因为第一步只是把文件从暂存区移除,并没有撤销工作目录的修改。所以,第二步执行`git stash`时,这个被排除文件的工作目录修改也会被保存stash中吗?实际上,`git stash`默认会保存工作目录和暂存区的修改。所以,被排除文件现在处于未暂存状态,它的修改属于工作目录的修改,因此也会被保存stash中。这符合我们的需求(我们希望排除这个文件)。因此,我们需要调整策略:在stash之前,仅要将其从暂存区移除,还要将其工作目录的修改也隐藏起来(或者暂时撤销),然后在stash后再恢复这个文件的修改。另一种思路:1.先将被排除的文件的工作目录修改临时保存到一个补丁文件中(或者用其他方法暂时隐藏)。2.然后执行stash(此时stash中就会包含这个文件的修改)。3.再将临时保存的修改恢复。具体步骤:```bash#步骤1:将被排除文件的修改保存为补丁(然后撤销该文件的修改)git diff-- file_to_exclude.txt> exclude.patchgit checkout-- file_to_exclude.txt#丢弃工作目录的修改(也可以使用`git restore`)#步骤2:现在工作目录中已经没有这个文件的修改了,执行stash保存其他修改gitstash save--keep-index "保存其他修改"#步骤3:恢复被排除文件的修改gitapply exclude.patch#应用补丁,恢复修改rmexclude.patch#删除临时补丁文件#步骤4:如果之前这个文件在暂存区,我们还需要重新暂存它(如果需要的话)#因为我们之前丢弃了它的工作目录修改,现在通过补丁恢复后,它处于未暂存状态,所以需要重新addgitadd file_to_exclude.txt```但是,这种方法有点复杂,而且如果文件很大或者修改很多,补丁文件可能会很大。有没有更简单的方法?我们可以利用`git stash`的`--patch`选项,手动选择要stash的修改,但这样是交互式的,适合脚本化。或者,我们可以使用临时分支?考虑到需求是排除指定文件,我们可以:1.创建一个临时分支,提交当前暂存区的内容(除了要排除的文件,我们先把要排除的文件从暂存区移除)。2.然后,将剩余的工作目录修改(包括其他文件的修改和要排除文件的修改)存入stash。3.然后切换回原分支,将临时分支的提交合并过来(作为一次提交),然后恢复stash(但此时stash中包含了要排除文件的修改,我们并想恢复它?)。这个思路也比较复杂。实际上,我们可能更倾向于第一种方法(保存补丁)的变种:使用`gitstash`的`-k`(即`--keep-index`)选项,但配合手动重置要排除的文件。重新思考:我们的目标:将除了指定文件外的其他修改(包括暂存区和工作目录)都保存stash,而指定文件保留在工作目录(且进入stash)。步骤:1.将要排除的文件从暂存区移除(如果它在暂存区的话):`git reset-- file_to_exclude.txt`2.将工作目录中要排除的文件的修改暂时重置(撤销):`git checkout-- file_to_exclude.txt`这样,这个文件就完全恢复了(没有任何修改)。3.执行`git stashsave--include-untracked`(如果需要包括未跟踪文件的话)或者`gitstash save`(只包括已跟踪文件的修改)来保存其他修改。4.然后,我们重新应用之前被排除的文件的修改(如果我们之前有备份的话?)?但是,第二步我们撤销了它的修改,所以之前修改就丢失了。这显然行。因此,我们必须在撤销之前先备份这个文件的修改,然后在stash后恢复。所以,综合起来,我们采用以下方法: ```bash#备份要排除的文件的修改cpfile_to_exclude.txt file_to_exclude.txt.bak#撤销工作目录中该文件的修改(也可以使用`git restore`)git checkout-- file_to_exclude.txt#如果该文件之前在暂存区,则从暂存区移除(如果之前已经暂存,第一步我们已经移除了,所以这里可以省略?) #然后,执行stash保存其他修改git stashsave --keep-index"保存其他修改"#恢复被排除文件的修改mv file_to_exclude.txt.bakfile_to_exclude.txt#然后,可以选择是否重新将该文件加入暂存区#git addfile_to_exclude.txt```注意:这种方法对于二进制文件也是有效的,因为使用的是复制备份。但是,这种方法有一个缺点:如果文件很大,复制可能会消耗时间和磁盘空间。另外,如果文件是未跟踪的,那么`git checkout--`影响它(因为未跟踪文件Git管理),所以我们需要单独处理未跟踪文件。如果被排除的文件是未跟踪的,那么上面的`git checkout--`会对它起作用,所以我们需要撤销它(因为它本来就Git的控制下),但是我们需要在stash之前将其移走,stash后再移回来。因此,我们可以:```bash#如果文件是未跟踪的,我们直接移动它if[ -f file_to_exclude.txt]; thenmv file_to_exclude.txtfile_to_exclude.txt.bakfi#如果是已跟踪的,撤销修改gitcheckout --file_to_exclude.txt2>/dev/null|| true#然后执行stashgit stashsave --keep-index"message" #恢复备份if[ -f file_to_exclude.txt.bak]; thenmv file_to_exclude.txt.bakfile_to_exclude.txtfi```这样,无论文件是已跟踪还是未跟踪,都可以处理。但是,这个方法有点复杂,而且需要写脚本。对于日常使用,如果只有一个文件,我们可以手动操作。总结:Git没有提供直接排除某个文件进行stash的命令,所以我们需要通过备份和恢复的方式来实现。另一种更简单的方法:使用交互式stash(`gitstash -p`),手动选择要stash的修改,跳过要排除的文件。但是交互式操作需要人工参与,适合自动化。因此,根据情况选择: -如果只有少量修改,建议使用交互式stash:`gitstash save-p`,然后选择要stash的块(跳过要排除的文件)。-如果希望自动化,可以使用上述备份和恢复的方法。针对用户的问题,我们给出交互式的方法(因为更简单,且需要备份文件):步骤:1.执行`git stashsave -p`(或`gitstash push-p`)。2. Git会逐个显示每个修改的块(hunk),询问是否要stash。3.对于要排除的文件中的修改,输入`n`(stash)。4.对于其他修改,输入`y`(要stash)。5.完成所有选择后,输入`q`退出(如果全部选择完会自动退出)。注意:这种方法可以精确到每个块(hunk),所以同一个文件中,我们也可以选择部分修改stash,部分stash。但是,如果整个文件都stash,那么可以在遇到该文件的修改时全部跳过(输入`n`)。示例:```bash$ gitstash save-p"排除file_to_exclude.txt" ...交互式界面... ```交互式界面操作提示: -`y`:stash这个块-`n`:stash这个块- `q`:退出,但保留已经选择的块-`a`:stash当前文件的所有块-`d`:stash当前文件的所有块-等等(输入`?`可以查看帮助)因此,对于排除特定文件,我们可以在遇到该文件时,输入`d`(表示stash整个文件)。这种方法需要备份文件,操作完成后,被排除的文件修改仍然保留在工作目录中。所以,推荐使用交互式stash。结论:要排除指定文件并保存暂存区内容,可以使用交互式stash:```bashgitstash save-p```然后在交互式界面中跳过(stash)指定文件的修改。注意:使用`git stashpush`也可以,但`save`和`push`在这里是等价的。另外,如果文件数量多,或者修改的块多,这种方法非常直接。但是,如果修改很多,手动选择可能会比较繁琐,那么可以考虑使用备份的方法。因此,我们提供了两种方法:方法一:备份和恢复(适用于自动化,但需要处理文件备份)方法二:交互式stash(适用于手动操作,无需备份)请根据具体情况选择。</think>### Git Stash 排除指定文件并保存暂存区内容 要排除特定文件并仅保存暂存区内容,Git 本身没有直接提供排除参数,但可以通过组合命令实现。以下是两种可靠方法: #### 方法一:分步操作(推荐) ```bash # 1. 将指定文件从暂存区移除(保留工作目录修改) git reset -- <要排除的文件路径> # 2. 保存剩余暂存区内容到stash使用--keep-index保留暂存状态) git stash save --keep-index "排除指定文件的保存" # 3. (可选) 恢复被排除文件的暂存状态 git add <要排除的文件路径> ``` **原理说明**: 1. `git reset -- <file>` 将指定文件移出暂存区,但保留工作目录修改[^3] 2. `git stash save --keep-index` 只保存当前暂存区内容 3. 排除的文件修改仍保留在工作目录 #### 方法二:交互式选择(精确控制) ```bash # 启动交互式stash界面 git stash -p # 操作提示: # y - 保存当前代码块 # n - 跳过当前代码块 # q - 退出并保存已选内容 # / - 搜索正则匹配 ``` 在交互界面中: 1. 对要排除的文件选择 `n` (skip) 2. 对需要保存的文件选择 `y` (stash this hunk) 3. 完成后按 `q` 退出 #### 验证结果 ```bash # 查看stash内容(确认排除文件存在) git stash show -p # 查看工作目录状态(排除文件应未暂存) git status ``` #### 恢复时注意事项 恢复 stash 时需使用 `--index` 参数还原暂存状态: ```bash git stash apply --index # 恢复暂存区和工作目录 ``` > **关键区别**:`--keep-index` 在保存时保留暂存区状态,而 `--index` 在恢复时还原暂存状态[^4]。 #### 工作流示例 ```mermaid graph LR A[修改文件A/B/C] --> B[git add A B C] B --> C[git reset -- C] C --> D[git stash save --keep-index] D --> E[提交A/B: git commit] E --> F[恢复C修改: git add C] ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值