git 分支中的修改文件溢出到另一个分支

Posted

技术标签:

【中文标题】git 分支中的修改文件溢出到另一个分支【英文标题】:Modified files in a git branch are spilling over into another branch 【发布时间】:2021-04-17 23:14:38 【问题描述】:

我正在开发一个带有主分支和另一个主题分支的 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 分支中显示为已修改?

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

有人有线索吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

这是 git 的默认行为。

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

【讨论】:

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

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

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

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

【讨论】:

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

如果您想在去另一个分支上工作时将更改临时存储到一个分支,您可以使用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 不会保护新文件。它仅存储已跟踪的文件。因此,如果一个人创建了新文件,即使在存储之后,这些新文件也将在其他文件夹中可用。【参考方案5】: 它不像 git 分支是相互依赖的,但它们也是 每个分支也没有单独的完整代码库。 对于每次提交,Git 都会存储一个对象,该对象包含指向 变化。所以每个分支都指向它自己的最新提交,HEAD 指向你当前所在的分支。 切换分支时,HEAD 指针指向该分支 分支的特定提交。所以如果有修改过的文件, 默认行为是复制它们。

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

    使用-f 选项忽略更改。

如果要保存更改:

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

【讨论】:

以上是关于git 分支中的修改文件溢出到另一个分支的主要内容,如果未能解决你的问题,请参考以下文章

Git合并指定文件到另一个分支

Git合并指定文件到另一个分支

git使用问题

Git中分支变基的原理

GIt将一个分支中的文件移植到另一个分支

Git撤销工作区修改