Git允许我切换分支而不提交更改

时间:2013-04-19 20:47:33

标签: git

我正在学习Git,通过一个教程。我在分支seo_title,我对文件mission.html进行了未提交的更改。我确实git checkout master期望获得有关未提交提交的更改,未添加更改等的警告,但是它继续进行并使用消息切换分支:

M       mission.html
Switched to branch 'master'

然后,当我git diff mission.html时,它向我显示工作目录仍包含我在检查其他分支时所做的更改。 我错过了什么? 对于它的价值,我在Windows上使用Git Bash。

编辑:对mission.html的更改尚未添加到暂存索引中。

编辑2:我认为最高投票的回答是正确的,但经过进一步调查,它与我所看到的行为不符。以下是对我正在做的事情的更全面的描述:

top_directory(master) > git branch new_branch_1
top_directory(master) > git branch new_branch_2
top_directory(master) > git checkout new_branch_1

(打开记事本++并修改resources.html,保存)

top_directory(master) > git status
# On branch new_branch_1
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed
#   (use "git checkout -- <file>..." to discard changes in wo
#
#       modified:   resources.html
#
no changes added to commit (use "git add" and/or "git commit
top_directory(new_branch_1) > git checkout new_branch_2

这是我希望git反对并告诉我存储或提交的地方,因为new_branch_1和new_branch_2具有不同版本的resources.html,但它只是在没有警告的情况下切换到新分支,并且它带来了未提交的更改: / p>

M       resources.html
Switched to branch 'new_branch_2'
top_directory(new_branch_2) > git status
# On branch new_branch_2
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   resources.html
#
no changes added to commit (use "git add" and/or "git commit -a")

是否有一种模式或设置会使其表现为这种方式而不是警告?或者我仍然误解了这种情况?

编辑3:我现在明白了。评分最高的答案是正确的,请参阅我对该答案的最新评论。

5 个答案:

答案 0 :(得分:34)

您上次尝试使用本地更改切换分支时看到的不同行为,现在是由于文件更改不同。

所以,假设我们有一个名为'readme'的分支,你已经对文件进行了一些更改,比如说README.md。

现在,您已切换回主人。你对其他文件(不是README.md)做了一些工作。现在您有本地更改。如果您尝试切换回“自述”分支而不提交更改,它将允许您。为什么?因为切换到“自述”分支不会覆盖任何本地更改。

但是,如果您对master分支上的README.md文件进行了修改,那么当您尝试执行

git checkout readme 

你会遇到

error: Your local changes to the following files would be overwritten by checkout: README.md
Please, commit your changes or stash them before you can switch branches.

因为您对README.md进行了更改,需要合并。

答案 1 :(得分:15)

这是正常行为。如果您不想在新签出的分支上修改文件,请将其存储起来。像这样。

# on branch dev
$ git stash
$ git checkout master

# do stuff on master

# back to dev
$ git checkout dev
$ git stash pop

答案 2 :(得分:2)

Git会让你检查其他分支(或标签或SHA1哈希),只要你改变你的工作树的提交破坏你当地未提交的更改。

在您的情况下,分支master的工作树将具有与您正在切换的当前分支的尖端中当前存在的missing.html版本相同的版本。在这里更改分支时,Git不需要触摸工作副本(至少missing.html),因此可以保留本地修改。

如果您确实尝试checkout提交工作树中存在不同版本missing.html的提交(比当前分支中提交的那个),git会显示类似的错误消息对此:

$ git checkout some-other-branch
error: Your local changes to the following files would be overwritten by checkout:
        missing.html
Please, commit your changes or stash them before you can switch branches.
Aborting

答案 3 :(得分:0)

Git - the stupid content tracker。它只与工作树快照一起运行。主要要求 - 您应该能够重建工作树。它当然会更新。但是如果修改后的文件在两个分支中是相同的 - 为什么不允许切换?如果你错误地完成了它,你可以切换回重建以前的状态,没什么大不了的。但是如果分支中的文件不同,则需要合并内容,这就是它坚持提交更改的原因,否则将无法返回。

答案 4 :(得分:0)

这很明显,如果您更改要在其中签出的分支中未更改的文件,因为checkout的语法是将所有索引和工作目录带到您的新分支,您将使它们出现在你的新分支。虽然如果有冲突,你可能需要合并这些文件,这意味着一旦合并后,如果你结账回旧分支,那么它已经是合并版本而不是你以前的版本,你会失去它。因此,为了确保您保留旧的更改,它不会让您这样做。