【问题标题】:How do I reset my entire .git folder from a remote repository without affecting my checked out working folder?如何在不影响我签出的工作文件夹的情况下从远程存储库重置我的整个 .git 文件夹?
【发布时间】:2019-07-24 14:26:19
【问题描述】:

如果我的.git 文件夹中出现问题并且我无法修复它,但我想按原样保留我的工作文件夹,我该如何从远程“重置”我的.git 文件夹仓库?

【问题讨论】:

标签: git


【解决方案1】:

以下过程可用于通过远程重新初始化您的.git 文件夹来“修复”它。此过程假定您当前的本地分支与远程分支在同一提交上。如果没有,您将丢失任何本地提交,但不会丢失本地更改。此外,任何被“忽略”的本地文件都将保持不变。

此外,任何仅限本地的分支都将丢失。如果要保留这些分支,请先将它们推送到远程。您还可以在本地复制整个预先修复的工作文件夹,然后将其添加为“远程”,然后将这些分支拉入您的固定副本(完成以下步骤后)。

最好在开始之前备份整个本地工作文件夹树,以防出现意外问题。

  1. 确定您当前所在的分支:

    git status

  2. 如果您有自定义挂钩,请保存 .git/hooks 文件夹

  3. 从工作副本中删除(或移动).git 文件夹

  4. 在你的工作副本中重新初始化一个 git repo:

    git init

  5. 手动添加您的origin 遥控器:

    git remote add origin *url*

  6. 获取远程仓库:

    git fetch

  7. 在开始之前重新创建工作副本所在的分支:

    git checkout -b *branch*

  8. 将该分支引用指向远程分支而不影响工作副本:

    git reset --mixed origin/*branch*

  9. 将所有已保存的挂钩复制到 .git/hooks 文件夹中。

  10. 如有必要,请进行任何清理,例如还原文件等。

改进了使用git reset --mixed 代替git reset --soft 加上@MarkAdelsberger 提供的git add .(参见cmets)。

改进保存@gary-kindel 提供的.git/hooks 文件夹(参见cmets)。

【讨论】:

  • 我想我会在第 7 步中使用 --mixed,并跳过第 8 步,除非/直到我特别想重新进行更改
  • @MarkAdelsberger - 很棒的建议。我已经更新了步骤。
  • 优秀的解决方案!我还有一个额外的步骤,将原始仓库中的 hooks 文件夹复制回重建的仓库中,以使用 git 和 contextmenu 选项恢复自定义的挂钩。
  • @GaryKindel - 太棒了,我在步骤中添加了保存/恢复钩子。
  • git reset 手册页说,关于 --mixed,“这是默认操作”,并且在此之前,“如果省略 ,则默认为 '--mixed'。 "
【解决方案2】:

假设我们位于混乱的存储库上方的目录中,名为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

这里的重点是,我们将远程 repo 的新副本签出到我们想要的分支,而我们的任何文件都不会妨碍同名文件。然后我们在上面复制我们的工作副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2012-05-02
    • 1970-01-01
    • 2017-10-08
    • 2021-03-14
    • 2013-09-17
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多