设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
修补
调试
邮件
外部系统
服务器管理员
指南
管理
管道命令
- 2.43.1 → 2.47.0 无更改
- 2.43.0 11/20/23
- 2.42.1 → 2.42.3 无更改
- 2.42.0 08/21/23
- 2.39.1 → 2.41.2 无更改
- 2.39.0 12/12/22
- 2.38.1 → 2.38.5 无更改
- 2.38.0 10/02/22
- 2.35.1 → 2.37.7 无更改
- 2.35.0 01/24/22
- 2.32.1 → 2.34.8 无更改
- 2.32.0 06/06/21
- 2.31.1 → 2.31.8 无更改
- 2.31.0 03/15/21
- 2.26.1 → 2.30.9 无更改
- 2.26.0 03/22/20
- 2.24.1 → 2.25.5 无更改
- 2.24.0 11/04/19
- 2.23.1 → 2.23.4 无更改
- 2.23.0 08/16/19
- 2.22.1 → 2.22.5 无更改
- 2.22.0 06/07/19
- 2.17.1 → 2.21.4 无更改
- 2.17.0 04/02/18
- 2.16.6 12/06/19
- 2.15.4 无更改
- 2.14.6 12/06/19
- 2.13.7 05/22/18
- 2.12.5 09/22/17
- 2.11.4 09/22/17
- 2.8.6 → 2.10.5 无更改
- 2.7.6 07/30/17
- 2.1.4 → 2.6.7 无更改
- 2.0.5 12/17/14
摘要
git stash list [<log-options>] git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>] git stash drop [-q | --quiet] [<stash>] git stash pop [--index] [-q | --quiet] [<stash>] git stash apply [--index] [-q | --quiet] [<stash>] git stash branch <branchname> [<stash>] git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [(-m | --message) <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>…]] git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [<message>] git stash clear git stash create [<message>] git stash store [(-m | --message) <message>] [-q | --quiet] <commit>
描述
当您想要记录工作目录和索引的当前状态,但又想回到一个干净的工作目录时,可以使用 git stash
。该命令将您的本地修改保存起来,并将工作目录恢复为与 HEAD
提交匹配的状态。
此命令存储的修改可以使用 git stash list
列出,使用 git stash show
检查,并使用 git stash apply
恢复(可能在不同的提交之上)。在不带任何参数的情况下调用 git stash
等效于 git stash push
。默认情况下,存储将列为“WIP on branchname …”,但在创建存储时,您可以在命令行上提供更具描述性的消息。
您创建的最新存储存储在 refs/stash
中;较旧的存储在该引用的 reflog 中找到,并且可以使用通常的 reflog 语法命名(例如,stash@{0}
是最近创建的存储,stash@{1}
是之前的存储,stash@{2.hours.ago}
也是可能的)。存储也可以通过仅指定存储索引来引用(例如,整数 n
等效于 stash@{n}
)。
命令
- push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [(-m|--message) <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>…]
-
将您的本地修改保存到一个新的 存储条目 中,并将它们回滚到 HEAD(在工作树和索引中)。<message> 部分是可选的,它提供了与存储状态一起的描述。
为了快速创建快照,您可以省略“push”。在这种模式下,不允许使用非选项参数,以防止拼写错误的子命令创建不需要的存储条目。对此有两个例外:
stash -p
充当stash push -p
的别名,路径规范元素在双连字符--
后允许使用,以进行区分。 - save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]
-
此选项已弃用,建议使用 git stash push。它与“stash push”的不同之处在于它不能接受路径规范。相反,所有非选项参数都被连接起来形成存储消息。
- list [<log-options>]
-
列出您当前拥有的存储条目。每个 存储条目 都列出了它的名称(例如,
stash@{0}
是最新的条目,stash@{1}
是之前的条目,等等)、创建条目时当前的分支名称以及创建条目所基于的提交的简短描述。stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation stash@{1}: On master: 9cc0589... Add git-stash
该命令接受适用于 git log 命令的选项来控制显示的内容和方式。请参阅 git-log[1]。
- show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]
-
将存储条目中记录的更改显示为存储内容与首次创建存储条目时的提交之间的差异。默认情况下,该命令显示 diffstat,但它将接受 git diff 知道的任何格式(例如,
git stash show -p stash@{1}
以补丁形式查看最近的第二个条目)。如果未提供<diff-option>
,则默认行为将由stash.showStat
和stash.showPatch
配置变量给出。您还可以使用stash.showIncludeUntracked
设置是否默认启用--include-untracked
。 - pop [--index] [-q|--quiet] [<stash>]
-
从存储列表中删除单个存储状态,并将其应用于当前工作树状态之上,即执行
git stash push
的逆操作。工作目录必须与索引匹配。应用状态可能会失败并出现冲突;在这种情况下,它不会从存储列表中删除。您需要手动解决冲突,然后手动调用
git stash drop
。 - apply [--index] [-q|--quiet] [<stash>]
-
与
pop
类似,但不从存储列表中删除状态。与pop
不同,<stash>
可以是任何看起来像是由stash push
或stash create
创建的提交。 - branch <branchname> [<stash>]
-
创建一个名为
<branchname>
的新分支,并从<stash>
最初创建时的提交开始,将<stash>
中记录的更改应用于新的工作树和索引。如果成功,并且<stash>
是stash@{<revision>}
形式的引用,则删除<stash>
。如果您在其中运行
git stash push
的分支发生了足够大的更改,以至于git stash apply
由于冲突而失败,则此功能很有用。由于存储条目应用于git stash
运行时 HEAD 的提交之上,因此它无需冲突即可恢复最初存储的状态。 - clear
-
删除所有存储条目。请注意,这些条目随后将被修剪,并且可能无法恢复(有关可能的策略,请参阅下面的 示例)。
- drop [-q|--quiet] [<stash>]
-
从存储条目列表中删除单个存储条目。
- create
-
创建一个存储条目(它是常规的提交对象),并返回其对象名称,而不将其存储在 ref 命名空间中的任何位置。这旨在对脚本有用。这可能不是您想要使用的命令;请参阅上面的“push”。
- store
-
将通过 git stash create 创建的给定存储(它是悬空合并提交)存储在存储 ref 中,更新存储 reflog。这旨在对脚本有用。这可能不是您想要使用的命令;请参阅上面的“push”。
选项
- -a
- --all
-
此选项仅对
push
和save
命令有效。所有被忽略和未跟踪的文件也将被存储,然后使用
git clean
清理。 - -u
- --include-untracked
- --no-include-untracked
-
与
push
和save
命令一起使用时,所有未跟踪的文件也将被存储,然后使用git clean
清理。与
show
命令一起使用时,将存储条目中的未跟踪文件显示为差异的一部分。 - --only-untracked
-
此选项仅对
show
命令有效。仅显示存储条目中未跟踪的文件作为差异的一部分。
- --index
-
此选项仅对
pop
和apply
命令有效。尝试恢复工作树的更改以及索引的更改。但是,当您有冲突(存储在索引中,因此您无法再应用原始更改)时,这可能会失败。
- -k
- --keep-index
- --no-keep-index
-
此选项仅对
push
和save
命令有效。已添加到索引的所有更改都保持不变。
- -p
- --patch
-
此选项仅对
push
和save
命令有效。交互式地选择 HEAD 和工作树之间差异的块以进行存储。存储条目被构建成其索引状态与您的存储库的索引状态相同,并且其工作树仅包含您交互式选择的更改。然后从您的工作树中回滚选定的更改。有关如何操作
--patch
模式,请参阅 git-add[1] 的“交互模式”部分。--patch
选项隐含--keep-index
。您可以使用--no-keep-index
覆盖此选项。 - -S
- --staged
-
此选项仅对
push
和save
命令有效。仅存储当前已暂存的更改。这类似于基本的
git commit
,只是状态提交到存储而不是当前分支。--patch
选项优先于此选项。 - --pathspec-from-file=<file>
-
此选项仅对
push
命令有效。路径规范在
<file>
中传递而不是命令行参数。如果<file>
恰好是-
,则使用标准输入。路径规范元素由 LF 或 CR/LF 分隔。路径规范元素可以像配置变量core.quotePath
所解释的那样用引号括起来(请参阅 git-config[1])。另请参阅--pathspec-file-nul
和全局--literal-pathspecs
。 - --pathspec-file-nul
-
此选项仅对
push
命令有效。仅在
--pathspec-from-file
情况下有意义。路径规范元素以 NUL 字符分隔,所有其他字符都按字面意思取(包括换行符和引号)。 - -q
- --quiet
-
此选项仅对
apply
、drop
、pop
、push
、save
、store
命令有效。静默,抑制反馈消息。
- --
-
此选项仅对
push
命令有效。为了消除歧义,将路径规范与选项分开。
- <pathspec>…
-
此选项仅对
push
命令有效。新的存储条目仅记录与路径规范匹配的文件的修改状态。然后,索引条目和工作树文件也被回滚到 HEAD 中的状态,仅针对这些文件,保留不匹配路径规范的文件。
有关更多详细信息,请参阅 gitglossary[7] 中的 pathspec 条目。
- <stash>
-
此选项仅对
apply
、branch
、drop
、pop
、show
命令有效。stash@{<revision>}
形式的引用。当没有给出<stash>
时,假定为最新的存储(即stash@{0}
)。
讨论
存储条目表示为一个提交,其树记录工作目录的状态,其第一个父节点是在创建条目时位于 HEAD
的提交。第二个父节点的树记录创建条目时索引的状态,并将其作为 HEAD
提交的子节点。祖先图如下所示
.----W / / -----H----I
其中 H
是 HEAD
提交,I
是记录索引状态的提交,W
是记录工作树状态的提交。
示例
- 拉取到脏树
-
当您处于某个任务的中间时,您了解到有一些上游更改可能与您正在执行的操作相关。当您的本地更改与上游更改不冲突时,简单的
git pull
将允许您继续前进。但是,在某些情况下,您的本地更改确实与上游更改冲突,并且
git pull
拒绝覆盖您的更改。在这种情况下,您可以将更改存储起来,执行拉取,然后取消存储,如下所示$ git pull ... file foobar not up to date, cannot merge. $ git stash $ git pull $ git stash pop
- 中断的工作流程
-
当您处于某个任务的中间时,您的老板进来要求您立即修复某些东西。传统上,您会将更改提交到临时分支以将其存储起来,然后返回到原始分支以进行紧急修复,如下所示
# ... hack hack hack ... $ git switch -c my_wip $ git commit -a -m "WIP" $ git switch master $ edit emergency fix $ git commit -a -m "Fix in a hurry" $ git switch my_wip $ git reset --soft HEAD^ # ... continue hacking ...
您可以使用 git stash 来简化上述操作,如下所示
# ... hack hack hack ... $ git stash $ edit emergency fix $ git commit -a -m "Fix in a hurry" $ git stash pop # ... continue hacking ...
- 测试部分提交
-
当您想要从工作树中的更改中创建两个或多个提交,并且您希望在提交之前测试每个更改时,可以使用
git stash push --keep-index
# ... hack hack hack ... $ git add --patch foo # add just first part to the index $ git stash push --keep-index # save all other changes to the stash $ edit/build/test first part $ git commit -m 'First part' # commit fully tested change $ git stash pop # prepare to work on all other changes # ... repeat above five steps until one commit remains ... $ edit/build/test remaining parts $ git commit foo -m 'Remaining parts'
-
当您处于大量更改的中间并且发现一些您不想忘记修复的无关问题时,您可以进行更改,暂存它们,并使用
git stash push --staged
将其存储起来以供将来使用。这类似于提交暂存的更改,只是提交最终位于存储中,而不是当前分支上。# ... hack hack hack ... $ git add --patch foo # add unrelated changes to the index $ git stash push --staged # save these changes to the stash # ... hack hack hack, finish current changes ... $ git commit -m 'Massive' # commit fully tested changes $ git switch fixup-branch # switch to another branch $ git stash pop # to finish work on the saved changes
- 恢复错误清除/删除的存储条目
-
如果您错误地删除或清除存储条目,则无法通过正常的安全机制恢复它们。但是,您可以尝试以下咒语以获取存储库中仍然存在但不再可访问的存储条目的列表
git fsck --unreachable | grep commit | cut -d\ -f3 | xargs git log --merges --no-walk --grep=WIP
配置
本节中此行以下的所有内容都是从 git-config[1] 文档中选择性地包含的。内容与那里找到的内容相同
- stash.showIncludeUntracked
-
如果将其设置为 true,则
git stash show
命令将显示存储条目的未跟踪文件。默认为 false。请参阅 git-stash[1] 中 show 命令的说明。 - stash.showPatch
-
如果将其设置为 true,则没有选项的
git stash show
命令将以补丁形式显示存储条目。默认为 false。请参阅 git-stash[1] 中 show 命令的说明。 - stash.showStat
-
如果将其设置为 true,则没有选项的
git stash show
命令将显示存储条目的 diffstat。默认为 true。请参阅 git-stash[1] 中 show 命令的说明。
Git
git[1] 套件的一部分