如何“更新” Git 存储库的 Stash?

37

在我的当前分支上,我有几个存储:

  • stash@{0}
  • stash@{1}
  • stash@{2}

如果我应用stash@{0}:

$ git stash apply stash{0}
  • 修改这个stash

  • 我想保存更改到当前stash stash@{0}

  • 我不想创建第四个stash,我只想更新第一个stash。

    有人可以告诉我如何做吗?我在看man页面...也许我忽略了什么。


    3
    问题很明确,但使用场景是什么?为什么不使用分支来解决这个问题? - Andrejs Cainikovs
    你想修改哪个暂存区索引? - Bucket
    1
    储藏不是提交。如果您需要这种灵活性,最好使用补丁队列系统。(我不确定Git的首选是哪个,Quilt还是StGIT。)或者只是私有分支,您可以进行变基。 - millimoose
    您是在询问如何仅修改最顶端的stash,还是需要修改特定索引处的stash并保存回该索引?后者将会非常有趣。 - Ashish Gaur
    @millimoose:储藏(stash)确实有哈希值,因此从某种意义上讲,它们就像提交(commit),如果您考虑它们在树中是如何生成的话,只是与常规提交略有不同的处理方式。 - Lie Ryan
    Stashes are commits, under the covers. 具体来说,它们是工作目录状态的两个或三个父提交。stash^ 是创建存储时的 HEAD 提交,stash^2 是创建存储时的索引状态,而 stash^3(如果存在)则包含未跟踪/忽略的文件。stash 本身代表了工作树状态。 - torek
    2个回答

    27

    您可以储存您的工作区,然后删除您不需要的旧工作区。

    git stash apply
    # Make changes
    git stash
    git stash drop stash@{1}
    

    或者,您可以使用pop而不是apply,这将同时删除stash:

    git stash pop 
    # make changes
    git stash
    

    如果你在意识到要将修改内容合并到储藏栈顶部之前已经进行了需要做的更改,那么另一个选择是:

    # make changes
    git add <all files>
    git stash pop # or apply
    git rm --cached <files that you want to merge>
    git stash --keep-index
    

    1

    我也需要做这件事。

    我主要使用 git stash 的方式

    我保留了一组我经常想要应用(而不是弹出)的存储。例如,我有一个存储,应用它会应用与存储库中所检入的不同的某种配置。在获取最新版本后,我只需在检查存储列表后运行类似于 git stash apply 0 的命令。

    我刚遇到的问题

    应用存储时,您可能会遇到合并冲突。当出现这种情况时,您被迫解决合并冲突。这显然不是每次应用存储时都想要做的事情。

    解决方案

    除非您要应用的项位于堆栈顶部,否则这显然不会使索引保持不变,但对我来说可以。我只关心我在存储中是否有该项,而不关心它相对于其他存储项的位置。

    # Find the item in the stash I'm trying to apply, based on the description.
    git stash list
    
    # Apply the stashed item, based on its index.
    git stash apply 0
    
    # Merge conflicts found... correct them.
    git mergetool
    
    # Drop the stash by whatever index was found.
    # This is necessary since doing a git stash pop doesn't remove a stash that has merge-conflicts.
    # In that scenario, it says "The stash entry is kept in case you need it again."
    git stash drop 0
    
    # Resave the stash with the merge-conflicts taken care of.
    git stash save "Some message for identifying the stash in the list"
    
    

    值得一提的是,如果你启用了rerere(git的重复使用记录决议的功能),那么git将会记住你如何解决冲突,并在下次自动解决相同的冲突。这可能会为你节省一些存储更新的操作。更多信息请参考这个答案:https://stackoverflow.com/a/49501436/155351。更新:我不确定这是否会保存stash应用冲突的解决方案,即你在没有提交的情况下使用`git add`。可能需要进行一次提交来触发记忆功能。 - undefined

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