【问题标题】:What is the difference between git-stash and git-checkout?git-stash 和 git-checkout 有什么区别?
【发布时间】:2014-09-23 11:24:34
【问题描述】:

我尝试从一个本地分支转到另一个分支。 Git 告诉我我不能这样做,因为我的local changes to the following files would be overwritten by checkout

然后我得到一个“推荐”Please, commit your changes or stash them before you can switch branches

我知道我不需要对上述文件进行更改。可以覆盖它们。所以,我尝试stash。我执行git stash file_name。结果我得到:

Usage: git stash list [<options>]
   or: git stash show [<stash>]
   or: git stash drop [-q|--quiet] [<stash>]
   or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
   or: git stash branch <branchname> [<stash>]
   or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
               [-u|--include-untracked] [-a|--all] [<message>]]
   or: git stash clear

好的。这没用。然后我尝试git checkout file_name。没有来自 git 的抱怨。然后我可以从一个分支切换到另一个分支。所以,我似乎得到了我需要的东西(转到第二个分支而不保存对第一个分支的更改)。

但是,我想问一下为什么stash 不起作用,如果起作用了,最终结果会有什么不同?

【问题讨论】:

  • stash 没用,因为你用错了。见git help stash。您要求的不同之处在于,如果您隐藏了更改,那么它们将被隐藏,但现在您丢失了这些更改。
  • “隐藏”更改是什么意思?如果更改被“隐藏”,那么它们是一种记忆?那么“stash”和“add”有什么区别。如果我将这些更改“添加”到暂存区,我确实会记住更改(在分支中)。
  • git help stash会详细解释。
  • @Roman Stashing 意味着将更改置于 Git 历史“之外”。再次查看git help stashthis

标签: git git-checkout git-stash


【解决方案1】:

您不能显式地存储单个文件。如果您运行git-stash,它将隐藏您的所有修改。

git checkout -- file 放弃您对工作目录中该文件的更改,并检查当前提交记录的该文件的版本(即 HEAD 指向的那个)。

【讨论】:

  • 为什么 git 提供了存储所有内容而不是单个文件的可能性?不会 stash “放弃我对工作目录中文件的更改并签出该文件的最新提交版本”?
  • @roman,你可以存储任何你想要的部分。类似于git add -p,它可以让你添加或拒绝每个块,你可以做git stash -p。见here
  • latest 在这里不太合适;它为误解留下了空间。相反,您应该正确:当前提交记录的版本(即HEAD 指向的版本)。
  • 您现在可以存储单个文件,从 Git 2.13 开始:stackoverflow.com/a/5506483/1743874
【解决方案2】:

git stash 将您的更改保存到“stash”中 - 这看起来像临时提交堆栈。可以通过git stash list查看。
使用git stash 可以存储某些文件甚至代码块。试试git stash save -p。它会以交互方式询问您要保存的内容。
另一种方法是使用git add 添加除一个文件以外的所有文件以进行索引。然后运行git stash save -k。它隐藏更改的文件(git status 中的红色)而没有准备提交的文件(git status 中的绿色)。

【讨论】:

    【解决方案3】:

    当需要更改分支时,如果没有提交更改,您可以使用git stash 命令将更改保存到未完成的更改堆栈中。 如果您只需要存储已完成作品的选定部分,您可以使用git stash -p。要重复使用保存的更改,请使用git stash pop 命令。

    git checkout 命令中,如果您以git checkout 给出命令,您的工作树将指向当前HEADgit checkout branchname 当您从分支签出时,如果有未提交的更改,这些更改将作为修改后的更改添加到新的签出分支。 git checkout filepath 当您使用带有文件路径的结帐时,未提交的文件更改将丢失。

    参考 - https://git-scm.com/docs/git-checkout

    https://git-scm.com/book/en/v1/Git-Tools-Stashing

    【讨论】:

    • git checkout filepathgit checkout -- filepath 将对未暂存的更改生效。如果更改已经暂存,则结帐应该不再有效(在这种情况下,我们不应丢失已暂存但尚未提交的更改)。如果我们想取消暂存,我们需要联系git reset HEAD filepath
    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 2018-11-23
    • 2011-04-08
    • 2011-12-20
    • 2020-03-05
    • 2022-11-10
    • 2011-11-10
    相关资源
    最近更新 更多