【问题标题】:Different branches share a single index file?不同的分支共享一个索引文件?
【发布时间】:2019-11-21 10:18:18
【问题描述】:

我对下面的场景感到困惑

git init  (command 0)
Initialized empty Git repository in a path;

echo line1 >a (command 1)
git add a  (command 2)`

git commit -m 'first commit' (command 3)
1 file changed, 1 insertion(+)
create mode 100644 a

git branch b (command 4)
echo line2 >>a (command 5)

git checkout b  (command 6)
Switched to branch 'b'

git status (command 7)
Changes not staged for commit

git checkout master (command 8)
Switched to branch 'master'

git add a  (command 9)
git status (command 10)
Changes to be committed

git checkout b  (command 11)
Switched to branch 'b'

git status  (command 12)
Changes to be committed:

Q1:由于分支 b 是在提交后创建的,所以 b 的初始存储库应该包含文件 'a',切换到 b 后,工作目录应该初始化为分支 b 上的最后一次提交。但是工作目录中的文件a没有改变(仍然包含2行),这是某种防止丢失更改的机制吗?

Q2:在命令8之后,当前分支应该是master,然后将文件'a'添加到索引中然后checkout回到分支b,此时git状态返回(要提交的更改)。但是我在master分支中添加了文件'a',为什么我可以在另一个分支上提交它? 而且我对结帐分支时索引文件如何更改(或不更改)有点困惑

提前致谢!

【问题讨论】:

  • 这并不是说 分支 共享一个索引文件(尽管实际上它们是共享的)。相反,整个存储库只有一个索引文件。更准确地说,每个工作树都有一个独特的索引;并且存储库有一个工作树(直到您添加更多),因此它只有一个索引(直到您添加更多工作树)。任何git checkout branch 都必须使用该索引。

标签: git git-branch git-checkout


【解决方案1】:

意识到:将第二行添加到文件后,您还没有提交任何内容。说了这么多

好的... git 会尝试保存您未提交的更改,除非您强制它丢失它们。它甚至会阻止你做一些事情,这样你就不会丢失你的更改。

在命令 5 和 6 之间,您还没有提交对文件的更改,实际上,它甚至不在索引上。命令 6 切换到 b,并且该修订版指向您所在的同一修订版,因此 git 方式“ok”,移动到 b。您仍然可以取消暂存文件。

在命令 8 上,您将 back 切换到 master,git 说“当然”(您没有移动到另一个版本,所以您很好)。

命令 11,文件终于进入阶段...但又没有从当前版本移动,所以一切都很好。

想看看 git 有时是如何阻止你移动的吗?立即提交(在分支 b 上),然后执行以下操作:

git branch c master
git checkout c
echo hello > a
git checkout b # and here git should keep you from moving.

【讨论】:

  • 是的...我知道添加第二行后我没有提交任何内容,我只想知道为什么我在 master 分支中添加了文件'a',然后结帐到分支 b,我仍然可以在分支'b'上提交。仅当两个分支都包含文件'a'时才会发生这种情况吗?我的意思是,否则我可能会提交分支 b 上不应该存在的东西
  • 在分支 master 上添加并不重要。当您要求 git 切换到分支 b 时,git 将尝试将您在索引和工作树上的所有内容带到您要求移动的位置。如果可以(就像这里一样,没有真正的运动),git 会... 按要求
猜你喜欢
  • 2021-11-24
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
相关资源
最近更新 更多