3

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

- 合并

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

但是,我做了一个小测试,它的行为不像粗体部分所说的那样。那是:

  1. 我创建了一个 git repo
  2. 创建一个目录和一个包含一些内容的文件并将其提交到 master 分支。
  3. 创建另一个分支“testbranch”
  4. 更改主文件的内容。但没有承诺。
  5. 切换到“测试分支”。
  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

谁能解释一下?

下面是我的 git 版本输出:

sabya@SABYA-PC e:/test/merge_test (testbranch)
$ git --version
git version 1.7.0.2.msysgit.0
  
4

2 回答 2

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

在这里你一定有一个错误。

于 2010-07-02T05:26:09.040 回答
3

您尚未将更改的文件提交给 master,因此当您签出新分支时,它会随之移动到新分支。关键在这一行

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

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

在签出另一个分支之前将更改提交给 master。

于 2010-07-02T05:15:11.450 回答