我对git checkout的行为感到困惑。 documentation of git checkout说:
- 合并
切换分支时,如果您对一个或多个进行了本地修改 更多不同的文件 当前分支和分支 你要切换的命令 拒绝切换分支以便 保留你的修改 上下文。但是,使用此选项,a 目前的三方合并 分支,你的工作树内容, 新的分支完成了,你 将在新的分支上。
但是,我做了一个小测试,其行为不像粗体部分那样。那就是:
如果我有一些本地更改并希望切换到分支,它不应该失败吗?
以下是重现此行为的命令列表:
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
任何人都能解释一下吗?
以下是我的git版本输出:
sabya@SABYA-PC e:/test/merge_test (testbranch)
$ git --version
git version 1.7.0.2.msysgit.0
答案 0 :(得分: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
在这里你必须有一个错误。
答案 1 :(得分:3)
您尚未将更改的文件提交给master,因此当您签出新分支时,它会随之移动到新分支。关键在于这一行
sabya@SABYA-PC e:/test/merge_test (master)
$ git checkout testbranch
M src/a.txt
Switched to branch 'testbranch'
注意它是怎么说M src/a.txt
的? M
代表修改后的文件。
在签出另一个分支之前,将更改提交给master。