Git:更改不应该留在他们的分支中吗?

And*_*rew 2 git

我对使用 Git 比较陌生。这是我到目前为止所做的:

$ git branch
* master

$ git status
# On branch master
nothing to commit (working directory clean)

$ git branch mywork
$ git checkout mywork
$ git branch
* mywork
  master

...modify some files...

$ git status
# On branch mywork
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   file1.html
#   modified:   file2.html
#
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)

现在,如果我切换到我的另一个分支,我希望我的更改保留在这个分支中。但是,变化似乎伴随着我:

$ git checkout master
M   file1.html
M   file2.html
Switched to branch 'master'

$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   file1.html
#   modified:   file2.html
#
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?还是我误解了我对 Git 的使用?

Chr*_*ick 5

您的工作目录和您的存储库彼此分开,从某种意义上说,您的工作目录中的代码在提交之前不会与分支相关联。

为了进一步搅浑水,git 引入了一个称为索引的新概念,它是您的工作目录和存储库之间的中转站。当你运行git add一个文件时,你真正在做的是将它添加到索引中。同样,当您运行 时git commit,您最终将索引的内容添加到存储库中。

git status 区分索引和工作目录如下。

  • Changes to be committed: 表示指数的变化
  • Changed but not updated: 表示工作目录中对已添加到存储库中的文件的更改(并且随后未被忽略)
  • Untracked files:表明已到文件在工作目录的变化不是已经被添加到存储库

如果您有一些要暂时保存的更改,但不能保证它们有自己的分支,请使用git stash. 这是 git 用于创建极其轻量级的单次提交分支的机制。从手册页(重点是我的):

使用git stash时要录制的当前状态的工作目录和索引,但想回到一个干净的工作目录。该命令保存您的本地修改并恢复工作目录以匹配HEAD 提交。