如何在Git中完全清空主分支?

63
我想完全清空Git中的主分支(master branch)。目前,我也想保留所有从主分支派生的其他分支。
这是否可能?如何实现?

1
我理解您想让其他分支的文件不受影响。您是想仅删除master分支中的文件还是完全删除master分支? - Tuxdude
2
我想删除主分支中的所有文件,但保留该分支。就像从头开始一样。没有文件,没有历史记录。但是,是的,所有其他分支都保持不变。 - Marty Wallace
6个回答

73

实际上这被称为“删除旧主分支并从头开始创建新的”

这将创建一个指向初始提交的新主分支:

git branch -D master
git checkout -b master <initial commit hash>

这将创建一个完全独立于您之前拥有的任何分支的全新主分支:

git branch -D master
git checkout --orphan master
git rm -rf *

但实际上,你可以将当前代码库简单地保存到其他位置,并创建一个新的代码库。


1
在删除主分支之前,请确保至少有一个标签指向当前的主分支,否则操作者可能会丢失提交记录。 - Tuxdude
1
请注意,git checkout --orphan 仅适用于 git 1.7.2 及以上版本。 - Tuxdude
如果您创建了完全空的主版本(第二组命令),则最后执行 git commit --allow-empty -m "empty repo" - Ilya Serbis
但是如果该分支与 AWS 部署的应用程序相关联,那会不会清除与已删除分支相关联的 AWS 配置呢? - vInEnDeRsInGh

48

创建孤立分支

首先,您需要移动或删除当前的主分支。个人而言,我更喜欢将其移开而不是删除它。之后,您只需使用--orphan标志创建一个没有父节点的新分支。例如:

git branch -m master old_master
git checkout --orphan master

由于当前分支没有历史记录,一些命令可能会失败并显示错误消息,例如fatal: bad default revision 'HEAD'直到您在新的主分支上进行第一次提交之后。这是正常现象,并且与初次初始化的代码库看到的行为相同。


1
这是最好的方法。但请注意,--orphan选项仅在git 1.7.2中添加。 - Anubian Noob
2
在我看来,这实际上是最好的答案。建议将主分支重置为初始提交并不完全符合要求,因为初始提交并不一定处于干净的状态。 - bestform
这对我非常有效。由于我已经有了我的孤儿分支,在移动主分支后,我检出了我的孤儿分支,然后从那里创建了主分支:git checkout my_orphan git checkout -b master - stephen.hanson

11

其他答案建议创建一个全新的主分支(就像在空仓库中一样)。但是没有历史记录的主分支并不是一个好的做法。这使得使用变基很困难,因为你永远无法变基第一个提交。任何存储库上的主分支的第一个提交应该是空的。 这里有一个低级别的管道解决方案:

使用低级别的管道命令进行修复

首先获取一个空树哈希:

$ git hash-object -t tree /dev/null
4b825dc642cb6eb9a060e54bf8d69288fbee4904

然后,您使用树哈希来创建一个空提交。
$ git commit-tree -m "inital commit" 4b825dc642cb6eb9a060e54bf8d69288fbee4904
a5c0737b92e5e5d4502e15b93d7a46d1e17b2b22

最后,你将主分支重置到那个提交

$ git reset --hard a5c0737b92e5e5d4502e15b93d7a46d1e17b2b22

这在我的博客文章中有更详细的描述


4

这里有个可能不太好的做法,但在紧急情况下有效(在aragaer的解决方案基础上进行改进)

git branch -D master
git checkout --orphan master
git rm -rf *

接下来,要在当前正在开发的分支中提交一个PR到这个分支而不出现问题,请执行以下操作:

git checkout development-branch-name
git rebase master
git push -f development-branch-name

现在,您可以在GitHub上将development-branch-name的代码提交到master分支,而不会遇到“没有可比较的内容。无法比较,分支具有完全不同的提交历史记录”的问题。当我在一个正在进行的项目目录中初始化一个仓库并希望通过GitHub UI对该项目目录中的所有代码进行代码审查时,我使用此功能。

1
食谱运行得相当不错,但有几个要注意的地方。首先:git rm -rf * 不会删除像 .gitignore 这样的隐藏文件。其次,在 rm -rf 之后,您必须将某些内容提交到 master。否则,在您检出 development-branch-name 后,新的 master 将消失。 - Alik

3
您可以尝试使用 git checkout master; git reset --hard ${第一个提交的sha值} 命令重置主分支到第一次提交,并且修改第一次提交以删除其中的文件s。
这将使您的主分支保持原始状态,而其他分支不受影响。但由于您正在重写历史记录,所以所有克隆您的存储库的存储库都需要进行修复。

1
如何将本地代码库切换到主分支并删除所有内容,然后将此分支推送到远程分支(origin)?
您是要清空主分支的内容还是将主分支本身删除?

这很有道理。但它会保留历史记录,我也想要清除所有历史记录。 - Marty Wallace
我不确定。也许这些链接可以帮助你:链接1链接2 - Shibbir Ahmed

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