2010-07-02 100 views
3

我对git签出的行为感到困惑。该documentation of git checkout说:关于混帐签出的混淆

--merge

当切换分支,如果你有本地修改,以一个或 多个文件,这些文件 当前分支和分支之间的不同,以 您正在切换,命令 拒绝切换分支以便 在 上下文中保留您的修改。但是,使用此选项,将在当前的 分支,您的工作树内容, 和新分支之间执行 三路合并,并且您将在新分支上创建 。

但是,我做了一个小的测试,其行为不像大胆的部分。那就是:

  1. 我创建了一个混帐回购协议
  2. 创建一个目录,并与一些conent一个文件,并在主分支提交。
  3. 创建另一个分支“testbranch”
  4. 更改master中文件的内容。但没有提交。
  5. 切换到“testbranch”。
  6. 现在,来自master分支的更改和未提交的更改来到testbranch!

是不是应该失败,如果我有一些本地更改,并希望切换到分支?

下面的命令列表重现此问题:

[email protected] e:/test/merge_test 
$ git init 
Initialized empty Git repository in E:/test/merge_test/.git/ 

[email protected] e:/test/merge_test (master) 
$ mkdir src 

[email protected] e:/test/merge_test (master) 
$ echo "Hello World" > src/a.txt 

[email protected] e:/test/merge_test (master) 
$ cat src/a.txt 
Hello World 

[email protected] e:/test/merge_test (master) 
$ git add src 

[email protected] 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 

[email protected] e:/test/merge_test (master) 
$ git branch testbranch 

[email protected] e:/test/merge_test (master) 
$ echo "Changed content" > src/a.txt 

[email protected] 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") 

[email protected] e:/test/merge_test (master) 
$ git checkout testbranch 
M  src/a.txt 
Switched to branch 'testbranch' 

[email protected] e:/test/merge_test (testbranch) 
$ cat src/a.txt 
Changed content 

任何人都可以解释一下吗?

下面是我的Git版本输出:

[email protected] e:/test/merge_test (testbranch) 
$ git --version 
git version 1.7.0.2.msysgit.0 

回答

5

关键是如果你改变了文件中的分支,提交,结帐的另一个分支,开始修改同一个文件“当前分支与分支之间的差异,你要切换

在那里,再次签出第一个分支,而不提交文件,结账将失败。

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 

在这里,你必须有一个错误。

3

您还没有COMMITED更改的文件掌握,所以当你签出新的分支得到它与它一起被移动到新的分支。关键是在这一行

[email protected] e:/test/merge_test (master) 
$ git checkout testbranch 
M  src/a.txt 
Switched to branch 'testbranch' 

注意它是怎么说M src/a.txtM代表修改后的文件。

在检出另一个分支之前将更改提交给主设备。

+0

准确地说,这就是为什么我认为'git checkout testbranch'会失败,错误类似于:无法切换到testbranch。检测到将被覆盖的本地更改。 即使文档也这么说。 – Sabya 2010-07-02 05:22:31

+2

@Sabya:只有在您所在分支和您切换到的分支之间的文件中检测到本地更改时,它才会失败。在你的情况下,'src/a.txt'的提交版本在_both_'master'分支和'testbranch'分支上包含文本“Hello World”。这是相同的内容,所以git没有切换问题。 – 2010-07-02 06:09:25

+0

@Sabya:如果更改是“分阶段”,也就是说你说的是“git add。”或类似的东西,它也不会让你改变分支。 – 2010-07-02 16:33:27