Git 在分支切换失败后删除了我的文件

Git deleted my files after a failed branch switch

通常我会在名为 test 的本地分支上工作,然后在功能完成后将该分支合并到 master 中。但是,由于某种原因,我丢失了最新的更改。

这是我所做的:

T:\Test [test × +4 ~3 -5 !]> git status
On branch test
Your branch is based on 'origin/test', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   jest.config.js
        modified:   ormconfig.ts
        modified:   src/index.ts
        deleted:    src/it-portal/entity/Kiwi.ts
        deleted:    src/it-portal/entity/Movie.ts
        deleted:    src/it-portal/entity/User.ts
        deleted:    src/resolvers/HelloWorldResolver.ts
        deleted:    src/resolvers/MovieResolver.test.ts
        deleted:    src/resolvers/MovieResolver.ts
        deleted:    src/tests/Interfaces/global.d.ts
        deleted:    src/tests/config/globalSetup.ts
        deleted:    src/tests/config/globalTeardown.ts
        deleted:    src/tests/config/setupFiles.ts

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        src/it-portal/entity/Account.ts
        src/resolvers/AccountResolver.test.ts
        src/resolvers/AccountResolver.ts
        src/test-utils/

no changes added to commit (use "git add" and/or "git commit -a")

T:\Test [test × +4 ~3 -10 !]> git add .

T:\Test [test × +4 ~7 -6 ~]> git commit -am 'added Account entity and resolvers'
[test caaa67a] added Account entity and resolvers
 17 files changed, 164 insertions(+), 183 deletions(-)
 create mode 100644 src/it-portal/entity/Account.ts
 delete mode 100644 src/it-portal/entity/Kiwi.ts
 delete mode 100644 src/it-portal/entity/Movie.ts
 delete mode 100644 src/it-portal/entity/User.ts
 create mode 100644 src/resolvers/AccountResolver.test.ts
 create mode 100644 src/resolvers/AccountResolver.ts
 delete mode 100644 src/resolvers/HelloWorldResolver.ts
 delete mode 100644 src/resolvers/MovieResolver.test.ts
 delete mode 100644 src/resolvers/MovieResolver.ts
 rename src/{tests => test-utils}/Interfaces/global.d.ts (100%)
 rename src/{tests => test-utils}/config/globalSetup.ts (100%)
 rename src/{tests => test-utils}/config/globalTeardown.ts (100%)
 rename src/{tests => test-utils}/config/setupFiles.ts (100%)
 create mode 100644 src/test-utils/helpers/axios.ts

T:\Test [test ×]> git checkout master
fatal: cannot create directory at 'src/resolvers': Permission denied

T:\Test [test × +3 ~3 -8 !]> git merge test
Already up to date.

T:\Tes [test × +3 ~3 -8 !]> git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        jest.config.js
        ormconfig.ts
        src/index.ts
Please commit your changes or stash them before you switch branches.
error: The following untracked working tree files would be overwritten by checkout:
        src/it-portal/entity/Kiwi.ts
        src/it-portal/entity/Movie.ts
        src/it-portal/entity/User.ts
Please move or remove them before you switch branches.
Aborting

T:\Test [test × +3 ~3 -8 !]> git log
commit caaa67ae6643b5efa2c7f3bd65a3aa4317037367 (HEAD -> test)
Author: Me <bob@gmail.com>
Date:   Thu Jun 18 14:25:10 2020 +0200

    added Account entity and resolvers

commit 724bb33f38f3c380ac07666f0f6c3e5ca8648d8f (origin/master, master)
Author: Me <bob@gmail.com>
Date:   Wed Jun 17 15:27:14 2020 +0200

T:\Test [test × +3 ~3 -8 !]> git status
On branch test
Your branch is based on 'origin/test', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   jest.config.js
        modified:   ormconfig.ts
        modified:   src/index.ts
        deleted:    src/it-portal/entity/Account.ts
        deleted:    src/resolvers/AccountResolver.test.ts
        deleted:    src/resolvers/AccountResolver.ts
        deleted:    src/test-utils/Interfaces/global.d.ts
        deleted:    src/test-utils/config/globalSetup.ts
        deleted:    src/test-utils/config/globalTeardown.ts
        deleted:    src/test-utils/config/setupFiles.ts
        deleted:    src/test-utils/helpers/axios.ts

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        src/it-portal/entity/Kiwi.ts
        src/it-portal/entity/Movie.ts
        src/it-portal/entity/User.ts

no changes added to commit (use "git add" and/or "git commit -a")

T:\Test [test × +3 ~3 -8 !]> git branch
  master
* test

我注意到切换到 master 分支时出了点问题。但是现在,虽然我在测试中做了正确的提交,并且仍然在分支 test 上,但它没有向我显示添加的文件,如 Account.ts,并且仍然向我显示已删除的文件,如 Kiwi.ts。知道如何解决这个问题吗?

同时检查下面的内容,这是我不希望发生的事情。

T:\Test [test × +3 ~3 -8 !]> git checkout test
Switched to branch 'test'
M       jest.config.js
M       ormconfig.ts
M       src/index.ts
D       src/it-portal/entity/Account.ts
D       src/resolvers/AccountResolver.test.ts
D       src/resolvers/AccountResolver.ts
D       src/test-utils/Interfaces/global.d.ts
D       src/test-utils/config/globalSetup.ts
D       src/test-utils/config/globalTeardown.ts
D       src/test-utils/config/setupFiles.ts
D       src/test-utils/helpers/axios.ts
Your branch is based on 'origin/test', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

会发生什么:

  1. git checkout master 由于 Permission denied 而失败。您创建新文件的用户可能比您的权限更高,或者由于某些原因,这些文件的权限 altered/corrupted。
    Git 无法执行所需的更改以切换分支并恢复 master 分支的工作树。

  2. git merge test没有任何效果。您从未切换过分支,而您已经在 test 分支上。

  3. 第二个 git checkout master 警告您未提交的更改并停止切换分支命令。

  4. git log 向您展示了您所做的提交。这是您的工作不会丢失的保证,也是您在 test 分支上的确认。

  5. git status 向您展示了一个混乱的工作树。
    该工作树是第一个 git checkout master(在点 1)的结果。
    在通常的情况下,当 git checkout 由于脏工作树而不可能时,git 停止操作,恢复工作树并向用户显示它无法更改分支的原因,因为它发生了在第 3 点(第二个 git checkout)。

最有可能的是,第一个 git checkout 无法恢复工作树,因为它没有创建文件夹的正确权限,导致工作树混乱。

你有很多方法可以将工作树恢复到当前分支中的最后一次提交。
我建议您 git reset --hard HEAD 完全恢复 test 分支的工作树并检查文件的任何权限问题并在尝试任何签出或合并命令之前解决它。