掌握 Git Stash 工作流程

2025-06-11

掌握 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
Enter fullscreen mode Exit fullscreen mode

我们将文件添加到 git 并提交它。

git add add.py && git commit -m "Add function"
Enter fullscreen mode Exit fullscreen mode

接下来,让我们创建并签出一个名为的新分支mul,并创建一个名为mul.py

git checkout -b mul
Enter fullscreen mode Exit fullscreen mode

将以下代码添加到文件中。

# mul.py 

def mul(a, b): 
    return a * b
Enter fullscreen mode Exit fullscreen mode

将文件添加到 git 并提交。

git add mul && git commit -m "Mul function"
Enter fullscreen mode Exit fullscreen mode

现在假设,我们需要更新 mul 函数以接受第三个参数,并且您只需像这样编辑该函数:

# mul.py

def mul(a, b, c): 
    return a * b 
Enter fullscreen mode Exit fullscreen mode

请注意,我们还没有用 更新返回值c。就在我们进行修改的时候,项目经理突然打电话过来,要求add立即用第三个参数更新函数。现在你不能在这个mul尚未完成的函数上浪费哪怕一秒钟。你该怎么办?

如果您尝试检出添加函数所在的 master,git 将不允许您这样做,因为您有尚未提交的未完成的更改。

存储更改📤

嗯,在这种情况下你应该使用这个git stash命令。我们想把当前分支上的更改保存起来,以便稍后再回来查看。

将带有消息的文件存储在mul分支上。

git stash save "Multiply function"
Enter fullscreen mode Exit fullscreen mode

现在,如果您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.
Enter fullscreen mode Exit fullscreen mode

将其与一条消息一起保存。

git stash save "Add function third argument"
Enter fullscreen mode Exit fullscreen mode

现在假设我们已经完成了subtraction分支的任务,并且我们想继续处理其他分支。

让我们首先转到master分支来完成添加的更改。

我们可以通过两种方式重新应用这些更改:

  1. git stash pop
    应用堆栈中存储的最顶部的更改并将其从堆栈中删除。

  2. git stash apply <item-id>
    根据提供的索引应用存储,并将应用的项目完整地保留在堆栈上。

弹出隐藏的更改🍾

正如我之前提到的,stash 遵循后进先出 (LIFO) 的约定。我们保存的最新项目始终位于顶部。并且,当我们使用 时pop,始终将最顶部的更改应用于当前分支。在 上运行以下命令master

git stash pop
Enter fullscreen mode Exit fullscreen mode

完成add功能并提交。

应用隐藏的更改📥

接下来,checkoutmul分支。pop由于堆栈中只剩下一个元素,我们也可以在这里使用。不过,我们先看看它是如何git stash apply工作的。

git stash apply stash@{0}
Enter fullscreen mode Exit fullscreen mode

当我们从存储区中申请时,该项目仍然保留在堆栈中。
在此处完成更改并提交。

创建包含隐藏更改的新分支

我们来做点有意思的事。假设我们想divide在新分支上添加一个函数。这跟我们之前提到的函数有点类似multiple,为什么不利用存储区中的项目来创建一个divide函数呢?

我们可以用命令来实现git stash branch。它接受<item-id>一个分支名,然后将这些更改应用到该分支。

git stash branch <branch-name> <item-id>

git stash branch divide stash@{0}
Enter fullscreen mode Exit fullscreen mode

现在我们可以重命名文件并更改函数来执行除法。

查看隐藏的更改

有时我们很容易忘记存储了哪些更改。我们忘记的内容可能包括存储了哪些文件,以及存储了哪些文件的更改。

要查看存储的文件列表,我们可以运行:

# EXAMPLE:
# git stash show stash@{<stash-id>}

git stash show stash@{2}
Enter fullscreen mode Exit fullscreen mode

为了获得存储的文件的更改的差异视图,我们可以运行:

# EXAMPLE:
# git stash show -p stash@{<stash-id>}

git stash show -p stash@{2}
Enter fullscreen mode Exit fullscreen mode

清除堆栈🧹

现在储藏已经完成了它的使命,我们可以清除它了。同样有两种方法可以做到:

  1. git stash clear
    将整个堆栈清除干净。

  2. git stash drop <item-id>
    根据提供的 ID 从堆栈中删除项目。

结论

Git stash 是一款功能强大的工具,在很多情况下都非常有用。希望本文能帮助您理解并在项目中实现它。如果您有任何建议或反馈,请在评论区留言,或者在 Twitter 上 @ 我

在GitHub上关注我

鏂囩珷鏉ユ簮锛�https://dev.to/yankee/mastering-git-stash-workflow-223
PREV
✏️ 跟我一起学 ES6:第一部分
NEXT
我如何利用 Python、搜索推文 API 和 Twilio 解决纽约停车问题