我对 git 分支行为感到困惑。
我有这个 git 仓库:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
Run Code Online (Sandbox Code Playgroud)
我创建了一个本地分支,如下所示:
$ git checkout -b foo
Switched to a new branch 'foo'
$ git branch
* foo
master
$ git status
On branch foo
nothing to commit, working tree clean
Run Code Online (Sandbox Code Playgroud)
现在我更改 README.md 文件。
$ date >> README.md
$ git status
On branch foo
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)
现在我像这样跳回我的主分支:
$ git checkout master
M README.md
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Run Code Online (Sandbox Code Playgroud)
但是当我执行 git status 时,我看到 README.md 文件有来自我的 foo 分支的修改!我不应该看到 README.md 文件的未修改版本吗?我在这里做错了什么?
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
$ tail README.md
# README.md
-----------
Meanvoy is just an idea I had to replace envoy with facter and
a mean stack backend.
Fri Mar 17 13:43:04 PDT 2017
Run Code Online (Sandbox Code Playgroud)
让我们先考虑一下当您检出不同的分支并且没有修改任何文件时会发生什么。
当你这样做时,git 将首先移动HEAD到历史上的新位置,这个另一个分支,然后 git 将更新你的工作文件夹以包含根据这个另一个分支的所有文件的状态。
因此,例如,如果您签出一个功能分支,您的工作文件夹将被更新以反映该功能分支的当前状态。到目前为止听起来不错?好的。
现在,如果在检查另一个分支之前修改了一个文件,会发生什么情况?
好吧,除非明确告知,git 会尽量避免丢失您的更改。那么它应该怎么做呢?拒绝签出这个其他分支,因为你修改了一些文件但没有提交?
不,git 会尝试带来更改。
只有在安全的情况下才会这样做。如果文件在两个分支之间存在分歧,git 将拒绝并出现以下错误
$ git checkout feature/x
error: Your local changes to the following files would be overwritten by checkout:
test1.txt
Please commit your changes or stash them before you switch branches.
Aborting
Run Code Online (Sandbox Code Playgroud)
事实上,这并不意味着该文件可以“安全”带入这个新分支。还是修改了。还是不服。
您必须决定如何处理该文件。如果您希望它“保留”在前一个分支上,您可能应该在检出新分支之前提交它。