如何备份Git Stash内容?

35
  • 我有未提交的工作
  • 我需要切换到另一个分支进行紧急工作
  • 由于我当前的进行中的工作尚未完成,我不想提交它。我使用git stash将其放在一边。

此外,我希望将该存储的内容备份到共享驱动器上,只是为了安全起见。有什么优雅的解决方案可以将存储的内容归档到文件上?

6个回答

50

通过运行show命令,您可以获得差异:

git stash show -p > stash.diff

这是差异文件,您可以将其用作备份。

稍后您可以将差异应用于现有仓库:

git apply stash.diff
# and potentially stash again:
git stash

1
@Zbynek git stash show 只是简单地显示 "MyProject/MyFile.scala | 34 +++++",表示有一个文件改动,增加了34行。如果我备份这个“状态报告”(根据您的指示,它被保存在stash.diff中),然后假设我的硬盘在备份之后出现问题,那么stash.diff如何知道我在MyFile.scala文件中实际写入的这34行内容? - Polymerase
1
@Polymerase:抱歉,我错过了“-p”(这是“diff”的默认设置,但不适用于“stash”)。回答已更新。 - Zbynek Vyskovsky - kvr000
1
@ZbynekVyskovsky-kvr000 哇,那个 -p 选项真的很酷。你完美地回答了我最初的问题。 - Polymerase
不错!在我的情况下,我在PowerShell中遇到了“无法识别的输入”,使用Git Bash也无法解决。因此,我将stash.diff中的内容复制到新创建的stashN.diff中,并使用它来代替。 - boludo kid

9

我不想提交它

实际上,git stash 操作是通过进行两个(有时是三个)提交来完成的,因此如果您储存了工作内容,则可能会在不知情的情况下进行提交。但是,大多数时候暂时提交并没有什么问题。只需添加当前的工作内容,然后通过以下方式进行临时提交:

git commit -m 'WIP'

然后,您可以将您的分支推送到代码库,这将作为备份。当您回来完成工作时,可以通过以下方式修改该临时提交:

git commit --amend

请随意将此消息更改为更有意义的内容,但无论如何,WIP消息都可以作为提醒。

如果您正在使用的分支可能会被其他人共享,则可以将带有临时提交的分支推送到不同的位置作为备份,例如:

git push origin local_branch:some_other_location

+1 对于 git commit --amend,@Tim,有没有一种临时的方法可以通过电子邮件之类的方式在另一台机器上共享并提交? - Vinay Veluri
@VinayVeluri 看看其他回答,它似乎解决了这个问题。无论如何,您始终可以共享分支,因此临时提交可以像任何其他提交一样共享。 - Tim Biegeleisen
陷阱,这是我们通常做的事情,检查是否有其他方法。 - Vinay Veluri
1
@TimBiegeleisen 您的回答非常好,谢谢。希望你不介意我将Zbynek的回答设为官方答案,因为他的回答正是OP所要求的内容。 - Polymerase

4

扩展Zybnek的答案。

如果您想备份所有存储区内容,而不需要进行提交或创建临时分支:

  1. 计算存储区数目 git stash list | wc -l

  2. 执行for i in {0..n}; do $(git stash show -p stash@{$i} > stash_$i.diff); done


4

正如Tim Biegeleisen所说,git stash实际上创建了一个提交 - 它只是不移动任何分支。

您可以通过stash@{0}访问您最后的存储内容(通过stash@{1}访问倒数第二个等等...使用git stash list查看您可以访问的完整列表)。

我认为使存储更持久的最简单方法是:创建一个新分支:

$ git branch wip/adding/new/feature stash@{0}

现在,使用指向它的分支,这个存储的内容将不会过期,并且当您克隆或从该仓库提取时将被传输等等...
备份仓库最简单的方法是克隆它:
$ cd path/to/external/drive
$ git clone my/repo

# you can then update your backup by running :
$ git fetch         # from the clone

这将保存您原始存储库中定义的所有分支和标签。

谢谢,但这样做有点过度了,只是为了短时间保存临时工作。暂存内容可能只有1K。备份整个仓库可能会大100万倍。抱歉我这么菜鸟,但我认为只是提交我的临时工作并稍后撤销它仍然更简单。 - Polymerase

2

我通过以下方式成功备份了一个存储(Git Extensions使用的文件和路径):

  • 复制位于git\refs下的“stash”文件
  • 复制位于git\logs\refs下的“stash”文件
  • 复制git\objects中的所有文件夹(除了“info”和“pack”文件夹)

要恢复文件,请将您之前备份的文件复制回上述文件夹中。之后,您可以通过Git Extensions使用该存储。


你能提供一下从备份中恢复的详细步骤吗? - tjheslin1
嗨,@tjheslin1。要备份文件,请按照上述步骤操作;要恢复文件,请反向操作:获取已备份的文件/文件夹,并将它们再次复制到上述git文件夹中的路径中...如果不确定这是否是您所指的内容,请提供更多信息或您想要执行的示例,我会尽力做出相应的回答...最好的祝愿。 - Marcio
在我的情况下,用这种方法只传输了最后的5个存储。要复制所有的存储,我不得不复制整个.git文件夹。 - Melody Nelson

0
另一种解决方案是将存储库克隆到磁盘上的另一个位置,例如/tmp
这样,您可以勾选上面所有框,并且不必隐藏任何内容。

两全其美。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接