【问题标题】:How can I completely empty the master branch in Git?如何完全清空 Git 中的 master 分支?
【发布时间】:2013-03-05 11:23:58
【问题描述】:

我想彻底清空 Git 中的 master 分支。目前,我还想保留从 master 分支的所有其他分支。

这可能吗?如何实现?

【问题讨论】:

  • 我了解您希望其他分支中的文件不受影响。您是要仅删除 master 分支中的文件还是完全删除分支 master
  • 我想删除master中的所有文件但保留它。仿佛从头开始。没有文件,没有历史。但是,是的,所有其他分支都保持不变。

标签: git git-branch


【解决方案1】:

这其实叫“删除旧的master分支,重新创建新的”

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

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

这将创建一个全新的 master 分支,与您拥有的任何东西无关:

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

但实际上您可以简单地将当前存储库保存到其他地方并创建一个新存储库。

【讨论】:

  • 在移除 master 分支之前,确保至少有一个标签指向当前 master,否则 OP 可能会丢失提交。
  • 另请注意,git checkout --orphan 仅存在于 git 1.7.2 及以上版本中。
  • 如果你创建完全空的master(第二组命令)然后在最后执行git commit --allow-empty -m "empty repo"
  • 但是如果该分支链接到 aws 部署的应用程序会怎样...它会擦除链接到已删除分支的 aws 配置吗??
【解决方案2】:

创建孤立分支

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

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

由于当前分支现在没有历史记录,因此某些命令可能会失败并出现 fatal: bad default revision 'HEAD' 之类的错误,直到您在新的 master 分支上进行第一次提交。这是正常现象,与您在新初始化的存储库中看到的行为相同。

【讨论】:

  • 这是最好的方法。但请注意,--orphan 选项仅在 git 1.7.2 中添加。
  • 这实际上是我认为的最佳答案。建议将 master 重置为初始提交的答案并不完全需要,因为初始提交不一定处于干净状态。
  • 这对我很有用。由于我已经有了我的孤儿,在移动主人后,我检查了我的孤儿,然后从那里创建主人:git checkout my_orphangit checkout -b master
【解决方案3】:

其他答案建议创建一个新的主分支(就像您在空存储库中所做的那样)。但是没有历史的大师不是一个好习惯。这使得使用 rebase 变得很困难,因为你永远不能 rebase 第一次提交。 ma​​ster 在任何存储库上的第一次提交都应该是空的。对此有一个低级的管道解决方案:

使用低级管道命令修复

首先你得到一个空树哈希:

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

然后你使用树哈希创建一个空提交

$ git commit-tree -m "inital commit" 4b825dc642cb6eb9a060e54bf8d69288fbee4904
a5c0737b92e5e5d4502e15b93d7a46d1e17b2b22

最后你将 master 重置为那个提交

$ git reset --hard a5c0737b92e5e5d4502e15b93d7a46d1e17b2b22

它是further described in my blogpost

【讨论】:

    【解决方案4】:

    您可以尝试使用git checkout master; git reset --hard ${sha-of-first-commit} 将主分支重置为第一个提交,然后修改该第一个提交以删除其中的文件。

    这应该给你一个原始的 master 分支,而其他所有的分支都保持不变,但是由于你正在重写历史,所有克隆你的存储库都需要修复。

    【讨论】:

      【解决方案5】:

      这可能是不好的做法,但在果酱中起作用(建立在 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
      

      现在您可以从 development-branch-namemaster 提交 PR,而不会在 GitHub 上遇到 There isn't anything to compare. Nothing to compare, branches are entirely different commit histories 问题。

      当我在当前正在进行的项目目录中初始化一个 repo 并希望通过 GitHub UI 对项目目录中的所有代码进行代码审查时,我会使用它。

      【讨论】:

      • 配方工作得很好,但有几个陷阱。首先:git rm -rf * 不会删除像 .gitignore 这样的隐藏文件。第二:你必须在rm -rf 之后向master 提交一些东西。否则新的master 将在您结帐development-branch-name 后消失。
      【解决方案6】:

      如何检查到本地存储库的主分支并删除所有内容。然后将此分支推送到远程分支(原点)

      你是否删除了主分支的内容或分支本身?

      【讨论】:

      • 这是有道理的。但它保留了历史,不是吗?我也想摆脱所有的历史
      • 我不确定。可能b这个链接可以帮助你:link1link2
      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2012-08-27
      • 2021-06-06
      • 1970-01-01
      • 2019-06-06
      • 2012-05-22
      相关资源
      最近更新 更多