关于git checkout的困惑

Sab*_*bya 3 git git-checkout

我对git checkout的行为感到困惑.git checkout文档说:

- 合并

切换分支时,如果对当前分支和要切换到的分支之间的一个或多个文件进行本地修改,则该命令拒绝切换分支以保留上下文中的修改.但是,使用此选项,当前分支,工作树内容和新分支之间的三向合并已完成,您将进入新分支.

但是,我做了一个小测试,表现不像粗体部分那样.那是:

  1. 我创建了一个git repo
  2. 用一些conent创建一个目录和一个文件,并在master分支中提交它.
  3. 创建另一个分支"testbranch"
  4. 更改master中文件的内容.但没有承诺.
  5. 切换到"testbranch".
  6. 现在,来自master分支的更改和未提交的更改将转到testbranch!

如果我有一些本地更改并想切换到分支机构,它不应该失败吗?

下面是重现此行为的命令列表:

sabya@SABYA-PC e:/test/merge_test
$ git init
Initialized empty Git repository in E:/test/merge_test/.git/

sabya@SABYA-PC e:/test/merge_test (master)
$ mkdir src

sabya@SABYA-PC e:/test/merge_test (master)
$ echo "Hello World" > src/a.txt

sabya@SABYA-PC e:/test/merge_test (master)
$ cat src/a.txt
Hello World

sabya@SABYA-PC e:/test/merge_test (master)
$ git add src

sabya@SABYA-PC e:/test/merge_test (master)
$ git commit -m "say hello"
[master (root-commit) 939f6e0] say hello
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 src/a.txt

sabya@SABYA-PC e:/test/merge_test (master)
$ git branch testbranch

sabya@SABYA-PC e:/test/merge_test (master)
$ echo "Changed content" > src/a.txt

sabya@SABYA-PC e:/test/merge_test (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:   src/a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

sabya@SABYA-PC e:/test/merge_test (master)
$ git checkout testbranch
M       src/a.txt
Switched to branch 'testbranch'

sabya@SABYA-PC e:/test/merge_test (testbranch)
$ cat src/a.txt
Changed content
Run Code Online (Sandbox Code Playgroud)

有谁能解释一下?

下面是我的git版本输出:

sabya@SABYA-PC e:/test/merge_test (testbranch)
$ git --version
git version 1.7.0.2.msysgit.0
Run Code Online (Sandbox Code Playgroud)

dme*_*sky 5

关键是" 当前分支与您要切换的分支之间的区别 "

如果您更改分支中的文件,提交它,签出另一个分支,开始修改其中的相同文件,并再次检出第一个分支,而不提交文件,checkout将失败.

git init
vim file
# hack hack hack
git add .
git commit -m "1"
git checkout -b branch
vim file
# hack hack hack
git commit -a -m "2"
git checkout master
vim file
# hack hack hack
git checkout branch
Run Code Online (Sandbox Code Playgroud)

在这里你必须有一个错误.