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

问题描述:

我尝试从一个本地分支转到另一个分支。 Git告诉我,我不能这样做,因为我的local changes to the following files would be overwritten by checkoutgit-stash和git-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不起作用,以及最终结果在不同情况下如何工作?

+1

'藏匿'没有工作,因为你用它错了。请参阅'git help stash'。你所要求的区别是,如果你隐藏了这些变化,那么它们就会被隐藏起来,但是现在你却失去了这些变化。 – Biffen 2014-09-23 11:29:16

+0

“隐藏”更改意味着什么?如果变化是“隐藏”,那么他们是一种记忆?那么“隐藏”和“添加”之间有什么区别。如果我将这些更改“添加”到临时区域,我会记住更改(在分支中)。 – Roman 2014-09-23 11:33:28

+0

'git help stash'会详细解释这一点。 – geoffspear 2014-09-23 11:35:02

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

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

+0

为什么git提供了隐藏所有内容但不是单个文件的可能性?不隐藏“放弃对工作目录中文件的更改并检出该文件的最新提交版本”? – Roman 2014-09-23 11:31:17

+1

@roman,你可以隐藏你想要的任何部分。类似于'git add -p',它可以让你添加或者拒绝每个块,你可以做'git stash -p'。请参阅[这里](http://*.com/a/5506483/912144) – Shahbaz 2014-09-23 11:39:55

+1

*最新*不太合适的词,在这里;它留下了误解的余地。相反,您应该正确:*当前提交记录的版本*(即“HEAD”指向的版本)。 – Jubobs 2014-10-11 10:47:50

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

git stash工程分两个步骤:

  1. 保存你的工作目录和索引到一个安全的地方,
  2. 恢复你的工作目录和索引到最近的提交。然后,您可以在其他分支上工作,进行提交等操作,当您准备好回到您所在的位置时,请键入git stash pop,然后您又回来了,全速工作。

弹出您的储藏箱会从您的储藏箱中移除更改并将其重新应用到您的工作副本。

或者,您可以将更改重新应用到您的工作副本,并将其保留在git stash apply的藏匿处。

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