Git
git stash

git stash命令:保存、删除、弹出、取消、列表、应用

这篇文章的主题是git stash命令。这是一个方便的命令,你会比你想象的更多地使用它,甚至比git add和git commit更多,所以学会它可以提高你的开发效率。

1. 什么是git stash?

git stash命令暂时储存你正在进行的修改。 这很有用,因为有些命令只有在提交了当前的修改,工作树被清理后才能执行,比如一个分支修改。 在这些情况下,git stash可以用来暂时保存你的工作状态,然后你可以处理一系列的命令,回来继续工作。

当我们发出git stash命令时,Git会收集所有当前未暂存和暂存的修改(索引),并将它们存储在一个新的暂存对象中。 然后它把它们暂时存放在一个叫做stash的独立位置。

当stash运行时,当前分支处于最后提交的状态。在这种状态下,你可以自由地使用几乎所有的 Git 命令。

让我们通过一些实际的例子来看看使用git stash命令的不同方法。

2. 使用推送命令创建一个新的储藏库

push命令是git stash的开始:它保存了当前的修改,如果你愿意,你也可以输入一个单独的信息来区分这个stash。

我们以前使用git stash save命令,但现在有一个新的git stash push命令,增加了很多功能。 所以现在我们将使用push命令。 push增加的主要功能是能够对未跟踪的文件、所有文件以及特定的文件或目录运行stash。

像这样使用它

$ git stash push -m [message]

让我们看看运行的结果

git stash push -m run result

让我们从头开始。git switch命令被中止了,因为我们在1.md文件中增加了一个新的改动。 Git建议我们如果要切换的话,就提交或藏匿。

我使用git stash命令,它清除了工作树,使我可以执行git switch命令。

push命令可以用来存放任何文件,包括使用-u选项的未跟踪文件和使用-a选项的被忽略文件。 你也可以指定一个特定的文件或目录名来推送,如下所示。

git stash push filename

与上面的例子不同,我们没有用-m选项指定消息,所以你可以看到,Git为我们生成了一个带有提交ID的消息。

3. 使用list命令获取储藏室列表

正如我们在前面的例子中简单看到的,list命令将显示你保存的储藏库的列表。 它将列出在所有分支中创建的所有储藏库,最近的储藏库的编号更接近于0

该命令可以像这样使用

$ git stash list

让我们再创建两个储藏库,一个在main分支,一个在develop分支,然后运行list命令。

git stash list执行结果

git stash list命令显示总共有三个储藏库列表。 由于我们从 develop 分支保存了 2 个储藏库,没有任何信息,所以通过看列表不可能知道有什么变化。 不要忘记push命令的-m选项,以应对这样的情况。

4. 用show -p命令查看储藏室的内容

如果你只看到一个储藏室列表, 就像我们刚才看到的例子, 你可能不知道每个储藏室里都存储了什么变化. 这就是show -p命令的用武之地。

show命令只是告诉你存储在储藏库中的修改的文件名和修改的行数。 有了-p选项,你可以运行git diff命令来获得文件内部修改的更详细的信息。

该命令看起来像这样 如果你不输入[stash-number],它将自动针对最近的储藏室,编号0运行。

$ git stash show -p [stash-number]

要看到执行的结果,在2.md文件中添加新的内容,并发出push命令。

git stash show example finished

现在发布show命令。

git stash show running result

如上所示,根据你是否有 p选项,输出结果会有所不同。

5. 用apply命令恢复你的储藏库

一旦你用push命令保存了你的存储空间,并且你已经完成了,你需要做一些事情来撤销你的改变。 你可以使用applypop命令来做这个。

在这些命令中,apply命令可以确保在恢复储存库后不会删除已保存的储存库。

该命令看起来像这样 如果你没有指定[stash-number],它将自动针对最近的储藏库,编号0运行。

$ git stash apply [stash-number]

让我们来看看执行的结果

git stash apply execution result

在用 for stash信息保存了储藏库后,我们用 apply命令导入了它。apply命令运行git status命令,它显示工作副本的当前状态。 来显示工作树的当前状态。

如果你在apply之后检查储藏库列表,你可以看到恢复的储藏库仍然在那里。

6. 使用pop命令在恢复后删除存储空间

apply命令一样, pop命令也是用来撤销缓存变化的, 它在恢复后删除了现有的储藏库。

命令如下,同样,如果你不指定[stash-number],它将自动针对最近的储藏库,编号0运行。

$ git stash drop [stash-number]

执行时,它看起来像这样

 git stash pop execution result

我们再次推送了一个带有stash信息的stash。然后我们用pop命令来恢复修改,得到了和使用apply命令时一样的输出。

唯一的区别是,这个储藏库已经被删除,不再出现在储藏库列表中。

7. 使用dropclear命令删除一个储藏库而不应用它

drop命令会删除某个特定的储藏库中的修改,而不把它们应用到工作树中。

它与下面的命令一起使用,除非指定[stash-number],否则会自动针对最近的储藏库,编号为0

$ git stash drop [stash-number]

让我们看看pop命令的结果。

 git stash drop execution result

你可以看到,for stash信息中的藏书,即编号为0的藏书,已经被删除。

如果你不再需要贮藏品列表中的所有贮藏品并想删除它们,你可以用clear命令来做。

该命令看起来像这样

$ git stash clear

你可以像这样运行它

git stash clear execution result

在执行了clear命令之后,所有的储藏室列表都被删除了。

8. 如何使用stash branch命令将当前的修改转移到一个新的分支上

有时你需要将当前分支中的所有修改转移到一个新的分支中,并在那里进行工作。

这可以通过 git add 命令git checkout/git switch 命令 的组合来实现。 然而,git stash branch命令使这项任务只需一条命令即可完成。

使用下面的命令,如果你不指定[stash-number],它将自动针对最近的stash,编号0运行。

$ git stash branch [new-branch-name] [stash-number]

你可以像这样运行它

 git stash分支执行结果

9. 结束语

由于许多Git命令都是在提交状态下执行的,所以git stash命令是我每天都要接触的命令之一。 我希望这篇文章能帮助你提高你的日常开发效率。

copyright for git stash

© 2023 All rights reserved.