当我切换分支时,Git正在删除一个被忽略的文件

当我切换分支时,Git正在删除一个被忽略的文件,git,Git,我有一个分支(我们称之为B)忽略了某个文件,而在其他一些分支(例如分支a)中没有忽略该文件。当我从分支B切换到分支A,然后再次切换回B时,文件已被删除 这正常吗?我可以看到它是如何发生的,从某种意义上说,分支B认为它不在那里,分支A认为它在那里,所以当我回到B时,它会“收拾它”。但这有点烦人 有什么建议吗?这很正常,不过我对其中的一步有点惊讶 当您从B切换到A时,git看到文件必须更新以匹配A的版本,并且会以静默方式进行更新,因为您忽略了它,表示就分支B而言,文件并不重要。它必须这样做-唯一的选

我有一个分支(我们称之为B)忽略了某个文件,而在其他一些分支(例如分支a)中没有忽略该文件。当我从分支B切换到分支A,然后再次切换回B时,文件已被删除

这正常吗?我可以看到它是如何发生的,从某种意义上说,分支B认为它不在那里,分支A认为它在那里,所以当我回到B时,它会“收拾它”。但这有点烦人


有什么建议吗?

这很正常,不过我对其中的一步有点惊讶

当您从B切换到A时,git看到文件必须更新以匹配A的版本,并且会以静默方式进行更新,因为您忽略了它,表示就分支B而言,文件并不重要。它必须这样做-唯一的选择是拒绝签出分支A。(如果文件没有被忽略,它会拒绝,说“未跟踪的工作树文件”将被合并覆盖)。我真的很惊讶在这种情况下它也没有这样做。有人知道这是功能还是错误吗?)

当您切换回时,git发现分支B没有该文件,并将其删除。同样,它必须这样做。它无法读懂你的心思,并意识到一分钟前存在的被忽略的文件是你想要返回的文件——它只是给你分支B的内容,分支B表示该文件不存在


正如ewall在评论中所建议的那样,如果您想让文件在这些转换中幸存下来,则需要所有分支跟踪它,或者在所有分支中忽略它。

因为唯一可行的解决方案是始终跟踪文件“
f
”,因此您可以仅在分支
B
中添加一个带有:

在签出分支时
B

  • 涂抹过程将更改:

    • f
      的内容保存在临时文件中
    • f
      的内容替换为一个
      fbis
      文件(一个跟踪文件,对于分支
      B
      ,它将包含
      f
      B
      内容)
  • 清洁进程将:

    • f
      内容(在
      B
      中修改)保存在
      fbis
      中(
      fbis
      在分支
      B
      中通过
      f
      修改提交)
    • 还原
      f
      内容(使用临时文件),意味着
      f
      未提交(在
      B
      中忽略)
您可以在分支
B
中添加一个,当从其他分支合并到
B
时,该分支将保护FBI:
合并驱动程序将始终保留
B
版本的
fbis
内容,确保在签出分支
B
时,被忽略的文件
f
返回其内容

由于这些驱动程序(筛选和合并)未在其他分支中提交,因此文件“f”及其所有修改均在其他分支中提交。
在分支
B
中,其内容将永远不会更改,但只要签出
B
,对
f
所做的“本地修改”仍将恢复

如果不需要进行内容恢复,则无需管理FBI

只要保留筛选器驱动程序,您就可以确保无论您对分支
B
中的
f
做了什么修改,这些更改都不会提交,实际上会忽略
f
内容。

我也经历过类似的情况,我会这样做:

我将调用在签出index.php时删除的文件

分支A分支B的.gitignore中,删除忽略index.php的行,然后在两个分支中提交.gitignore

在分支A中,创建index.php的备份,删除该备份并提交

在分支A中从先前创建的备份中恢复index.php,并在.gitignore中再次忽略index.php并提交


在分支B中添加index.php,忽略.git中的文件忽略,提交并快乐。

忽略git中的文件并不意味着它们不需要修改。您可以在git中签入和管理一个文件,并在
.gitignore
中忽略它

回答 如果仅忽略分支
B
中的文件,而不忽略分支
A
中的文件,则在从
A
切换到
B
时,无法防止该文件被删除

但是,从您的评论中,我看到您试图忽略两个分支中的文件,但它仍然被删除。它可能仍在
A
中跟踪。转到分支机构
A
和 已从索引中删除被忽略的文件

git rm --cached <file>
git-rm——缓存
如果将分支
A
推入存储库,请小心。您可以在这些机器上拉动后添加文件


解释 我也有同样的问题。这就是我的遭遇:

  • 文件
    test.json
    曾在
    B
    中跟踪
  • 我从
    B
    创建了一个分支
    a
    (因此文件
    test.json
    也在
    a
    中跟踪)
  • 后来我忽略了分支
    B
    中的文件
    test.json
    。但是git将继续跟踪任何已经被跟踪的文件。为了停止跟踪该文件,我将其从索引
    git rm--cached foo/test.json
    中删除
  • 在这三个步骤之后,会发生以下情况:如果我在分支
    B
    中,则文件
    test.json
    存在。如果我切换到
    A
    它仍然存在。如果我签回
    B
    它就不见了。所以我注意到了和你一样的情况:

    我可以看到它是如何发生的,在这个意义上,分支B 认为它不在那里,分支机构A认为