如何从远程仓库重置整个.git文件夹而不影响已检出的工作文件夹?

4
如果我的 .git 文件夹出现问题,我无法解决,但我想保留当前工作文件夹不变,那么如何从远程仓库“重置”我的 .git 文件夹?

这个问题是仅克隆git存储库的.git目录的副本。 - EvgenKo423
2个回答

7
以下步骤可用于通过从远程重新初始化它来“修复”您的.git文件夹。该过程假定您当前的本地分支与远程分支相同。如果不是,则会丢失任何本地提交,但您不会丢失本地更改。此外,“被忽略”的任何本地文件都将保持不变。
此外,任何仅在本地的分支都将丢失。如果要保存它们,请先将这些分支推送到远程。还可以将整个修复完成的工作文件夹副本复制到本地,并将其添加为“远程”,并在完成以下步骤后将这些分支拉入修复完成的副本中。
最好在开始之前备份整个本地工作文件夹树,以防出现意外问题。
  1. 确定您当前所在的分支:
  2. git status

  3. 如果有自定义挂钩,请保存.git/hooks文件夹
  4. 从工作副本中删除(或移动)您的.git文件夹
  5. 在您的工作副本中重新初始化一个Git Repo:
  6. git init

  7. 手动添加您的origin远程:
  8. git remote add origin *url*

  9. 获取远程存储库:
  10. git fetch

  11. 重新创建您在开始之前的工作副本所在的分支:
  12. git checkout -b *branch*

  13. 将该分支引用指向远程分支,而不影响工作副本:
  14. git reset --mixed origin/*branch*

  15. 将任何保存的挂钩复制到.git/hooks文件夹。
  16. 如果必要,请对文件进行还原等任何清理操作。
使用git reset --mixed而不是git reset --soft加上git add .的改进由@MarkAdelsberger提供(请参见注释)。
保存.git/hooks文件夹的改进由@gary-kindel提供(请参见注释)。

1
我认为在第7步中我会使用 --mixed,并且除非/直到我特别想重新暂存更改,否则跳过第8步。 - Mark Adelsberger
@MarkAdelsberger - 太棒了的建议。我已经更新了步骤。 - MikeJansen
1
非常好的解决方案!我还有一个额外的步骤,将原始存储库中的hooks文件夹复制回重建的存储库,以使用git和contextmenu选项恢复自定义钩子。 - Gary Kindel
@GaryKindel - 太棒了,我已经为步骤添加了保存/恢复钩子。 - MikeJansen
2
“git reset”手册中关于“--mixed”的说明是:“这是默认操作”,在此之前,“如果省略<mode>,则默认为'--mixed'。” - Kaz

1

假设我们在混乱的仓库上面的目录中,该仓库名为repo,并且我们处于带有GNU Coreutils的shell环境中:

rm -rf repo/.git
git clone -d url://remote/repo -b some-branch new-repo
cp -a repo/. new-repo/.

现在使用new-repo,否则:
$ rm -rf repo
$ mv new-repo repo

这里的重点是我们获取了一个远程仓库的新副本,检出到我们想要的分支,没有我们的任何文件阻碍同名文件。然后我们将我们的工作副本复制到其上方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接