我对git checkout的行为感到困惑.git checkout的文档说:
- 合并
切换分支时,如果对当前分支和要切换到的分支之间的一个或多个文件进行本地修改,则该命令拒绝切换分支以保留上下文中的修改.但是,使用此选项,当前分支,工作树内容和新分支之间的三向合并已完成,您将进入新分支.
但是,我做了一个小测试,表现不像粗体部分那样.那是:
如果我有一些本地更改并想切换到分支机构,它不应该失败吗?
下面是重现此行为的命令列表:
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)
关键是" 当前分支与您要切换的分支之间的区别 "
如果您更改分支中的文件,提交它,签出另一个分支,开始修改其中的相同文件,并再次检出第一个分支,而不提交文件,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)
在这里你必须有一个错误.