保存工作进度

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

欢迎回来,Git 探索者!今天,我们将深入探讨 Git 中用于管理工作进度的一个非常有用的功能:stash(暂存)。你是否曾经在开发某个功能时,突然需要切换到另一个任务?Git stash 就是来拯救你的!

你可以把 Git stash 想象成一个神奇的抽屉,可以暂时存放你未完成的工作。它允许你快速切换上下文,而无需提交未完成的工作。这在需要切换分支、拉取更新或处理紧急 bug 修复时非常有用。

在这个实验中,我们将探索如何使用 Git stash 来保存你的工作进度,如何应用暂存的更改,从暂存中创建分支,管理多个暂存,以及清理你的暂存。通过本实验,你将在 Git 工具包中获得一个强大的新工具,使你的工作流程更加顺畅和灵活。

让我们开始吧,解锁 Git stash 的强大功能!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("`Git`")) -.-> git/SetupandConfigGroup(["`Setup and Config`"]) git(("`Git`")) -.-> git/BasicOperationsGroup(["`Basic Operations`"]) git(("`Git`")) -.-> git/DataManagementGroup(["`Data Management`"]) git(("`Git`")) -.-> git/BranchManagementGroup(["`Branch Management`"]) git/SetupandConfigGroup -.-> git/init("`Initialize Repo`") git/BasicOperationsGroup -.-> git/commit("`Create Commit`") git/DataManagementGroup -.-> git/stash("`Save Changes Temporarily`") git/BranchManagementGroup -.-> git/branch("`Handle Branches`") subgraph Lab Skills git/init -.-> lab-387492{{"`保存工作进度`"}} git/commit -.-> lab-387492{{"`保存工作进度`"}} git/stash -.-> lab-387492{{"`保存工作进度`"}} git/branch -.-> lab-387492{{"`保存工作进度`"}} end

设置你的工作区

在我们深入探讨 stash(暂存)之前,让我们先设置一个工作区来进行实验。我们将创建一个新目录,初始化一个 Git 仓库,并添加一些初始内容。

打开你的终端并输入以下命令:

cd ~/project
mkdir git-stash-lab
cd git-stash-lab
git init
echo "## Git Stash Lab" > README.md
git add README.md
git commit -m "Initial commit"

让我们分解一下这些命令的作用:

  1. cd ~/project:将当前目录切换到你的主目录中的 "project" 文件夹。
  2. mkdir git-stash-lab:创建一个名为 "git-stash-lab" 的新目录。
  3. cd git-stash-lab:进入新创建的目录。
  4. git init:在当前目录中初始化一个新的 Git 仓库。
  5. echo "## Git Stash Lab" > README.md:创建一个名为 "README.md" 的新文件,内容为 "## Git Stash Lab"。
  6. git add README.md:将新文件添加到暂存区。
  7. git commit -m "Initial commit":使用暂存的更改创建你的第一次提交。

很好!我们现在有一个包含一次提交的仓库。让我们检查一下状态:

git status

你应该会看到一条消息,说明你的工作树是干净的。这意味着我们已经准备好开始实验 Git stash 了!

如果你遇到任何问题,请确保你在正确的目录中,并且 Git 已正确安装在你的系统上。你可以通过运行 git --version 来检查你的 Git 安装。

暂存更改

现在我们已经设置好了工作区,让我们创建一些更改并学习如何暂存它们。

首先,让我们对 README.md 文件做一些更改:

echo "This is a work in progress" >> README.md

这条命令会在我们的 README.md 文件中追加一行新内容。同时,我们创建一个新文件:

echo "Some important notes" > notes.txt

现在,如果我们运行 git status,我们会看到既有已修改的文件,也有未跟踪的文件:

git status

你应该会看到输出显示 README.md 已被修改,而 notes.txt 是未跟踪的文件。

想象一下,此时你需要快速切换到另一个任务,但你还没有准备好提交这些更改。这时 git stash 就派上用场了!

要暂存你的更改,请运行:

git stash

你应该会看到类似以下的输出:

Saved working directory and index state WIP on master: 1234567 Initial commit

现在,如果你再次运行 git status,你会看到一些有趣的现象:

git status

你会注意到,虽然 README.md 不再显示为已修改,但 notes.txt 仍然被列为未跟踪的文件。这是关于 git stash 的一个关键点:

重要提示: 默认情况下,git stash 只会暂存以下内容:

  1. 已跟踪文件的更改(Git 已经在跟踪的文件)
  2. 已暂存的更改

未跟踪的文件(如我们的 notes.txt)默认不会包含在暂存中。这种行为确保 Git 不会意外隐藏你可能不想包含在仓库中的新文件。

如果你想将未跟踪的文件也包含在暂存中,可以使用 -u(或 --include-untracked)选项:

git stash -u

运行此命令后,README.md 的更改和新的 notes.txt 文件都会被暂存。

要查看暂存中的内容,可以使用:

git stash list

你应该会看到一个或两个暂存条目,具体取决于你是否使用了 -u 选项。

q 退出暂存列表视图。

请记住,暂存非常适合快速切换上下文。然而,它并不能替代长期工作流中的提交。暂存是用于临时存储的。

应用暂存的更改

现在我们已经暂存了更改,让我们学习如何将它们恢复。主要有两个命令可以实现这一点:git stash applygit stash pop

让我们从 git stash apply 开始:

git stash apply

运行此命令后,你可能会注意到一些意外的情况。让我们检查一下状态:

git status

你应该会看到类似以下的输出:

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        notes.txt

nothing added to commit but untracked files present (use "git add" to track)

令人惊讶的是,你只会看到 notes.txt 作为未跟踪的文件,而不会看到 README.md 的任何更改。这种行为的原因是:

  1. 在第二步中,我们首先使用了不带 -u 选项的 git stash,它只暂存了 README.md 的更改。
  2. 然后我们使用了 git stash -u,它暂存了 README.md 的更改以及未跟踪的 notes.txt 文件。
  3. 当我们应用暂存时,Git 会应用最近的暂存(即使用 -u 创建的暂存),但它不会显示 README.md 的更改,因为这些更改已经包含在之前的暂存中。

要查看所有更改,包括 README.md 的更改,你可以使用:

git stash apply stash@{1}

现在,如果你再次检查状态,你应该会看到 README.md 的更改以及 notes.txt 作为未跟踪的文件。

这种情况突显了使用暂存时的一个重要方面:创建和应用暂存的顺序会影响结果。在应用暂存之前检查暂存的内容总是一个好习惯,尤其是在处理多个暂存时。

applypop 的区别在于,apply 会保留暂存中的更改,而 pop 在应用后会从暂存中移除这些更改。

git stash clear
git stash -u
git stash list

我们首先清除所有暂存以重新开始,然后使用 -u 选项暂存我们的更改以包含未跟踪的文件。最后,我们列出暂存以验证暂存是否已创建。

让我们再次暂存更改并尝试 pop

git stash pop

你会看到与之前类似的输出,但如果你现在运行 git stash list,你会看到你的暂存是空的。

为什么同时有 applypopapply 在你希望将相同的暂存更改应用到多个分支时非常有用。而 pop 更常用于你在同一分支上恢复工作时。

从暂存创建分支

有时,你可能会意识到暂存的更改实际上应该放在它们自己的分支上。Git 通过 git stash branch 命令使这一操作变得非常简单。

首先,让我们创建一些新的更改并暂存它们:

echo "Feature in progress" >> README.md
echo "More notes" >> notes.txt
git stash -u

现在,让我们用这些更改创建一个新分支:

git stash branch feature-branch

这条命令会创建一个名为 "feature-branch" 的新分支,切换到该分支,然后将暂存的更改应用到它。暂存随后会从你的暂存列表中移除。

你应该会看到类似以下的输出:

Switched to a new branch 'feature-branch'
On branch feature-branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        notes.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1234567890abcdef1234567890abcdef12345678)

当你暂存了一些实验性更改,后来决定它们值得在自己的分支上继续开发时,这个功能特别有用。

请记住,从暂存创建分支后,如果你希望保留这些更改,你需要提交它们:

git add README.md notes.txt
git commit -m "Start new feature"

要切换回你的 master 分支,请使用:

git checkout master

管理多个暂存

在使用 Git 的过程中,你可能会发现自己需要暂存多组更改。Git 允许你轻松管理多个暂存。让我们探索如何创建、列出和管理多个暂存。

首先,让我们创建三个包含不同更改的暂存:

## 第一个暂存
echo "Change 1" >> README.md
git stash push -m "First change"

## 第二个暂存,包含未跟踪的文件
echo "Change 2" >> README.md
echo "Note 2" >> notes.txt
git stash push -u -m "Second change"

## 第三个暂存
echo "Change 3" >> README.md
git stash push -m "Third change"

让我们分解一下我们做了什么:

  1. 创建了第一个暂存,包含对 README.md 的更改。
  2. 创建了第二个暂存,包含对 README.md 的更改和一个新的未跟踪文件。
  3. 创建了第三个暂存,包含对 README.md 的另一个更改。
  4. 使用 -m 标志添加描述性消息。
  5. 在第二个暂存中使用 -u 标志以包含未跟踪的文件。

现在,让我们列出我们的暂存:

git stash list

你应该会看到类似以下的输出:

stash@{0}: On master: Third change
stash@{1}: On master: Second change
stash@{2}: On master: First change

你可以检查暂存的内容而不应用它:

git stash show stash@{1}

要查看更多详细信息,可以添加 -p 标志以查看完整的差异:

git stash show -p stash@{1}

让我们再创建两个暂存,以练习管理更多的更改:

## 第四个暂存
echo "Change 4" >> README.md
git stash push -m "Fourth change"

## 第五个暂存
echo "Change 5" >> README.md
git stash push -m "Fifth change"

再次检查你的暂存列表:

git stash list

你现在应该会在列表中看到五个暂存:

stash@{0}: On master: Fifth change
stash@{1}: On master: Fourth change
stash@{2}: On master: Third change
stash@{3}: On master: Second change
stash@{4}: On master: First change

当你同时处理多个任务时,管理多个暂存会非常有用。然而,尽量不要积累太多暂存,因为这可能会变得混乱。对于长期工作,考虑使用分支。

请记住:暂存是用于临时存储的。如果你发现自己长时间保留暂存,考虑使用功能分支或提交你的更改。

清理暂存

在你的工作流中使用暂存时,你可能会积累一些不再需要的暂存。定期清理暂存是一个好习惯,以保持工作区的整洁。

要删除单个暂存,你可以使用我们之前见过的 drop 命令:

git stash drop stash@{2}

这会删除我们列表中最旧的暂存。

如果你想一次性删除所有暂存,可以使用:

git stash clear

使用此命令时要非常小心!它会删除你所有的暂存,并且无法撤销。

另一个有用的命令是 git stash pop,我们之前也见过。它会应用最近的暂存,然后将其从暂存列表中移除:

git stash pop

请记住,保持暂存列表简短通常是一个好习惯。暂存是用于临时存储未完成的工作的。如果你发现自己积累了许多暂存,这可能是一个信号,表明你应该更频繁地提交更改,或者为长期工作创建功能分支。

总结

恭喜你,Git 暂存大师!你刚刚为你的 Git 工具包添加了一个强大的新工具。让我们回顾一下我们涵盖的关键概念:

  1. 暂存更改:你学会了如何使用 git stash 临时存储未完成的工作。
  2. 应用暂存的更改:你发现了如何使用 git stash applygit stash pop 恢复暂存的更改。
  3. 从暂存创建分支:你了解了如何使用 git stash branch 将一组暂存的更改转换为新分支。
  4. 管理多个暂存:你学会了如何根据需要处理多个暂存,应用和显示特定的暂存。
  5. 清理暂存:你通过学会如何删除单个暂存和清除所有暂存,实践了良好的暂存管理习惯。

Git 暂存是一个非常实用的功能,它允许你在不提交未完成工作的情况下快速切换上下文。它非常适合那些需要快速切换任务或分支的时刻。

请记住,虽然暂存很有用,但它们只是临时的。对于长期工作,通常最好提交你的更改或创建一个新分支。明智地使用暂存,它们将帮助你保持工作流程的顺畅和灵活。

您可能感兴趣的其他 Git 教程