27

我只是在学习 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

(打开notepad++修改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,但它只是切换到新分支而没有警告,它带来了未提交的更改:

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:我现在明白了。评价最高的答案是正确的,请参阅我对该答案的最后评论。

4

5 回答 5

36

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

因此,假设我们有一个名为“readme”的分支,您在其中提交了对文件的一些更改,比如说 README.md。

现在,您已切换回 master。您对其他文件(不是 README.md)做了一些工作。现在您有了本地更改。如果您尝试在不提交更改的情况下切换回“自述文件”分支,它会让您这样做。为什么?因为切换到“自述文件”分支不会覆盖您的任何本地更改。

但是,如果您对主分支上的 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 进行了需要合并的更改。

于 2013-04-19T21:09:05.620 回答
16

This is the normal behavior. If you don't want the modified files on your newly checked out branch, then stash them. Like this.

# on branch dev
$ git stash
$ git checkout master

# do stuff on master

# back to dev
$ git checkout dev
$ git stash pop
于 2013-04-19T23:02:13.700 回答
2

只要您将工作树更改为的提交不会破坏您本地未提交的更改,Git 将允许您签出其他分支(或标签或 SHA1 哈希)。

在您的情况下, branchmaster的工作树将具有与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
于 2013-04-19T21:11:02.130 回答
0

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

于 2013-10-18T18:36:17.350 回答
0

Git - 愚蠢的内容跟踪器。它仅使用工作树快照进行操作。主要要求 - 您应该能够重建工作树。它当然会更新。但是如果修改后的文件在两个分支中都相同 - 为什么不允许切换?如果你做错了,你可以切换回重建以前的状态,没什么大不了的。但是如果文件在分支中不同,则需要合并内容,这就是它坚持提交更改的原因,否则将无法返回。

于 2013-04-19T21:09:02.937 回答