【问题标题】:Git: create a new branch from a commit, delete everythng elseGit:从提交中创建一个新分支,删除其他所有内容
【发布时间】:2014-07-21 08:33:13
【问题描述】:

我到底应该怎么做

  • 从某个提交创建一个新分支(git checkout -b new_one; git cherry-pick commit_id,对吗?)
  • 删除其他所有内容
  • 将分支new_one 重命名为master

当然,任何更改也应该推送到远程。

谢谢。

【问题讨论】:

  • 我认为您需要在这里解释您要达到的目标。您想将 master 重置为某个已知提交吗?
  • 我想获得一个新的只有一次提交的新主人(这是旧主人的commit_id)

标签: git git-branch


【解决方案1】:

为了获得一个只持有一次提交的新master,最简单的方法是创建一个新的repo,然后将master的当前状态作为初始状态放入其中。否则,您将始终拥有 master 的历史记录:

  1. 导出master的当前状态(见https://stackoverflow.com/a/163769/520162
    git archive --format zip --output /full/path/to/zipfile.zip master
  2. 解压缩创建的 zip 文件,您的新存储库将出现在其中
  3. 在该目录中初始化一个新的存储库:
    git init .
  4. 创建您的初始提交:
    git add . && git commit -m "initial"
  5. 分配您的remote:
    git remote add ...
  6. master的新状态推送到那里:
    git push -f origin master:master

然后,您的 repo 将只有一个分支 (master),只有一个提交。

【讨论】:

    【解决方案2】:

    创建new_branch,从commit_id开始:

    git branch new_branch commit_id
    

    检查一下:

    git checkout new_branch
    

    删除旧的master 分支:

    git branch -d master   # you may need to use -D, with history loss may occur
    

    new_branch 重命名为master

    git branch -m new_branch master
    

    请注意,这并不一定会删除所有历史记录 - 即使您执行完整的垃圾回收,commit_id 所指的任何对象都将保留在 git 历史记录(和 git 对象存储)中。

    【讨论】:

    • 但这实际上是我的问题的重点:删除历史记录:)。
    【解决方案3】:

    我会尝试这样的:

    git branch tmp <the very first commit in the repo>
    git checkout tmp
    git merge --squash <commit_id>
    git branch -d master
    git branch -m tmp master
    

    ...然后是强制推送

    【讨论】:

    • 首先,你显然需要在第一步之后git checkout tmp。其次,这些命令仍然会为您留下一个带有唯一提交的 repo,这是第一次提交。这不是我要问的(是的,您仍然可以重新添加、提交和推送实际文件,但我认为应该有更简单的方法,不是吗?)
    • 是的,您确实需要结帐 tmp。我修好了。 Merge --squash 会将 合并到 tmp 并在 tmp 上创建一个包含 中所有内容的提交。
    猜你喜欢
    • 2020-01-07
    • 2015-02-13
    • 1970-01-01
    • 2021-08-02
    • 2020-10-18
    • 1970-01-01
    • 2022-10-15
    • 2010-12-15
    相关资源
    最近更新 更多