如何从git存储中提取单个文件(或更改文件)?

时间:2009-07-09 17:12:11

标签: git git-stash

我想知道是否可以从git存储中提取单个文件或文件差异,而不会弹出存储变更集。

任何人都可以就此提出一些建议/想法吗?

9 个答案:

答案 0 :(得分:959)

git stash联机帮助页中,您可以阅读(在“讨论”部分,在“选项”说明之后):

  

存储表示为提交,其树记录了状态    工作目录,它的第一个父项是HEAD时的提交    藏匿被创造。

因此,您可以将stash(例如stash@{0}是第一个/最顶层的存储)视为合并提交,并使用:

$ git diff stash@{0}^1 stash@{0} -- <filename>

说明:stash@{0}^1快捷方式表示给定存储的第一个父级,如上面的解释所述,提交时将更改隐藏起来。我们使用这种形式的“git diff”(有两次提交),因为stash@{0} / refs/stash是一个合并提交,我们必须告诉git我们要对哪个父进行区分。更神秘:

$ git diff stash@{0}^! -- <filename>

也应该有效(请参阅git rev-parse联机帮助页以获取rev^!语法的说明,在“指定范围”部分中)。

同样,您可以使用git checkout检查隐藏的单个文件:

$ git checkout stash@{0} -- <filename>

或将其保存在另一个文件名下:

$ git show stash@{0}:<full filename>  >  <newfile>

$ git show stash@{0}:./<relative filename> > <newfile>

note 此处&lt;完整文件名&gt;是相对于项目顶级目录的文件的完整路径名(想想:相对于stash@{0}))。


您可能需要保护stash@{0}免受外壳扩展,即使用"stash@{0}"'stash@{0}'

答案 1 :(得分:37)

如果您使用git stash apply而不是git stash pop,它会将存储应用于您的工作树,但仍保留存储。

完成此操作后,您可以add / commit找到所需的文件,然后重置剩余的更改。

答案 2 :(得分:18)

简短回答

要查看整个文件:git show stash@{0}:<filename>

要查看差异:git diff stash@{0}^1 stash@{0} -- <filename>

答案 3 :(得分:16)

有一种简单的方法可以从任何分支进行更改,包括stashes:

$ git checkout --patch stash@{0} path/to/file

如果要在许多部分进行修补,可以省略文件规范。或者省略补丁(但不是路径)以获取对单个文件的所有更改。如果您有多个,则将0替换为git stash list的藏匿号码。请注意,这与diff类似,并提供在分支之间应用所有差异。要仅从单个提交/存储中获取更改,请查看git cherry-pick --no-commit

答案 4 :(得分:12)

$ git checkout stash@{0} -- <filename>

注意:

  1. 确保在“ - ”和文件名参数之后放置空格

  2. 将零(0)替换为您的特定隐藏号码。要获取存储列表,请使用:

    git stash list
    
  3. 基于Jakub Narębski's answer - 更短的版本

答案 5 :(得分:10)

您可以使用“git show stash@{0}”获取存储的差异(或者无论存储的数量是什么;请参阅“git存储列表”)。可以很容易地为单个文件提取差异部分。

答案 6 :(得分:5)

要理解的最简单的概念,虽然可能不是最好的,但是您更改了三个文件并且想要存储一个文件。

如果你git stash要将它们全部存起来,git stash apply将它们重新带回来,然后再git checkout f.c对相关文件进行有效重置。

如果要取消暂存该文件,请执行git reset --hard然后再次运行git stash apply,利用git stash apply无法清除存储堆栈中的差异这一事实。< / p>

答案 7 :(得分:1)

如果隐藏文件需要与当前版本合并,请使用以前使用diff的方式。否则,您可以使用git pop打开它们,git add fileWantToKeep用于暂存文件,然后执行git stash save --keep-index,用于存储除舞台上的内容之外的所有内容。 请记住,这种方式与以前的方式的不同之处在于它会弹出&#34; pops&#34;来自藏匿处的文件。之前的答案保留git checkout stash@{0} -- <filename>,以便根据您的需要进行调整。

答案 8 :(得分:0)

使用以下内容将更改应用于存储在工作树中的文件。

git diff stash^! -- <filename> | git apply

这通常比使用git checkout更好,因为自创建存储以来,您不会丢失对文件所做的任何更改。