关于git checkout的困惑

时间:2010-07-02 05:03:02

标签: git git-checkout

我对git checkout的行为感到困惑。 documentation of git checkout说:

  

- 合并

     

切换分支时,如果您对一个或多个进行了本地修改   更多不同的文件   当前分支和分支   你要切换的命令   拒绝切换分支以便   保留你的修改   上下文。但是,使用此选项,a   目前的三方合并   分支,你的工作树内容,   新的分支完成了,你   将在新的分支上。

但是,我做了一个小测试,其行为不像粗体部分那样。那就是:

  1. 我创建了一个git repo
  2. 使用一些conent创建一个目录和一个文件,并将其提交到master分支。
  3. 创建另一个分支“testbranch”
  4. 更改master中文件的内容。但没有承诺。
  5. 切换到“testbranch”。
  6. 现在,来自master分支的更改和未提交的更改将转到testbranch!
  7. 如果我有一些本地更改并希望切换到分支,它不应该失败吗?

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

    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
    

2 个答案:

答案 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。