【问题标题】:Git stash single untracked file?Git存储单个未跟踪的文件?
【发布时间】:2016-12-12 07:49:12
【问题描述】:

问题:

我有几个编辑过的文件如下所列,还有一些新创建的文件

现在我想存储未跟踪的文件(在本例中为db/migrate/20161212071336_add_paranoid_fields.rb,但不存储更改的文件)。

我该怎么做?

为什么我要存储一个未跟踪的文件

我一开始创建了这个文件,然后我意识到我不需要立即使用它(需要删除它才能让我的程序正常工作);但我将来可能需要它。

我搜索的内容(但没有给我答案),以及他们没有帮助的原因

【问题讨论】:

  • 为什么下面的答案与您的问题不符?
  • 隐藏未跟踪文件的原因是什么,因为它不计入任何提交
  • @MarounMaroun: stash -p 只会存储跟踪的文件,但我想存储未跟踪的文件
  • @w.Bala:在我的用例中,我认为我现在不需要该文件,但以后可能需要它。

标签: git git-stash


【解决方案1】:

在 git 版本 2.21.0 (Windows MingW64) 中

你可以这样做:

git stash push --include-untracked -- db/migrate/20161212071336_add_paranoid_fields.rb

只有指定的文件包含在存储中。您可以提供多个文件(未跟踪和已跟踪),您指定的文件将被存储并正常签出,其他文件保持原样。

【讨论】:

    【解决方案2】:

    如果您只有一个未跟踪的文件,您可以这样做:

    git add -u
    git stash --include-untracked --keep-index
    

    这只会将未跟踪的文件添加到存储中,并将它们从工作目录中删除。

    如果您有多个未跟踪的文件,并且只想将这个包含到存储中,那么您将必须执行提交,然后存储单个文件,然后重置

    git add -u
    git commit -m "temp commit"
    git add my_file_to_stash
    git stash
    git reset --hard HEAD^
    

    这里的微妙之处在于,当您稍后恢复存储时,该文件将被添加到索引中。这可能是件好事,因为它会提醒您这个文件很重要。

    【讨论】:

    • 谢谢,正是我想要的 :) 我之前没想过 commit first 方法 :)
    • @songyy:对git 始终是一个好方法:一旦提交了某些内容,它就不会丢失,所以在进行疯狂的实验之前,如有疑问,请提交。您以后可以随时重置。
    • 您也可以使用简写形式git stash -u 表示--include-untracked
    【解决方案3】:

    stash 不提供此功能。由于您想要实现的是将此文件保留为附加开发的一部分,因此最好将其保存在分支中。

    步骤:

    1. 存储修改过的文件(您要保留的文件将保持不变,因为它没有被跟踪。
    2. 创建一个新分支并在那里记录文件
    3. 回到原来的分支

    命令:

    git stash
    git checkout -b paranoid_fields
    git add db/migrate/20161212071336_add_paranoid_fields.rb
    git commit
    git checkout master
    git stash pop
    

    当您要恢复文件时:

    git merge paranoid_fields
    

    会归还的。

    如果你只想看看文件:

    git show paranoid_fields:db/migrate/20161212071336_add_paranoid_fields.rb
    

    【讨论】:

    • 感谢您的帖子...这并不能解决我的问题,但它确实提供了另一种开发方式。我会投赞成票:) 我认为@rodrigo 的回答完美地解决了最初的问题.. 你可能想看看:)
    • 感谢您的支持。回复的竞争条件:-)
    【解决方案4】:

    根据其他答案中提供的信息,我创建了一个脚本git-stash-selection,我使用它别名为gsts

    #!/bin/sh
    #
    # Git stash only a selection of files, with a message.
    #
    # Usage:
    #   git-stash-selection [<message>] [<paths>...]
    
    message=$1
    shift
    stash_paths="$*"
    git add --all
    git reset $stash_paths
    git commit --allow-empty -m "temp - excluded from stash"
    git add --all
    git stash save $message
    git reset --soft HEAD^
    git reset
    

    我已经提供了 full details in another answer 所使用的方法以及为什么一些更简单的命令不起作用。

    编辑:这可能可以使用this patch method 而不是提交来改进。或者也许使用另一个存储区

    【讨论】:

      【解决方案5】:

      类似于@rodrigo 的回答,但没有提交和重置。

      您可以git stash 将所有当前修改、跟踪的文件存储在位置stash@{0}

      然后,您可以在要存储的未跟踪文件上git add &lt;filename&gt;,然后再次git stash

      运行git stash list 将显示现在未跟踪的文件存储在stash@{0} 中,而您修改后的跟踪文件存储在stash@{1} 中。

      现在您可以简单地git stash pop stash@{1} 将您修改后的跟踪文件从存储中删除并将它们放回您的工作目录中,这样您的未跟踪文件就会存储在stash@{0} 中。

      您可以使用git stash show -p stash@{0} 查看您的文件,并使用git stash apply stash@{0}git stash pop stash@{0} 恢复它。正如@rodrigo 指出的那样,未跟踪的文件将再次恢复到暂存区域。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-21
        • 2019-07-01
        • 1970-01-01
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        • 2012-01-18
        相关资源
        最近更新 更多