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 分支中的修改文件溢出到另一个分支的主要内容,如果未能解决你的问题,请参考以下文章