【问题标题】:"git stash create x" - Where is it?“git stash create x”——它在哪里?
【发布时间】:2011-09-29 03:56:03
【问题描述】:

如果我使用git stash create whatever 创建提交,我会返回提交的哈希值,但我找不到使用git reflog 的提交哈希值。

git log stash 也不起作用,git stash list 也不起作用。

如何列出我使用 git stash create 创建的提交?

【问题讨论】:

    标签: git


    【解决方案1】:

    虽然https://stackoverflow.com/a/6589093/39155 中的答案在技术上有效,但从 Git 2.9.0 开始,该解决方案已经过时,并且有一种内置方式来存储 danglish stash refs (git stash store)。

    git stash create 创建一个悬空提交,并且不会将 ref 存储在任何地方。如果你想保存它,你需要用git stash store 跟进它。来自git-stash 联机帮助页:

    创建一个 stash(这是一个常规的提交对象)并返回其对象名称,而不是将其存储在 ref 命名空间中的任何位置

    为了将其存储在 ref 命名空间中并将其与缓存 ref 关联,您需要运行 git stash store <commit>。例如

    $ git stash create
    09eb9a97ad632d0825be1ece361936d1d0bdb5c7
    $ git stash store 09eb9a97ad632d0825be1ece361936d1d0bdb5c7
    $ git stash list
    stash@{0}: Created via "git stash store".
    

    如果您想将名称与存储引用关联,只需将 -m / --message 传递给 git stash store

    $ git stash store -m "my stash" 09eb9a97ad632d0825be1ece361936d1d0bdb5c7
    $ git stash list
    stash@{0}: my stash
    

    【讨论】:

    • 你能解释一下“它不会在任何地方存储 ref”或“不在 ref 命名空间中的任何地方存储它”是什么意思吗?这意味着它不会被推送到远程仓库?
    • 这只是意味着当对象存在并且在本地 git 数据库中时,没有指向它的引用(例如标签、分支等)。
    • 所以,如果我只做git stash,就没有办法在不处理哈希的情况下自动将其推送到远程仓库,对吧?
    • 不同的命令,但是是的。 git stash 只会在您的本地结帐时创建一个参考。 AFAIK 没有办法在不标记或分支参考的情况下将其推送到远程。
    • 来自手册: git stash create - 创建一个存储条目(这是一个常规提交对象)并返回其对象名称,而不将其存储在 ref 命名空间中的任何位置。这旨在对脚本有用。它可能不是您要使用的命令;见“推”
    【解决方案2】:

    如果您使用the script in this answer,则可以使用git stash list

    #!/bin/sh
    #
    # git-stash-push
    # Push working tree onto the stash without modifying working tree.
    # First argument (optional) is the stash message.
    if [ -n "$1" ]; then
            git update-ref -m "$1" refs/stash "$(git stash create \"$1\")"
    else
            HASH=`git stash create`
            MESSAGE=`git --no-pager log -1 --pretty="tformat:%-s" "$HASH"`
            git update-ref -m "$MESSAGE" refs/stash "$HASH"
    fi
    

    那么你可能真的想在某个时候取回那个提交。为此,您可以使用git stash list 列出存储区,它会为您提供类似这样的信息(请记住,这些可能是愚蠢的提交消息):

    stash@{0}: WTF? Nothing is working
    stash@{1}: it's all working perfectlY!
    stash@{2}: blah2
    

    然后你可以通过运行来恢复blah2

     git stash pop stash@{2}
    

    或者正如@Eliot 指出的那样,您可以使用它来不破坏您的存储:

     git stash apply stash@{2}
    

    【讨论】:

    • 另外值得注意的是:git stash pop 从存储列表中删除存储并将更改应用到您的工作副本,而 git stash apply 将存储保留在列表中并应用更改。
    【解决方案3】:

    编辑

    谢谢你告诉我一个新功能(?)

    手册页详细说明:

    创建一个 stash(这是一个常规提交对象)并返回其对象名称,而不是将其存储在 ref 命名空间中的任何位置。

    存储在 ref 命名空间中的任何位置。你必须跟踪它。如果你丢了,

    git fsck --unreachable 
    

    或许可以提供提示。小心过期,所以不要在这个时候做git gc --prune=...

    【讨论】:

    • 我不是指save。我的意思是 create 因为我不希望 reset --hard 自动运行。
    • 好的。这对我来说是新的。我没有 git stash create。我刚刚在线阅读了手册页,在我看来,它已经说明了:Create a stash (which is a regular commit object) and return its object name, without storing it anywhere in the ref namespace.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2017-11-25
    相关资源
    最近更新 更多