【问题标题】:Upon $ Git checkout branchName, all changes (committed or not/ staged or not) appear on branch switched在 $ Git checkout branchName 后,所有更改(已提交或未提交/暂存或未执行)出现在分支切换
【发布时间】:2016-03-23 09:10:42
【问题描述】:

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

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

以前,每当我切换到分支并进行一些更改时, 切换到另一个分支后,我将无法再看到这些更改(暂存/未暂存或已提交/未提交)。

只有在运行时

$ git merge sourceBranch destinationBranch

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

用我的 Git。

是吗

  • 坏了?
  • 配置错误?
  • 错过安装?
  • 损坏了?
  • 我不明白什么?

【问题讨论】:

  • "以前,每当我切换到一个分支并进行一些更改时,在切换到另一个分支时,我将无法再看到这些更改(暂存/未暂存或已提交/未提交)。”我不相信是这种情况,这里有些混乱。

标签: git git-branch git-checkout


【解决方案1】:

所以您现在正在处理newBranch 分支,您进行了更改,但没有提交任何内容。

为什么允许签出master 分支?

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

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

【讨论】:

  • 在 * 在 NewBranch 中进行更改(没有暂存)后, * 切换到 master 并对从 NewBranch 显示的更改进行一些更改,* 并切换回 NewBranch,我可以看到所有更改大师(仍未上演)
【解决方案2】:

它没有损坏或任何尝试添加那些 unstage 并再次提交。

【讨论】:

    【解决方案3】:

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


    共有三个独立的域:

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

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

    当你 checkout 分支,从 masternewBranchnewBranch 时,git 会更改当前的 HEAD,即本地更改引入到 S 或 @ 987654341@,如果你是addcommit

    当您checkout 分支时,git 还会尝试将签出的提交(这是您签出的分支顶端的提交)反映到文件系统域L 上。 但是,为了防止在L 中丢失未分级和未提交的更改,git 不会覆盖这些L 更改。由于它们没有被添加或提交,否则您无法检索它们。

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

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

    这个答案(我的)可能会有所帮助:https://stackoverflow.com/a/2569513/108802

    【讨论】:

    • 我不明白为什么当我在没有添加或提交的情况下签出一个分支时,我的代码编辑器上的源代码不会在另一个分支中没有更改的情况下恢复到文件;尽管如此,我还没有运行 $ git merge
    • 在提交这些更改之前,您尚未在另一个分支中进行更改。你在一个分支上(域R),你做了更改(域L),但更改本身只是本地的,而不是在分支上。
    • checkout-f,你会得到你期望的行为。但是,如果从未提交,您的本地更改将会丢失。
    • 哇,显然我在之前的安装中配置我的 bash 命令的方式给了我错误的想法。谢谢一堆。我必须阅读更多文档。
    • @wowiamhere:很好,你想通了!如果您认为您的问题已解决,请考虑投票/接受答案。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 2020-12-27
      • 2020-12-15
      • 2021-05-01
      • 1970-01-01
      • 2014-10-30
      • 2020-10-23
      • 2021-03-26
      • 2018-01-09
      相关资源
      最近更新 更多