在 $ Git checkout branchName 后,所有更改(提交或未提交/暂存或未上演)都出现在分支切换上

Upon $ Git checkout branchName, all changes (committed or not/ staged or not) appear on branch switched

Git / 分支异常行为

最近,我不得不恢复我的电脑并重新安装所有软件。

Git 的行为方式我不熟悉。

我做到了

$ git init
$ git branch -b newBranch
$ git checkout newBranch

在此之后我对几个文件做了一些更改并添加了一个新文件。

我没有 $ git add -A 也没有 $ git commit -m 'msg'

之后,

$ git checkout master

newBranch 上所做的所有更改反映在 master 上:

之后,

$ git status

所有更改都显示为未暂存(红色)。

以前,每当我切换到一个分支并进行一些更改时, 切换到另一个分支后,我将无法再看到这些更改(staged/un-staged 或 committed/un-committed)。

并且仅在 运行

$ git merge sourceBranch destinationBranch

这些更改会显示在其他分支上吗?好像不是这样

和我的 Git.

是吗

所以您现在正在 newBranch 分支上工作,您进行了更改,但 尚未 提交任何内容。

为什么允许签出 master 分支?

Git 允许这样做,因为切换到它 不会 覆盖您的任何 local 更改。

但是,如果您现在正在处理 master 分支并更改一些文件,Git 将阻止您这样做,因为本地更改会被覆盖。

简短回答:在您 addcommit 之前,git 不会跟踪您的本地更改。如果您在不添加或提交的情况下切换分支,git 不会覆盖这些本地更改,因此您不会轻易丢失数据。


存在三个独立的域:

  • 你的本地文件(L
  • 暂存区(S
  • 存储库(R

您已对 L 进行了更改。这些不反映在 SR 中,域是分开的。如果您没有告诉 git 到 add(到 S)或 commit(到 R),您在 L 中的更改不会属于任何分支,仅属于 L 域。

当你checkout分支时,从masternewBranch,git改变当前HEAD,即局部改变引入SR,如果你要addcommit

当您 checkout 分支时,git 还会尝试将签出的提交(即您签出的分支顶端的提交)反映到文件系统中,域 L但是,为了防止搬起石头砸自己的脚并丢失 L 中未暂存和未提交的更改,git 不会覆盖这些 L 更改。由于它们未添加或提交,否则您无法检索它们。

注意:您可以通过将 -f(强制)标志传递给 checkout 来告诉 git 覆盖此类本地更改。您会在没有警告的情况下丢失本地更改。

另请注意:在进行本地更改时切换分支并不总是可行的,例如,如果要更改的分支将应用会覆盖您的某些本地更改的更改。这是我最常使用 -f 的地方,当我知道我想丢失本地更改时。

这个答案(我的)可能有帮助:

它没有损坏或尝试添加那些未暂存的并再次提交。

之前的安装在实际命令和 Git 功能方面误导了我。 必须通读文档。