暂时保存更改

一个被提交了的改动会被永久地保存在仓库(repository)中。然而,在你日常工作中你经常需要“暂时地”保存一下你的一些本地改动。例如,如果你正在开发一个新的功能,但是与此同时又得到了一个错误报告,并且需要马上修复它,而你现在的本地改动又和这个错误毫无关系,因此你必须暂时地停止新功能的开发,来开始着手修复这个错误。并且你还想要保存那些已完成的开发工作,以便之后能继续来完成它。

像这样的情况会随时发生,比如你必须要开始一个新的工作,而在你的当前工作版本中还有一些并不想立即提交的本地改动。在处理好这些本地改动的同时,我们还需要把当前的工作副本(working copy)清理出来,Git 提供的 “储藏(Stash)” 功能可以非常好地解决这个问题。

概念

储藏(Stash)

可以把储藏想象成一种剪贴板,它会获取你工作副本(working copy)中的所有改动,并且保存到一个新的剪贴板上。然后你就会得到一个“干净”的工作副本,也就是说一个不存在任何改动的工作目录。

之后你随时都可以重新调回那些保存在剪贴板中的改动到你的工作副本中来,从而继续你之前没有完成的工作。

你可以建立多个储藏单元,不仅仅局限于存储一组变化。同样,储藏也会不绑定在你所处的当前分支或是任何其它分支上,如果你想要调回任意一个储藏单元,它的改动将会被应用在你当前的 HEAD 分支上。

来让我们先把本地的改动储藏起来,这样在开始这个新功能开发前我们就可以得到了一个干净的工作副本:

$ git stash
Saved working directory and index state WIP on master: 
   2dfe283 Implement the new login box
HEAD is now at 2dfe283 Implement the new login box
$ git status
# On branch master
nothing to commit (working directory clean)

现在,这个本地文件 “imprint.html” 的改动已经被安全地保存在一个剪贴板上了。当我们希望继续对它们进行工作时,我们都可以随时轻松地调回它。

你可以很容易地得到你当前的储物箱的状态:

$ git stash list
stash@{0}: WIP on master: 2d6e283 Implement the new login box

最新建立的储藏单元会被显示在列表的最上面,被命名为 named “stash@{0}” 。早前建立的储藏单元会拥有一个更高的数字。

当你想要调回一个之前建立的储藏单元,有两种方法:

  • (a) 使用 “git stash pop” 命令,它将调回最新的一个储藏单元,并且把它从剪贴板中删除掉。
  • (b) 使用 “git stash apply <stashname>” 命令,它将调回那个你所给出的储藏单元,而这个储藏单元还会保留在剪贴板中。你可以随时使用 “git stash drop <stashname>” 来删除它。

当你使用这些命令时,你不必给出特定的储藏单元名称。 Git 将会自动地处理最新的那个储藏单元(永远是 “stash@{0}”)。

概念

储藏的时机

储藏功能可以帮助我们得到一个干净的工作副本。当然,它还可以应用在很多不同的流程中,强烈推荐你在下列情况中储藏你的本地改动:

  • ……在切换到不同分支之前。
  • ……在获取(pulling)远程改动之前。
  • ……在合并(merging)或者衍合(rebasing)一个分支之前。

终于,是时候开始着手开始开发我们的新功能了!

Get our popular Git Cheat Sheet for free!

About Us

As the makers of Tower, the best Git client for Mac and Windows, we help over 100,000 users in companies like Apple, Google, Amazon, Twitter, and Ebay get the most out of Git.

Just like with Tower, our mission with this platform is to help people become better professionals.

That's why we provide our guides, videos, and cheat sheets (about version control with Git and lots of other topics) for free.