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

时间:2014-09-23 11:24:35

标签: git git-checkout git-stash

我尝试从一个本地分支转到另一个分支。 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不起作用,以及最终结果如何起作用会有所不同?

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

self-join分两步完成:

  1. 将您的工作目录和索引保存到安全的地方,并
  2. 将工作目录和索引还原到最近的提交。然后,您可以在其他分支机构上工作,进行提交等等。当您准备回到原来的位置时,键入git stash然后您又回来了,全速工作。
  3. 弹出您的存储会从存储中删除更改并将其重新应用到您的工作副本。

    或者,您可以将更改重新应用到工作副本,并使用git stash pop将其保存在存储中。

    git stash apply会丢弃您在工作目录中对该文件所做的更改,并检查当前提交记录的该文件的版本(即HEAD指向的那个)。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在需要更改分支时进行提交更改,您可以使用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