Git checkout 不恢复文件

Cyr*_*rge 7 git git-checkout

在 mac (sierra) 上使用 git;git 版本 2.8.4 (Apple Git-73)

git checkout <master>
Run Code Online (Sandbox Code Playgroud)

命令不会恢复在另一个分支上所做的文件更改。

这就是我所做的。

cd project_folder
git clone -o origin -b master git@gitlab.corp.xyz.com:prj/PRODUCTION.git
git branch -b new_branch
git checkout new_branch
<make changes to an existing file>
git checkout master
Run Code Online (Sandbox Code Playgroud)

我期待看到一个干净的 master 版本,而没有在 new_branch 中所做的更改。但是当我在分支之间切换时,我所做的更改会继续进行。

以前(很久以前)这曾经像我预期的那样工作。我错过了什么吗?

我进行了大量的 google 和 stackoverflow 搜索。没有产生我正在寻找的结果。我得到的最接近的结果是,但它们对我没有多大帮助。1. https://superuser.com/questions/892847/git-branch-branches-not-different 2. Git 分支切换不改变代码文件夹文件

Tim*_*sen 3

这是预期的行为,也是我在使用 Git 时通常看到的情况。来自git checkout 的文档

要准备在 <branch> 上工作,请通过更新工作树中的索引和文件并将 HEAD 指向分支来切换到它。对工作树中文件的本地修改被保留,以便它们可以提交到<branch>。

如果您需要切换分支并且您的工作目录不干净,这里有几个选项:

1)您可以在当前分支上进行临时提交:

git commit -m 'WIP'
Run Code Online (Sandbox Code Playgroud)

我说的是“临时”,但实际上这就像任何其他提交一样。唯一的区别是,当您返回此分支时,一旦完成任务,您将通过以下方式修改此提交:

git commit --amend -m 'Finished WIP'
Run Code Online (Sandbox Code Playgroud)

2)通过以下方式隐藏您的更改

git stash
Run Code Online (Sandbox Code Playgroud)

存储将创建两项提交,一项用于工作目录,一项用于阶段。当您想要恢复这些更改时,您可以通过以下方式应用这些更改:

git stash apply
Run Code Online (Sandbox Code Playgroud)