在 $ 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
上:
- 对 newBranch 上的所有文件所做的所有更改
- 在 newBranch 上创建的所有新文件
之后,
$ git status
所有更改都显示为未暂存(红色)。
以前,每当我切换到一个分支并进行一些更改时,
切换到另一个分支后,我将无法再看到这些更改(staged/un-staged 或 committed/un-committed)。
并且仅在 运行
$ git merge sourceBranch destinationBranch
这些更改会显示在其他分支上吗?好像不是这样
和我的 Git.
是吗
- 坏了?
- 配置错误?
- 未安装?
- 已损坏?
- 我哪里不明白?
所以您现在正在 newBranch
分支上工作,您进行了更改,但 尚未 提交任何内容。
为什么允许签出 master
分支?
Git 允许这样做,因为切换到它 不会 覆盖您的任何 local 更改。
但是,如果您现在正在处理 master
分支并更改一些文件,Git 将阻止您这样做,因为本地更改会被覆盖。
简短回答:在您 add
或 commit
之前,git 不会跟踪您的本地更改。如果您在不添加或提交的情况下切换分支,git 不会覆盖这些本地更改,因此您不会轻易丢失数据。
存在三个独立的域:
- 你的本地文件(
L
)
- 暂存区(
S
)
- 存储库(
R
)
您已对 L
进行了更改。这些不反映在 S
或 R
中,域是分开的。如果您没有告诉 git 到 add
(到 S
)或 commit
(到 R
),您在 L
中的更改不会属于任何分支,仅属于 L
域。
当你checkout
分支时,从master
和newBranch
,git改变当前HEAD
,即局部改变将引入S
或R
,如果你要add
或commit
。
当您 checkout
分支时,git 还会尝试将签出的提交(即您签出的分支顶端的提交)反映到文件系统中,域 L
。 但是,为了防止搬起石头砸自己的脚并丢失 L
中未暂存和未提交的更改,git 不会覆盖这些 L
更改。由于它们未添加或提交,否则您无法检索它们。
注意:您可以通过将 -f
(强制)标志传递给 checkout
来告诉 git 覆盖此类本地更改。您会在没有警告的情况下丢失本地更改。
另请注意:在进行本地更改时切换分支并不总是可行的,例如,如果要更改的分支将应用会覆盖您的某些本地更改的更改。这是我最常使用 -f
的地方,当我知道我想丢失本地更改时。
这个答案(我的)可能有帮助:
它没有损坏或尝试添加那些未暂存的并再次提交。
之前的安装在实际命令和 Git 功能方面误导了我。
必须通读文档。
Git / 分支异常行为
最近,我不得不恢复我的电脑并重新安装所有软件。
Git 的行为方式我不熟悉。
我做到了
$ git init
$ git branch -b newBranch
$ git checkout newBranch
在此之后我对几个文件做了一些更改并添加了一个新文件。
我没有 $ git add -A
也没有 $ git commit -m 'msg'
之后,
$ git checkout master
在 newBranch
上所做的所有更改反映在 master
上:
- 对 newBranch 上的所有文件所做的所有更改
- 在 newBranch 上创建的所有新文件
之后,
$ git status
所有更改都显示为未暂存(红色)。
以前,每当我切换到一个分支并进行一些更改时, 切换到另一个分支后,我将无法再看到这些更改(staged/un-staged 或 committed/un-committed)。
并且仅在 运行
$ git merge sourceBranch destinationBranch
这些更改会显示在其他分支上吗?好像不是这样
和我的 Git.
是吗
- 坏了?
- 配置错误?
- 未安装?
- 已损坏?
- 我哪里不明白?
所以您现在正在 newBranch
分支上工作,您进行了更改,但 尚未 提交任何内容。
为什么允许签出 master
分支?
Git 允许这样做,因为切换到它 不会 覆盖您的任何 local 更改。
但是,如果您现在正在处理 master
分支并更改一些文件,Git 将阻止您这样做,因为本地更改会被覆盖。
简短回答:在您 add
或 commit
之前,git 不会跟踪您的本地更改。如果您在不添加或提交的情况下切换分支,git 不会覆盖这些本地更改,因此您不会轻易丢失数据。
存在三个独立的域:
- 你的本地文件(
L
) - 暂存区(
S
) - 存储库(
R
)
您已对 L
进行了更改。这些不反映在 S
或 R
中,域是分开的。如果您没有告诉 git 到 add
(到 S
)或 commit
(到 R
),您在 L
中的更改不会属于任何分支,仅属于 L
域。
当你checkout
分支时,从master
和newBranch
,git改变当前HEAD
,即局部改变将引入S
或R
,如果你要add
或commit
。
当您 checkout
分支时,git 还会尝试将签出的提交(即您签出的分支顶端的提交)反映到文件系统中,域 L
。 但是,为了防止搬起石头砸自己的脚并丢失 L
中未暂存和未提交的更改,git 不会覆盖这些 L
更改。由于它们未添加或提交,否则您无法检索它们。
注意:您可以通过将 -f
(强制)标志传递给 checkout
来告诉 git 覆盖此类本地更改。您会在没有警告的情况下丢失本地更改。
另请注意:在进行本地更改时切换分支并不总是可行的,例如,如果要更改的分支将应用会覆盖您的某些本地更改的更改。这是我最常使用 -f
的地方,当我知道我想丢失本地更改时。
这个答案(我的)可能有帮助:
它没有损坏或尝试添加那些未暂存的并再次提交。
之前的安装在实际命令和 Git 功能方面误导了我。 必须通读文档。