掌握 Git Stash 工作流程
Git 是一个功能强大的工具,它在我们的开发工作流程中有很多用例。其中一种用例就是将某个分支的更改隔离到其自身。让我来详细解释一下。
假设你正在一个分支上工作admin-dashboard
,这个分支名为“实现管理仪表板”。但你还没有完成,项目经理想要一个快速修复登录实现的问题的方案。现在你想切换到这个login
分支并修复问题,但又不想保留你之前在admin-dashboard
分支上所做的更改。这时,git stash 就派上用场了。
Git stash 什么?
Git stash 允许你快速将修改后的变更放入 LIFO(后进先出)堆栈中,并在可行的情况下重新应用它们。我们将进行一个粗略的演示来了解它的实际应用。
Git stash 演练🚶♂️
在空目录上启动 git。添加一个名为的文件add.py
并写入以下代码。
# add.py
def add(a, b):
return a + b
我们将文件添加到 git 并提交它。
git add add.py && git commit -m "Add function"
接下来,让我们创建并签出一个名为的新分支mul
,并创建一个名为mul.py
git checkout -b mul
将以下代码添加到文件中。
# mul.py
def mul(a, b):
return a * b
将文件添加到 git 并提交。
git add mul && git commit -m "Mul function"
现在假设,我们需要更新 mul 函数以接受第三个参数,并且您只需像这样编辑该函数:
# mul.py
def mul(a, b, c):
return a * b
请注意,我们还没有用 更新返回值c
。就在我们进行修改的时候,项目经理突然打电话过来,要求add
立即用第三个参数更新函数。现在你不能在这个mul
尚未完成的函数上浪费哪怕一秒钟。你该怎么办?
如果您尝试检出添加函数所在的 master,git 将不允许您这样做,因为您有尚未提交的未完成的更改。

存储更改📤
嗯,在这种情况下你应该使用这个git stash
命令。我们想把当前分支上的更改保存起来,以便稍后再回来查看。
将带有消息的文件存储在mul
分支上。
git stash save "Multiply function"
现在,如果您git status
,工作目录将干净,您可以跳转到 master 分支查看更改。我们可以使用 来查看存储中的项目git stash list
。我们可以使用 来查看堆栈中项目的差异git stash show
现在您正在master
分支中修改该add
功能,并且包含该功能是一项更高优先级的工作subtraction
。
注意:
现实生活中的项目经理不会以这种方式提出任务。
您的add
函数看起来很像mul
现在的函数。
# add.py
def add(a, b, c):
return a + b # couldn't include `c` due to a priority task.
将其与一条消息一起保存。
git stash save "Add function third argument"

现在假设我们已经完成了subtraction
分支的任务,并且我们想继续处理其他分支。
让我们首先转到master
分支来完成添加的更改。
我们可以通过两种方式重新应用这些更改:
-
git stash pop
应用堆栈中存储的最顶部的更改并将其从堆栈中删除。 -
git stash apply <item-id>
根据提供的索引应用存储,并将应用的项目完整地保留在堆栈上。
弹出隐藏的更改🍾
正如我之前提到的,stash 遵循后进先出 (LIFO) 的约定。我们保存的最新项目始终位于顶部。并且,当我们使用 时pop
,始终将最顶部的更改应用于当前分支。在 上运行以下命令master
。
git stash pop
完成add
功能并提交。
应用隐藏的更改📥
接下来,checkoutmul
分支。pop
由于堆栈中只剩下一个元素,我们也可以在这里使用。不过,我们先看看它是如何git stash apply
工作的。
git stash apply stash@{0}
当我们从存储区中申请时,该项目仍然保留在堆栈中。
在此处完成更改并提交。
创建包含隐藏更改的新分支
我们来做点有意思的事。假设我们想divide
在新分支上添加一个函数。这跟我们之前提到的函数有点类似multiple
,为什么不利用存储区中的项目来创建一个divide
函数呢?
我们可以用命令来实现git stash branch
。它接受<item-id>
一个分支名,然后将这些更改应用到该分支。
git stash branch <branch-name> <item-id>
git stash branch divide stash@{0}

现在我们可以重命名文件并更改函数来执行除法。
查看隐藏的更改
有时我们很容易忘记存储了哪些更改。我们忘记的内容可能包括存储了哪些文件,以及存储了哪些文件的更改。
要查看存储的文件列表,我们可以运行:
# EXAMPLE:
# git stash show stash@{<stash-id>}
git stash show stash@{2}
为了获得存储的文件的更改的差异视图,我们可以运行:
# EXAMPLE:
# git stash show -p stash@{<stash-id>}
git stash show -p stash@{2}
清除堆栈🧹
现在储藏已经完成了它的使命,我们可以清除它了。同样有两种方法可以做到:
-
git stash clear
将整个堆栈清除干净。 -
git stash drop <item-id>
根据提供的 ID 从堆栈中删除项目。
结论
Git stash 是一款功能强大的工具,在很多情况下都非常有用。希望本文能帮助您理解并在项目中实现它。如果您有任何建议或反馈,请在评论区留言,或者在 Twitter 上 @ 我。
在GitHub上关注我
鏂囩珷鏉ユ簮锛�https://dev.to/yankee/mastering-git-stash-workflow-223