git-stash 和 git-checkout 有什么区别?

7
我试图从一个本地分支切换到另一个本地分支。Git告诉我无法这样做,因为我的“以下文件的本地更改将被覆盖”。然后我收到了一个“建议”,请在切换分支之前提交您的更改或将其存储起来。我知道我不需要对提到的文件进行更改。覆盖它们是可以的。因此,我尝试使用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没有起作用,如果它起作用会产生什么不同的最终结果?


1
stash 没有起作用是因为你使用不正确。请参阅 git help stash。你所要求的区别在于,如果你已经将更改存储,那么它们将被存储,但现在你失去了这些更改。 - Biffen
“stash”在编程中是什么意思?如果将更改“stash”,那它们是一种被记忆的状态吗?那么,“stash”和“add”之间有什么区别呢?如果我将这些更改添加到暂存区,我会记住(在分支中)这些更改。 - Roman
git help stash会详细解释这个问题。 - Wooble
1
@Roman Stashing 意味着将更改放在 Git 历史记录之外。再次查看 git help stash 以及 此处 - Biffen
3个回答

10

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

git checkout -- 文件名会放弃对该文件的更改,并检出由当前提交记录的版本(即HEAD指向的版本)记录的文件版本。


为什么Git提供了存储所有更改但没有单个文件的可能性?难道stash不是“放弃我对工作目录中文件的更改并检出该文件的最新提交版本”吗? - Roman
1
@roman,你可以隐藏任何你想要的部分。类似于 git add -p 可以让你添加或拒绝每个块,你可以使用 git stash -p 命令。请参见这里 - Shahbaz
1
“latest”这个词不太准确,容易引起歧义。相反,你应该写成:“当前提交记录所记录的版本”(即HEAD指向的版本)。 - jub0bs
从Git 2.13开始,您现在可以隐藏单个文件:https://dev59.com/MG035IYBdhLWcg3wSOGr#5506483 - Piccolo

2

git stash 命令会将你的更改保存到“stash”中,看起来像是一堆临时提交。可以通过 git stash list 查看。
使用 git stash 命令可以将某个文件甚至代码块存储到stash中。尝试使用 git stash save -p 命令,它会交互式地询问您要保存什么。
另一种方法是使用 git add 命令将除一个文件之外的所有文件添加到索引中。然后运行 git stash save -k 命令。它会将已更改的文件(在 git status 中为红色)存储到stash中,而不包括已准备提交的文件(在 git status 中为绿色)。


0

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

git checkout命令中,如果您将命令指定为git checkout,则您的工作树将直接指向当前的HEADgit checkout branchname从分支检出时,如果有未提交的更改,则这些更改将作为修改后的更改添加到新检出的分支中。git checkout filepath当您在文件路径上使用checkout时,该文件的未提交更改将会丢失。

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

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


git checkout filepathgit checkout -- filepath 将会对未暂存的更改生效。如果更改已经被暂存,checkout 将不再有效(在这种情况下,我们不应该丢失已经暂存但尚未提交的更改)。如果我们想要取消暂存,我们需要使用 git reset HEAD filepath - Shan Dou

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