【问题标题】:Git Checkout Deleting And Modifying FilesGit Checkout 删除和修改文件
【发布时间】:2020-05-19 13:49:17
【问题描述】:

首先,我看到有一些关于这个主题的问题,我已经解决了这些问题,但现在能够解决我的问题。大多数其他问题似乎都与 EOL 有关,而我的案例似乎与此有关。

问题:git checkout正在修改和删除文件。

我今天早上遇到了这个问题,并从克隆存储库的新副本开始,因此此时此特定 git 存储库的更改数量有限。

环境:

  • 在 Windows 10 上使用在 ConEmu 中运行的 Git Bash 终端
  • 打开具有 git 源选项卡的 Visual Code
  • 打开 GitKraken,它是一个 git 管理应用程序
  • git --version = "git 版本 2.23.0.windows.1"
  • git config --get core.autocrlf = "真"

列出了其他正在运行的 git 相关应用程序,因为我认为它们可能会以某种方式做出贡献

正如你在下面的截图中看到的,我做了以下事情:

  1. 重置我的候选分支,因为我有一个更改的文件
  2. 做了一个git status 来证明本地候选分支中没有更改的文件
  3. 对功能分支进行了检查 (PDEV-937)。这是我从原点提取的其他人的功能分支。
  4. git status 表明我的工作目录发生了某种变化。这些更改似乎是已删除的文件或已通过删除所有内容修改的文件(剩下一个空行)。

我无法解释结帐时的文件修改,最令人沮丧的部分是没有始终如一的完成。在第一个屏幕截图之后,我立即尝试重置功能分支以匹配原点。您可以看到每次重置都实现了不同的状态(我继续重置,在另外两次调用后,我最终直接工作,没有任何变化)。

我想要的结果是 git checkout 不会修改或删除任何文件(这是我的期望)

更新:似乎我只是在检查另一个特定开发人员的分支以进行代码审查时才遇到这个问题。他使用 Linux,而我使用 Windows,尽管我还没有弄清楚这是如何导致问题的;它也非常一致。我可以克隆 repo,检查特定的功能分支,一切都很好。在该分支上做一些樱桃选择/重置/合并,然后我签出的下一个功能分支将再次修改文件。重新克隆 repo 并检查第二个功能,它会再次正常。

【问题讨论】:

    标签: git git-bash


    【解决方案1】:

    如果存储库中的文件名称相同,但情况不同,则可能会发生这种情况。您可以通过git ls-files 进行验证。

    这是在 OS X 上的演示。OS X 默认不区分大小写,但我已经制作了一个区分大小写的文件系统来创建测试存储库。

    $ cd /Volumes/CaseSensitive/tmp/
    $ git init test
    Initialized empty Git repository in /Volumes/CaseSensitive/tmp/test/.git/
    $ cd test
    $ echo 'lowercase' > foo
    $ git add .
    $ git commit -m 'lowercase file'
    $ git checkout -b upcase
    $ echo 'uppercase' > Foo
    $ git commit -m 'uppercase file'
    

    我们有一个存储库,主分支中有fooupcase 分支中有fooFoo。让我们将它克隆到一个不区分大小写的文件系统。

    $ git clone /Volumes/CaseSensitive/tmp/test
    Cloning into 'test'...
    done.
    
    $ cd test
    $ git status
    On branch master
    Your branch is up to date with 'origin/master'.
    
    nothing to commit, working tree clean
    

    master 分支上的一切都很好,只有foo。现在看看我们何时用fooFoo 检出upcase 分支。

    $ git checkout upcase
    Switched to branch 'upcase'
    Your branch is up to date with 'origin/upcase'.
    
    $ git status
    On branch upcase
    Your branch is up to date with 'origin/upcase'.
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
        modified:   foo
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    $ git ls-files
    Foo
    foo
    

    Git 尝试将这两个文件都放到磁盘上,但是一个覆盖了另一个。


    唯一真正的解决方案是不让文件具有相同的名称但不同的大小写。获取区分大小写的文件系统并重命名这些文件。你可以try making the directories case-sensitive

    【讨论】:

    • 我很欣赏这些细节,这完全有道理,但在我的情况下似乎不是原因。我只看到在结帐时更改的文件的单个命名版本,并且将扳手投入其中,删除功能分支并进行另一个结帐实际上可能导致不同的文件被修改/删除而不是第一次。
    • @Daniel Odd。如果您确实弄清楚了,请发布答案。
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2016-09-09
    • 2019-02-02
    • 2018-11-05
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多