【问题标题】:Modified files in a git branch are spilling over into another branchgit 分支中的修改文件溢出到另一个分支
【发布时间】:2023-04-01 07:10:01
【问题描述】:

我正在开发一个带有主分支和另一个主题分支的 git 存储库。我已切换到主题分支并修改了一个文件。现在,如果我切换到 master 分支,相同的文件会显示为已修改。

例如:

git-build 分支中的 git 状态:

# On branch git-build
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   cvsup_current
#

切换到主分支

[root@redbull builder_scripts (git-build)]# git co master
M       builder_scripts/cvsup_current
Switched to branch "master"

主分支中的 git 状态

[root@redbull builder_scripts (master)]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   cvsup_current
#

为什么文件在 git-build 分支中被修改,却在 master 分支中显示为已修改?

我的理解是分支彼此独立,当我从一个分支更改为另一个分支时,更改不会从一个分支“溢出”到另一个分支。所以我显然在这里遗漏了一些东西。

有人有线索吗?

【问题讨论】:

    标签: git git-branch


    【解决方案1】:

    为什么文件在 git-build 分支中被修改,却在 master 分支中显示为已修改?

    要记住的关键是文件在 git-build 分支中没有被修改。它仅在您的工作副本中进行了修改。

    只有在您提交时,才会将更改放回您已签出的任何分支中

    【讨论】:

    • 谢谢,这些答案让我明白了这一点!
    • 我刚刚意识到,来自 SVN 的思维方式,在分支中提交实际上并不是将其提交到您的“SVN”服务器,它更像是“将我的更改保存到这个分支”。我还在努力调整。
    • "它只在你的工作副本中被修改过"
    • 但是 git 是如何做到这一点的呢?如果我修改了一个分支上的文件,然后签出该文件已更改的另一个分支,即文件不再共享相同的基础,会发生什么情况。这与 rebase 有什么不同?如果我修改了一些文件,在我提交这些更改之前,git 不允许我重新设置基准。
    • 我在 Windows 上使用 Git 时遇到过这个污染问题。来自已提交更改的文件在切换到另一个分支后留在文件系统中。
    【解决方案2】:

    如果您想在去另一个分支上工作时将更改临时存储到一个分支,您可以使用git stash 命令。这是使用 git 令人惊奇的小秘密之一。示例工作流程:

    git stash #work saved
    git checkout master
    #edit files
    git commit
    git checkout git-build
    git stash apply #restore earlier work
    

    git stash 存储了一堆更改,因此您可以安全地存储多个检查点。你也可以给他们名字/描述。完整使用信息here

    【讨论】:

    • 虽然这不能直接回答为什么部分,但这个答案最符合 OP 试图做的事情的意图。这正是我想要的
    • git stash 不会保护新文件。它仅存储已跟踪的文件。因此,如果一个人创建了新文件,即使在存储之后,这些新文件也将在其他文件夹中可用。
    【解决方案3】:

    这是 git 的默认行为。

    如果您愿意,可以使用 -f 标志进行结帐以进行“干净结帐”。

    【讨论】:

    • 请注意,这不会将更改保留在您要离开的分支或任何东西的顶部。这将丢弃未提交的更改(除非文件未跟踪)。
    • 在极少数情况下,您想使用git checkout -f,因为它会立即、不可撤销地并且不会提示丢弃任何未提交的更改。 git checkout 的工作方式是有原因的,我建议阅读下面 Gareth 的评论。
    【解决方案4】:

    在您添加提交之前,修改后的文件不会放入存储库中。如果你切换回你的主题分支并提交文件,那么它就不会出现在主分支上。

    【讨论】:

      【解决方案5】:
      • 它不像 git 分支是相互依赖的,但它们也是 每个分支也没有单独的完整代码库。
      • 对于每次提交,Git 都会存储一个对象,该对象包含指向 变化。所以每个分支都指向它自己的最新提交,HEAD 指向你当前所在的分支。
      • 切换分支时,HEAD 指针指向该分支 分支的特定提交。所以如果有修改过的文件, 默认行为是复制它们。

      您可以执行以下操作来解决此问题。

      1. 使用-f 选项忽略更改。

      如果要保存更改:

      1. 在同一分支中本地提交更改,然后切换 分支。
      2. 使用git stash,切换分支,做你的工作,切换回 原来的分支,做git stash apply

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        • 2020-06-03
        • 2019-03-17
        • 1970-01-01
        相关资源
        最近更新 更多