54

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

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

有没有人有线索棒?

4

5 回答 5

67

为什么文件在主分支中显示为已修改,即使它在 git-build 分支中进行了修改?

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

仅当您提交时,更改才会放回您已签出的任何分支

于 2008-10-29T10:06:14.343 回答
43

如果您想在去另一个分支上工作时将更改临时存储到一个分支,您可以使用该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存储一堆更改,因此您可以安全地存储多个检查点。你也可以给他们名字/描述。完整的使用信息在这里

于 2008-10-29T10:26:37.593 回答
15

这是 git 的默认行为。

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

于 2008-10-29T10:01:24.290 回答
10

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

于 2008-10-29T10:00:53.480 回答
2
  • 它不像 git 分支是相互依赖的,但它们也没有为每个分支单独提供完整的代码库。
  • 对于每次提交,Git 都会存储一个对象,其中包含指向更改的指针。所以每个分支都指向它自己的最新提交,而 HEAD 指向你当前所在的分支。
  • 当您切换分支时,HEAD 指针指向该分支的特定提交。因此,如果有修改过的文件,默认行为是复制它们。

您可以执行以下操作来克服此问题。

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

如果要保存更改:

  1. 在同一分支中本地提交更改,然后切换分支。
  2. 使用git stash,切换分支,做你的工作,切换回原来的分支,然后做git stash apply
于 2015-06-11T08:13:45.463 回答