为什么分支中未提交的更改会影响主分支?

13

我是git的新手,正在尝试通过实验来理解概念,特别是分支和合并。

这是我的设置:

我有一个主分支,我创建了一个带有“master”文本的主文本文件。
现在我执行git checkout -b branch 并创建一个分支。
我编辑该分支的“parent”文件并添加了一行文本。

现在,如果我提交此更改并切换回主分支,它不应该受到影响,因为分支更改不应反映在主分支中。

但是,如果我将该分支保留未提交,并切换到主分支,则更改会反映在主分支中,Git会将其视为已编辑的主文件,当我执行以下操作时:

git status -s

它显示了带有 M 的主文件。

有人可以解释一下未提交的更改如何反映在主分支中吗?


5
重复的问题:https://dev59.com/Qmsz5IYBdhLWcg3wHUIU - torek
2个回答

9
Git可以在切换分支时保留您未提交的更改,这非常实用。您可以将其视为未提交的更改仅“属于”您的工作副本,而不属于任何分支或提交。它们是独立的。当您在一个分支中提交更改时,如果检出的文件版本与之前不同,它们当然会发生变化。
唯一的例外情况是,如果分支更改将未提交的文件带到了不同的版本,则检出将被取消:
A--B - feature
 \
  -C - master

假设在feature分支中提交B更改了foo.txt中的一行,而您已经检出了master分支。 您对foo.txt进行了不同的更改。
  1. You commit the change in master and checkout feature

    git add foo.txt
    git commit -m "changed foo.txt"
    git checkout feature
    

    Here no problem, the change is recorded in master and when you go to feature foo.txt is changed accordingly.

  2. If you don't commit and try to checkout feature, then Git will print an appropriate message, and keep the master branch checked out:

    git checkout feature
    

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


好的,感谢您的回答。由于我对Git还很陌生,所以我对术语并不是很了解,但我知道命令的功能。如果您不介意的话,能否用一系列命令来说明您最后的观点? - Max
所以我在复现你刚才告诉我的时候遇到了一点问题。这是我做的,我创建了一个名为git_project的文件夹,然后运行了git init和git branch命令,但现在它没有显示主分支。似乎只有在我提交了一些内容之后才会看到主分支。在提交之前,当我运行'git branch'时,什么也看不到。难道主分支不应该默认创建吗? - Max
当然,master分支是存在的。我相信当你没有提交时,它只是“幽灵”状态。进行第一次提交,它就会出现在git branch中。 - CharlesB
好的,看来我真的很困惑,我正在考虑发布一个与上述问题相关的问题。顺便感谢你的帮助! - Max
暂存但未提交是否会改变任何内容?或者文件仍然被视为本地文件,因此在切换回父级时也会被暂存? - nilskp

0
在Git或任何版本控制系统中,所有合并操作都应在本地机器上完成。因此,如果您在任何分支上有未提交的更改,为了防止它们丢失/被忽略,它们会与刚切换/新检出的分支进行合并。除非使用git push,否则您的更改将始终存在。当然,也可能存在相反的情况,但对程序员来说通常更有益处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接